<?php

namespace App\Packages\v4\Capsule\Services;

use App\Packages\Capsule\Models\Capsule;
use App\Packages\Capsule\Models\CapsuleVideo;

/**
 * Class DemoUserImageFactoryService
 * @package App\Packages\Capsule\Services
 */
class DemoUserImageFactoryService
{
    /** @var CapsuleImageUploadService */
    private $uploadService;

    /** @var ImageResizeService */
    private $resizeService;

    /** @var PreviewFactoryService */
    private $previewFactoryService;

    public function __construct(
        CapsuleImageUploadService $uploadService,
        ImageResizeService $resizeService,
        PreviewFactoryService $previewFactoryService
    ) {
        $this->uploadService = $uploadService;
        $this->resizeService = $resizeService;
        $this->previewFactoryService = $previewFactoryService;
    }

    public function uploadVideo(Capsule $capsule, $video_path)
    {
        $file = \Storage::disk('local')->get($video_path);

        $video = $this->factoryVideoAndUpload($file);

        $capsule->video_id = $video->id;

        $capsule->save();

        return $capsule;
    }

    public function uploadImage(Capsule $capsule, $preview_path, $width, $height)
    {
        $file = \Storage::disk('local')->get($preview_path);
        $size = \Storage::disk('local')->size($preview_path);

        $preview = $this->factoryImageAndUpload($file, $width, $height, $size);
        $capsule->preview_id = $preview->id;

        $capsuleThumb = $this->factoryThumbAndUpload($preview->fileContent);
        $capsule->thumbnail_id = $capsuleThumb->id;

        $capsule->save();

        return $capsule;
    }

    public function factoryVideoAndUpload($file)
    {
        $videoData = CapsuleVideo::createFileData();

        $this->uploadService->uploadVideo($videoData, $file);

        return $videoData;
    }

    public function factoryImageAndUpload($file, $width, $height, $size)
    {
        $resizeFile = $this->resizeService->resizeToOriginal($file, $width, $height);

        $capsuleImage = $this->previewFactoryService->createFileData($resizeFile, $width, $height, $size);

        $this->uploadService->uploadPreview($capsuleImage, $resizeFile);

        return $capsuleImage;
    }

    public function factoryThumbAndUpload($fileContent)
    {
        $thumbResult = $this->resizeService->resizeToThumb($fileContent);
        $capsuleThumb = $this->previewFactoryService->creteThumbData($thumbResult);

        $this->uploadService->uploadPreviewThumbnail($capsuleThumb, $thumbResult);

        return $capsuleThumb;
    }



}
