<?php

namespace App\Jobs;

use App\Contracts\CreativeBriefResolver;
use App\Contracts\ImageCreativeGenerator;
use App\DTOs\CreativeBrief;
use App\Models\Creative;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Queue\Queueable;
use Throwable;

class GenerateImageCreativeJob implements ShouldQueue
{
    use Queueable;

    public function __construct(public int $creativeId) {}

    public function handle(CreativeBriefResolver $briefResolver, ImageCreativeGenerator $generator): void
    {
        $creative = Creative::findOrFail($this->creativeId);

        if ($creative->status === 'completed') {
            return; // already generated; safe to retry without duplicating work
        }

        $creative->update(['status' => 'generating']);

        try {
            if ($creative->brief) {
                $brief = CreativeBrief::fromArray($creative->brief);
            } else {
                $brief = match ($creative->source) {
                    'product_url' => $briefResolver->fromProductUrl($creative->product_url),
                    default => $briefResolver->fromPrompt($creative->prompt),
                };

                $creative->update(['brief' => $brief->toArray()]);
            }

            $creative->update(['status' => 'processing']);

            $path = $generator->generate($brief, $creative->ratio, $creative->style);

            $creative->update([
                'status' => 'completed',
                'asset_path' => $path,
                'failure_reason' => null,
            ]);
        } catch (Throwable $e) {
            $creative->update([
                'status' => 'failed',
                'failure_reason' => $e->getMessage(),
            ]);

            throw $e;
        }
    }
}
