<?php

namespace Autogedal\FbReviews\Model;

use Amasty\Base\Model\Serializer;
use Autogedal\FbReviews\Model\ImageUpload;
use Magento\Framework\App\Filesystem\DirectoryList;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Filesystem;
use Magento\Framework\Filesystem\Directory\WriteInterface;
use Magento\Framework\UrlInterface;
use Magento\Store\Model\StoreManagerInterface;

class ImageProcessor
{
    public const REVIEWS_MEDIA_PATH = 'fbreview/images';
    public const REVIEWS_MEDIA_TMP_PATH = 'fbreview/images/tmp';

    /**
     * @var WriteInterface
     */
    private $mediaDirectory;

    /**
     * @var ImageUpload
     */
    private $imageUploader;

    /**
     * @var StoreManagerInterface
     */
    private $storeManager;

    public function __construct(
        Filesystem $filesystem,
        Serializer $serializer, //@deprecated backward compatibility
        ImageUpload $imageUploader,
        StoreManagerInterface $storeManager
    ) {
        $this->mediaDirectory = $filesystem->getDirectoryWrite(DirectoryList::MEDIA);
        $this->imageUploader = $imageUploader;
        $this->storeManager = $storeManager;
    }

    public function getReviewImageUrl(string $imageName): string
    {
        return rtrim($this->getReviewsMedia($imageName), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . $imageName;
    }

    public function moveFileFromTmp(string $imageName): string
    {
        return $this->imageUploader->moveFileFromTmp($imageName);
    }

    public function copyFile(string $imageName): string
    {
        try {
            return $this->imageUploader->duplicateFile($imageName);
        } catch (LocalizedException $exception) {
            // file already was duplicated
            return $imageName;
        }
    }

    public function deleteImage(string $image): void
    {
        if ($image) {
            $this->mediaDirectory->delete(
                $this->getReviewsRelativePath($image)
            );
        }
    }

    private function getReviewsRelativePath(string $name): string
    {
        return self::REVIEWS_MEDIA_PATH . DIRECTORY_SEPARATOR . $name;
    }

    private function getReviewsMedia(string $imageName): string
    {
        $reviewMedia = $this->storeManager
            ->getStore()
            ->getBaseUrl(UrlInterface::URL_TYPE_MEDIA);
        if (strpos($imageName, self::REVIEWS_MEDIA_PATH) === false) {
            $reviewMedia .= self::REVIEWS_MEDIA_PATH;
        }

        return $reviewMedia;
    }
}
