<?php

namespace App\Packages\User\Manager;

use App\Packages\Capsule\Models\Capsule;
use App\Packages\Capsule\Services\CapsuleFactoryService;
use App\Packages\Capsule\Services\DemoUserImageFactoryService;
use App\Packages\Friend\Models\FriendRelation;
use App\Packages\User\Models\User;
use App\Packages\User\Models\UserAvatar;
use App\Packages\User\Service\UserImageResizeService;
use App\Packages\User\Service\UserImageUploadService;
use Carbon\Carbon;
use Ramsey\Uuid\Uuid;
use Storage;

class DemoUserManager {

    const UserID = 0;
    const CapsuleAddressID = 'ChIJjUgRaq7P7kYRTO_IrF0Z3Rs';
    const UserAvatar = 'def_user/avatar/default_user_avatar.png';

    const PublicVideo = 'def_user/video/public_video.mp4';
    const PublicPreview = 'def_user/preview/public_preview.png';
    const PublicPreviewWidth = 1280;
    const PublicPreviewHeight = 720;

    const PrivateVideo = 'def_user/video/private_video.mp4';
    const PrivatePreview = 'def_user/preview/private_preview.png';
    const PrivatePreviewWidth = 1280;
    const PrivatePreviewHeight = 720;

    public static function makeFriend($user)
    {
        /** @var User $timecap_user */
        $timecap_user = User::query()->find(self::UserID);

        if ( ! $timecap_user ) return false;

        FriendRelation::createFriend($timecap_user, $user);

        $timecap_user->refreshFriendCount();
        $user->refreshFriendCount();
    }

    public static function createExamplePrivateCapsule()
    {
        set_time_limit(180);
        ini_set('memory_limit', '712M');

        $open_time = new Carbon('now');
        $open_time->addHours(24);

        /** @var User $timecap_user */
        $timecap_user = User::query()->find(static::UserID);

        /** @var CapsuleFactoryService $createService */
        $createService = app()->make(CapsuleFactoryService::class);
        $capsule = $createService->startCreate($timecap_user);

        /** @var CapsuleFactoryService $createService */
        $createService = app()->make(CapsuleFactoryService::class);
        $createService->completeCreateForDemo($capsule, [
            'caption' => 'Timecaps user private capsule',
            'is_private' => true,
            'open_at' => $open_time->format('Y-m-d H:i:s'),
            //'location_id' => static::CapsuleAddressID,
            'file_name' => 'private_capsule'
        ]);

        /** @var DemoUserImageFactoryService $uploadService */
        $uploadService = app()->make(DemoUserImageFactoryService::class);
        $uploadService->uploadVideo($capsule, static::PrivateVideo);

        $uploadService->uploadImage(
            $capsule,
            static::PrivatePreview,
            static::PrivatePreviewWidth,
            static::PrivatePreviewHeight
        );
    }

    public static function createPublicCapsule()
    {
        set_time_limit(180);
        ini_set('memory_limit', '712M');

        $open_time = new Carbon('now');

        /** @var User $timecap_user */
        $timecap_user = User::query()->find(static::UserID);

        /** @var CapsuleFactoryService $createService */
        $createService = app()->make(CapsuleFactoryService::class);
        $capsule = $createService->startCreate($timecap_user);

        /** @var CapsuleFactoryService $createService */
        $createService = app()->make(CapsuleFactoryService::class);
        $createService->completeCreateForDemo($capsule, [
            'caption' => 'Timecaps user public capsule',
            'is_private' => false,
            'open_at' => $open_time->format('Y-m-d H:i:s'),
            //'location_id' => static::CapsuleAddressID,
            'file_name' => 'public_capsule'
        ]);

        /** @var DemoUserImageFactoryService $uploadService */
        $uploadService = app()->make(DemoUserImageFactoryService::class);
        $uploadService->uploadVideo($capsule, static::PublicVideo);

        $uploadService->uploadImage(
            $capsule,
            static::PublicPreview,
            static::PublicPreviewWidth,
            static::PublicPreviewHeight
        );
    }

    public static function createPrivateCapsule($user)
    {
        /** @var User $timecap_user */
        $timecap_user = User::query()->find(self::UserID);

        if ( ! $timecap_user ) return false;

        $open_time = new Carbon('now');
        $open_time->addHours(24);

        /** $capsule extend old capsule */
        $example_capsule = Capsule::query()->where('user_id', static::UserID)
            ->orderBy('created_at', 'ASC')
            ->first();

        /** @var Capsule $capsule */
        $capsule = $example_capsule->replicate();

        $capsule->caption = 'Timecaps user private capsule';
        $capsule->is_private = true;
        $capsule->open_at = $open_time->format('Y-m-d H:i:s');
        $capsule->status = Capsule::STATUS_LOCKED;
        $capsule->save();

        /** @var CapsuleFactoryService $createService */
        $createService = app()->make(CapsuleFactoryService::class);
        $createService->bindTaggedUsersToCapsules($capsule, [$user->phone_hash]);
    }

    public static function createUser()
    {
        /** Create avatar */
        $fileContent = Storage::disk('local')->get(static::UserAvatar);

        $imageResize = app()->make(UserImageResizeService::class);
        $avatarResult = $imageResize->resizeToAvatar($fileContent);

        $userAvatar = UserAvatar::createFileData(
            md5($avatarResult),
            UserImageResizeService::IMAGE_EXT,
            UserImageResizeService::IMAGE_MIME,
            Storage::disk('local')->size(static::UserAvatar),
            UserImageResizeService::AVATAR_WIDTH,
            UserImageResizeService::AVATAR_HEIGHT
        );

        $uploadService = app()->make(UserImageUploadService::class);
        $uploadService->uploadAvatar($userAvatar, $avatarResult);

        /** Create user */
        \DB::table('table_user')->insert([
            'id' => static::UserID,
            'uuid' => Uuid::uuid4(),
            'first_name' => 'timecaps',
            'last_name' => 'timecaps',
            'password' => '',
            'email' => '',
            'phone_code' => '999',
            'phone_number' => '99999999',
            'phone_hash' => '473a9b0f3477d9422fe57bfae5cdf290',
            'nickname' => 'timecaps',
            'is_registered' => true,
            'is_active' => true,
            'avatar_id' => $userAvatar->id,
            'is_verified' => true,
            'is_system_user' => true,
            'is_on_boarding_done' => true,
        ]);
    }

}