<?php

namespace App\Modifiers;

use Imagick;
use Illuminate\Support\Facades\Storage;
use App\Models\ToolStats;

class Converter
{
    public function make($fileName, $type): array
    {
        $fileNameArr = explode(".", $fileName);

        if ($fileNameArr[1] != $type) {
            $filePath = Storage::disk('temp')
                ->path($fileName);
            $fileTargetPath = Storage::disk('temp')
                ->path("{$fileNameArr[0]}.{$type}");

            $convert = method_exists($this, $type)
                ? $this->$type($filePath, $fileTargetPath)
                : false;
    
            if ($convert) {

                Storage::disk('temp')
                    ->delete($fileName);

                $toolStats = new ToolStats();
                $toolStats->processNew('convert');

                return [
                    true,
                    "{$fileNameArr[0]}.{$type}"
                ];
            }

            return [
                false,
                __('lang.file_convert_error')
            ];
        }

        return [
            true,
            "{$fileNameArr[0]}.{$type}"
        ];

    }

    private function apng(
        string $filePath, 
        string $fileTargetPath
    ): array {
        try {
            $imagick = new Imagick($filePath);

            $format = 'apng';
            $compression = Imagick::COMPRESSION_ZIP;
            
            $imagick->setBackgroundColor(new \ImagickPixel('transparent'));

            $imagick->setFormat($format);
            $imagick->setImageFormat($format);
    
            $imagick->setCompression($compression);
            $imagick->setImageCompression($compression);

            $imagick->writeImage($fileTargetPath);

            $imagick->clear();
            $imagick->destroy();

            return [
                true
            ];

        } catch (\ImagickException $e) {

            return [
                false, 
                $e->getMessage()
            ];
        }
    }

    private function avif(
        string $filePath, 
        string $fileTargetPath
    ): array {
        try {
            $imagick = new Imagick($filePath);

            $format = 'avif';
            $compression = Imagick::COMPRESSION_NO;

            $imagick->setFormat($format);
            $imagick->setImageFormat($format);

            $imagick->setCompression($compression);
            $imagick->setImageCompression($compression);

            $imagick->setCompressionQuality(100);
            $imagick->setImageCompressionQuality(100);

            $imagick->writeImage($fileTargetPath);

            $imagick->clear();
            $imagick->destroy();

            return [
                true
            ];

        } catch (\ImagickException $e) {

            return [
                false, 
                $e->getMessage()
            ];
        }
    }

    private function bmp(
        string $filePath, 
        string $fileTargetPath
    ): array {
        try {
            $imagick = new Imagick($filePath);

            $format = 'bmp';
            $compression = Imagick::COMPRESSION_NO;

            $imagick->setFormat($format);
            $imagick->setImageFormat($format);

            $imagick->setCompression($compression);
            $imagick->setImageCompression($compression);

            $imagick->writeImage($fileTargetPath);

            $imagick->clear();
            $imagick->destroy();

            return [
                true
            ];

        } catch (\ImagickException $e) {

            return [
                false, 
                $e->getMessage()
            ];
        }
    }

    private function cur(
        string $filePath, 
        string $fileTargetPath
    ): array {
        try {
            $imagick = new Imagick($filePath);

            $format = 'cur';
            $compression = Imagick::COMPRESSION_NO;

            $imagick->setFormat($format);
            $imagick->setImageFormat($format);

            $imagick->setCompression($compression);
            $imagick->setImageCompression($compression);

            $imagick->writeImage($fileTargetPath);

            $imagick->clear();
            $imagick->destroy();

            return [
                true
            ];

        } catch (\ImagickException $e) {

            return [
                false, 
                $e->getMessage()
            ];
        }
    }

    private function dds(
        string $filePath, 
        string $fileTargetPath
    ): array {
        try {
            $imagick = new Imagick($filePath);

            $format = 'dds';
            $compression = Imagick::COMPRESSION_DXT1;
    
            $imagick->setFormat($format);
            $imagick->setImageFormat($format);

            $imagick->setCompression($compression);
            $imagick->setImageCompression($compression);

            $imagick->writeImage($fileTargetPath);

            $imagick->clear();
            $imagick->destroy();

            return [
                true
            ];

        } catch (\ImagickException $e) {

            return [
                false, 
                $e->getMessage()
            ];
        }
    }

    private function dib(
        string $filePath, 
        string $fileTargetPath
    ): array {
        try {
            $imagick = new Imagick($filePath);

            $format = 'dib';
            $compression = Imagick::COMPRESSION_NO;
    
            $imagick->setFormat($format);
            $imagick->setImageFormat($format);

            $imagick->setCompression($compression);
            $imagick->setImageCompression($compression);
    
            $imagick->writeImage($fileTargetPath);

            $imagick->clear();
            $imagick->destroy();

            return [
                true
            ];

        } catch (\ImagickException $e) {

            return [
                false, 
                $e->getMessage()
            ];
        }
    }

    private function eps(
        string $filePath, 
        string $fileTargetPath
    ): array {
        try {
            $imagick = new Imagick($filePath);

            $format = 'eps';
            $compression = Imagick::COMPRESSION_ZIP;
    
            $imagick->setFormat($format);
            $imagick->setImageFormat($format);

            $imagick->setCompression($compression);
            $imagick->setImageCompression($compression);
    
            $imagick->writeImage($fileTargetPath);

            $imagick->clear();
            $imagick->destroy();

            return [
                true
            ];

        } catch (\ImagickException $e) {

            return [
                false, 
                $e->getMessage()
            ];
        }
    }

    private function gif(
        string $filePath, 
        string $fileTargetPath
    ): array {
        try {
            $imagick = new Imagick($filePath);

            $format = 'gif';
            $compression = Imagick::COMPRESSION_LZW;
    
            $imagick->setBackgroundColor(new \ImagickPixel('transparent'));

            $imagick->setFormat($format);
            $imagick->setImageFormat($format);

            $imagick->setCompression($compression);
            $imagick->setImageCompression($compression);
    
            $imagick->writeImage($fileTargetPath);

            $imagick->clear();
            $imagick->destroy();

            return [
                true
            ];

        } catch (\ImagickException $e) {

            return [
                false, 
                $e->getMessage()
            ];
        }
    }

    private function hdr(
        string $filePath, 
        string $fileTargetPath
    ): array {
        try {
            $imagick = new Imagick($filePath);

            $format = 'hdr';
            $compression = Imagick::COMPRESSION_UNDEFINED;
    
            $imagick->setFormat($format);
            $imagick->setImageFormat($format);

            $imagick->setCompression($compression);
            $imagick->setImageCompression($compression);
    
            $imagick->writeImage($fileTargetPath);

            $imagick->clear();
            $imagick->destroy();

            return [
                true
            ];

        } catch (\ImagickException $e) {

            return [
                false, 
                $e->getMessage()
            ];
        }
    }

    private function heic(
        string $filePath, 
        string $fileTargetPath
    ): array {
        try {
            $imagick = new Imagick($filePath);

            $format = 'heic';
            $compression = Imagick::COMPRESSION_NO;
    
            $imagick->setFormat($format);
            $imagick->setImageFormat($format);

            $imagick->setCompression($compression);
            $imagick->setImageCompression($compression);

            $imagick->setCompressionQuality(100);
            $imagick->setImageCompressionQuality(100);
    
            $imagick->writeImage($fileTargetPath);

            $imagick->clear();
            $imagick->destroy();

            return [
                true
            ];

        } catch (\ImagickException $e) {

            return [
                false, 
                $e->getMessage()
            ];
        }
    }

    private function ico(
        string $filePath, 
        string $fileTargetPath
    ): array {
        try {
            $imagick = new Imagick($filePath);

            $format = 'ico';
            $compression = Imagick::COMPRESSION_UNDEFINED;
    
            $imagick->setBackgroundColor(new \ImagickPixel('transparent'));

            // Changes the size of image
            $imagick->thumbnailImage(256, 256, true);

            $imagick->setFormat($format);
            $imagick->setImageFormat($format);

            $imagick->setCompression($compression);
            $imagick->setImageCompression($compression);
    
            $imagick->writeImage($fileTargetPath);

            $imagick->clear();
            $imagick->destroy();

            return [
                true
            ];

        } catch (\ImagickException $e) {

            return [
                false, 
                $e->getMessage()
            ];
        }
    }

    private function jp2(
        string $filePath, 
        string $fileTargetPath
    ): array {
        try {
            $imagick = new Imagick($filePath);

            $format = 'jp2';
            $compression = Imagick::COMPRESSION_JPEG2000;
    
            $imagick->setFormat($format);
            $imagick->setImageFormat($format);

            $imagick->setCompression($compression);
            $imagick->setImageCompression($compression);

            $imagick->setCompressionQuality(100);
            $imagick->setImageCompressionQuality(100);
    
            $imagick->writeImage($fileTargetPath);

            $imagick->clear();
            $imagick->destroy();

            return [
                true
            ];

        } catch (\ImagickException $e) {

            return [
                false, 
                $e->getMessage()
            ];
        }
    }

    private function jpe(
        string $filePath, 
        string $fileTargetPath
    ): array {
        try {
            $imagick = new Imagick($filePath);

            $format = 'jpe';
            $compression = Imagick::COMPRESSION_JPEG;
    
            $imagick->setFormat($format);
            $imagick->setImageFormat($format);

            $imagick->setCompression($compression);
            $imagick->setImageCompression($compression);

            $imagick->setCompressionQuality(100);
            $imagick->setImageCompressionQuality(100);
    
            $imagick->writeImage($fileTargetPath);

            $imagick->clear();
            $imagick->destroy();

            return [
                true
            ];

        } catch (\ImagickException $e) {

            return [
                false, 
                $e->getMessage()
            ];
        }
    }

    private function jpeg(
        string $filePath, 
        string $fileTargetPath
    ): array {
        try {
            $imagick = new Imagick($filePath);

            $format = 'jpeg';
            $compression = Imagick::COMPRESSION_JPEG;

            $imagick->setFormat($format);
            $imagick->setImageFormat($format);

            $imagick->setCompression($compression);
            $imagick->setImageCompression($compression);

            $imagick->setCompressionQuality(100);
            $imagick->setImageCompressionQuality(100);

            $imagick->writeImage($fileTargetPath);

            $imagick->clear();
            $imagick->destroy();

            return [
                true
            ];

        } catch (\ImagickException $e) {

            return [
                false, 
                $e->getMessage()
            ];
        }
    }

    private function jpg(
        string $filePath, 
        string $fileTargetPath
    ): array {
        try {
            $imagick = new Imagick($filePath);

            $format = 'jpg';
            $compression = Imagick::COMPRESSION_JPEG;

            $imagick->setFormat($format);
            $imagick->setImageFormat($format);

            $imagick->setCompression($compression);
            $imagick->setImageCompression($compression);

            $imagick->setCompressionQuality(100);
            $imagick->setImageCompressionQuality(100);

            $imagick->writeImage($fileTargetPath);

            $imagick->clear();
            $imagick->destroy();

            return [
                true
            ];

        } catch (\ImagickException $e) {

            return [
                false, 
                $e->getMessage()
            ];
        }
    }

    private function pdf(
        string $filePath, 
        string $fileTargetPath
    ): array {
        try {
            $imagick = new Imagick($filePath);

            $format = 'pdf';
            $compression = Imagick::COMPRESSION_JPEG;

            $imagick->setFormat($format);
            $imagick->setImageFormat($format);

            $imagick->setCompression($compression);
            $imagick->setImageCompression($compression);

            $imagick->setCompressionQuality(100);
            $imagick->setImageCompressionQuality(100);

            $imagick->writeImage($fileTargetPath);

            $imagick->clear();
            $imagick->destroy();

            return [
                true
            ];

        } catch (\ImagickException $e) {

            return [
                false, 
                $e->getMessage()
            ];
        }
    }

    private function png(
        string $filePath, 
        string $fileTargetPath
    ): array {
        try {
            $imagick = new Imagick($filePath);

            $format = 'png';
            $compression = Imagick::COMPRESSION_ZIP;

            $imagick->setBackgroundColor(new \ImagickPixel('transparent'));

            $imagick->setFormat($format);
            $imagick->setImageFormat($format);

            $imagick->setCompression($compression);
            $imagick->setImageCompression($compression);

            $imagick->writeImage($fileTargetPath);

            $imagick->clear();
            $imagick->destroy();

            return [
                true
            ];

        } catch (\ImagickException $e) {

            return [
                false, 
                $e->getMessage()
            ];
        }
    }

    private function ppm(
        string $filePath, 
        string $fileTargetPath
    ): array {
        try {
            $imagick = new Imagick($filePath);

            $format = 'ppm';
            $compression = Imagick::COMPRESSION_UNDEFINED;

            $imagick->setFormat($format);
            $imagick->setImageFormat($format);

            $imagick->setCompression($compression);
            $imagick->setImageCompression($compression);

            $imagick->writeImage($fileTargetPath);

            $imagick->clear();
            $imagick->destroy();

            return [
                true
            ];

        } catch (\ImagickException $e) {

            return [
                false, 
                $e->getMessage()
            ];
        }
    }

    private function psd(
        string $filePath, 
        string $fileTargetPath
    ): array {
        try {
            $imagick = new Imagick($filePath);

            $format = 'psd';
            $compression = Imagick::COMPRESSION_UNDEFINED;

            $imagick->setFormat($format);
            $imagick->setImageFormat($format);

            $imagick->setCompression($compression);
            $imagick->setImageCompression($compression);

            $imagick->writeImage($fileTargetPath);

            $imagick->clear();
            $imagick->destroy();

            return [
                true
            ];

        } catch (\ImagickException $e) {

            return [
                false, 
                $e->getMessage()
            ];
        }
    }

    private function raw(
        string $filePath, 
        string $fileTargetPath
    ): array {
        try {
            $imagick = new Imagick($filePath);

            $format = 'raw';
            $compression = Imagick::COMPRESSION_NO;
    
            $imagick->setFormat($format);
            $imagick->setImageFormat($format);

            // Set the image depth
            $imagick->setImageDepth(16);

            $imagick->setCompression($compression);
            $imagick->setImageCompression($compression);

            $imagick->writeImage($fileTargetPath);

            $imagick->clear();
            $imagick->destroy();

            return [
                true
            ];

        } catch (\ImagickException $e) {

            return [
                false, 
                $e->getMessage()
            ];
        }
    }

    private function svg(
        string $filePath, 
        string $fileTargetPath
    ): array {
        try {
            $imagick = new Imagick($filePath);

            $format = 'svg';

            $imagick->setFormat($format);
            $imagick->setImageFormat($format);

            $imagick->writeImage($fileTargetPath);

            $imagick->clear();
            $imagick->destroy();

            return [
                true
            ];

        } catch (\ImagickException $e) {

            return [
                false, 
                $e->getMessage()
            ];
        }
    }

    private function tga(
        string $filePath, 
        string $fileTargetPath
    ): array {
        try {
            $imagick = new Imagick($filePath);

            $format = 'tga';
            $compression = Imagick::COMPRESSION_UNDEFINED;
            $orientation = Imagick::ORIENTATION_TOPLEFT;

            $imagick->setFormat($format);
            $imagick->setImageFormat($format);

            $imagick->setCompression($compression);
            $imagick->setImageCompression($compression);

            // Set the image orientation
            $imagick->setImageOrientation($orientation);

            $imagick->writeImage($fileTargetPath);

            $imagick->clear();
            $imagick->destroy();

            return [
                true
            ];

        } catch (\ImagickException $e) {

            return [
                false, 
                $e->getMessage()
            ];
        }
    }

    private function tiff(
        string $filePath, 
        string $fileTargetPath
    ): array {
        try {
            $imagick = new Imagick($filePath);

            $format = 'tiff';
            $compression = Imagick::COMPRESSION_LZW;
    
            $imagick->setBackgroundColor(new \ImagickPixel('transparent'));

            $imagick->setFormat($format);
            $imagick->setImageFormat($format);

            $imagick->setCompression($compression);
            $imagick->setImageCompression($compression);

            $imagick->writeImage($fileTargetPath);

            $imagick->clear();
            $imagick->destroy();

            return [
                true
            ];

        } catch (\ImagickException $e) {

            return [
                false, 
                $e->getMessage()
            ];
        }
    }

    private function wbmp(
        string $filePath, 
        string $fileTargetPath
    ): array {
        try {
            $imagick = new Imagick($filePath);

            $format = 'wbmp';
            $compression = Imagick::COMPRESSION_NO;
    
            $imagick->setFormat($format);
            $imagick->setImageFormat($format);

            $imagick->setCompression($compression);
            $imagick->setImageCompression($compression);

            $imagick->writeImage($fileTargetPath);

            $imagick->clear();
            $imagick->destroy();

            return [
                true
            ];

        } catch (\ImagickException $e) {

            return [
                false, 
                $e->getMessage()
            ];
        }
    }

    private function webp(
        string $filePath, 
        string $fileTargetPath
    ): array {
        try {
            $imagick = new Imagick($filePath);

            $format = 'webp';
            $compression = Imagick::COMPRESSION_JPEG;
            $merger = Imagick::LAYERMETHOD_MERGE;
        
            $imagick->setImageBackgroundColor(new \ImagickPixel('transparent'));
            $imagick->mergeImageLayers($merger);
        
            $imagick->setFormat($format);
            $imagick->setImageFormat($format);
        
            $imagick->setCompression($compression);
            $imagick->setImageCompression($compression);
        
            $imagick->setCompressionQuality(100);
            $imagick->setImageCompressionQuality(100);
        
            $imagick->writeImage($fileTargetPath);
        
            $imagick->clear();
            $imagick->destroy();

            return [
                true
            ];

        } catch (\ImagickException $e) {

            return [
                false, 
                $e->getMessage()
            ];
        }
    }

}