<?php

namespace App\Packages\Capsule\Services;

use App\Packages\Capsule\Models\Capsule;
use App\Packages\Capsule\Models\CapsulePreview;
use App\PackagesApi\v3\Requests\Capsule\UploadPreviewRequest;
use Illuminate\Http\UploadedFile;

/**
 * Class CapsuleCreateService
 * @package App\Packages\Capsule\Services
 */
class ImageFactoryService
{
    /** @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;
    }
    /**
     * @param Capsule $capsule
     * @param UploadPreviewRequest $imageRequest
     *
     * @return Capsule
     */
    public function uploadAllImages(Capsule $capsule, UploadPreviewRequest $imageRequest)
    {
        $preview = $this->factoryImageAndUpload($imageRequest->preview, $imageRequest->width, $imageRequest->height);
        $capsule->preview_id = $preview->id;

        if ($imageRequest->cropped) {
            $preview = $this->factoryImageAndUpload($imageRequest->cropped, $imageRequest->cropped_width, $imageRequest->cropped_height);
            $capsule->cropped_id = $preview->id;
        }

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

        $capsule->save();

        return $capsule;
    }

    public function removeAllImages(Capsule $capsule)
    {
        $preview = $capsule->preview;
        $cropped = $capsule->cropped;
        $thumbnail = $capsule->thumbnail;

        /** @TODO: remove images on amazone */

        if ( $preview ) $preview->delete();
        if ( $cropped ) $cropped->delete();
        if ( $thumbnail ) $thumbnail->delete();

        return $capsule;
    }


    /**
     * @param UploadedFile $file
     * @param float $width
     * @param float $height
     *
     * @return CapsulePreview
     */
    public function factoryImageAndUpload($file, $width, $height)
    {
        $fileContent = file_get_contents($file);
        $resizeFile = $this->resizeService->resizeToOriginal($fileContent, $width, $height);

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

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

        return $capsuleImage;
    }

    /**
     * @param string $fileContent
     *
     * @return CapsulePreview
     */
    public function factoryThumbAndUpload($fileContent)
    {
        $thumbResult = $this->resizeService->resizeToThumb($fileContent);
        $capsuleThumb = $this->previewFactoryService->creteThumbData($thumbResult);

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

        return $capsuleThumb;
    }



}
