<?php

namespace App\Actions;

use App\Enums\ImageConversion;
use App\Models\Truck;
use Illuminate\Support\Facades\Storage;
use Intervention\Image\Drivers\Gd\Driver;
use Intervention\Image\ImageManager;
use Lorisleiva\Actions\Concerns\AsAction;

class ProcessImage
{
    use AsAction;

    public function handle(Truck $truck, array $image): void
    {
        if (! $truck->media()->where('original_url', $image['url'])->first()) {
            $storagePath = $truck->license_plate
                ? 'trucks/'.$truck->license_plate.'/'.basename($image['url'])
                : 'trucks/'.basename($image['url']);

            Storage::disk('public')->put($storagePath, file_get_contents($image['url']));

            $media = $truck->media()->updateOrCreate(
                [
                    'name' => basename($image['url']),
                    'path' => $storagePath,
                    'conversion_type' => ImageConversion::ORIGINAL,
                ],
                [
                    'name' => basename($image['url']),
                    'path' => $storagePath,
                    'original_url' => $image['url'],
                ]
            );

            $storagePath = $media->path;

            if (! Storage::disk('public')->exists($storagePath)) {
                return;
            }

            $mediumPath = str_replace($media->name, 'medium-'.$media->name, $storagePath);

            $manager = new ImageManager(new Driver());

            $image = $manager->read(Storage::disk('public')->get($storagePath));
            $image->scale(width: 512);
            $image->save(Storage::disk('public')->path($mediumPath), 60);

            $truck->media()->updateOrCreate(
                [
                    'name' => $media->name,
                    'path' => $mediumPath,
                    'conversion_type' => ImageConversion::MEDIUM->value,
                ],
                [
                    'name' => $media->name,
                    'path' => $mediumPath,
                    'original_url' => $media->original_url,
                ]
            );
        }
    }
}
