<?php

namespace App\Services;

use App\Values\ImageWritingConfig;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Str;
use Intervention\Image\FileExtension;
use Intervention\Image\Interfaces\ImageManagerInterface;
use Intervention\Image\Laravel\Facades\Image;
use RuntimeException;

class ImageWriter
{
    private FileExtension $extension;

    public function __construct()
    {
        $this->extension = self::getExtension();
    }

    private static function getExtension(): FileExtension
    {
        /** @var ImageManagerInterface $manager */
        $manager = Image::getFacadeRoot();

        // Prioritize AVIF over WEBP over JPEG.
        foreach ([FileExtension::AVIF, FileExtension::WEBP, FileExtension::JPEG] as $extension) {
            if ($manager->driver()->supports($extension)) {
                return $extension;
            }
        }

        throw new RuntimeException('No supported image extension found.');
    }

    public function write(string $destination, mixed $source, ?ImageWritingConfig $config = null): void
    {
        $config ??= ImageWritingConfig::default();

        $img = Image::read(Str::isUrl($source) ? Http::get($source)->body() : $source)
            ->scale(width: $config->maxWidth);

        if ($config->blur) {
            $img->blur($config->blur);
        }

        $img->save($destination, $config->quality, $this->extension);
    }
}