<?php

namespace App\Jobs;

use App\Contracts\AdCopyGenerator;
use App\Contracts\CreativeBriefResolver;
use App\DTOs\CreativeBrief;
use App\Models\AdCopy;
use App\Models\Creative;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Queue\Queueable;

class GenerateAdCopyJob implements ShouldQueue
{
    use Queueable;

    public function __construct(
        public int $userId,
        public ?int $creativeId,
        public ?string $productUrl,
        public ?string $prompt,
        public int $count,
    ) {}

    public function handle(CreativeBriefResolver $briefResolver, AdCopyGenerator $generator): void
    {
        $creative = $this->creativeId ? Creative::find($this->creativeId) : null;

        if ($creative?->brief) {
            $brief = CreativeBrief::fromArray($creative->brief);
        } else {
            $brief = $this->productUrl
                ? $briefResolver->fromProductUrl($this->productUrl)
                : $briefResolver->fromPrompt($this->prompt ?? '');

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

        foreach ($generator->generate($brief, $this->count) as $copy) {
            AdCopy::create([
                'user_id' => $this->userId,
                'creative_id' => $this->creativeId,
                'product_url' => $this->productUrl,
                'prompt' => $this->prompt,
                'primary_text' => $copy['primary_text'],
                'headline' => $copy['headline'],
                'description' => $copy['description'],
                'cta' => $copy['cta'],
                'angle' => $copy['angle'],
                'status' => 'draft',
            ]);
        }
    }
}
