<?php

namespace App\Services\AI;

use App\Contracts\ScriptGenerator;
use App\DTOs\CreativeBrief;
use Illuminate\Contracts\JsonSchema\JsonSchema;

use function Laravel\Ai\agent;

class LaravelAiScriptGenerator implements ScriptGenerator
{
    public function generate(CreativeBrief $brief, ?int $durationSeconds = null): array
    {
        return $this->generateOne($brief, durationSeconds: $durationSeconds);
    }

    public function generateVariations(CreativeBrief $brief, int $count, ?int $durationSeconds = null): array
    {
        return array_map(
            fn (int $i) => $this->generateOne($brief, variationSeed: $i, durationSeconds: $durationSeconds),
            range(1, $count),
        );
    }

    private function generateOne(CreativeBrief $brief, int $variationSeed = 1, ?int $durationSeconds = null): array
    {
        // Same ~2.2 words/sec budget the video providers use for the rendered dialogue line.
        $durationLine = $durationSeconds
            ? sprintf("\n\nThis is a %d-second video — keep the combined spoken script to about %d words total so it fits without rushing.", $durationSeconds, max(6, (int) floor($durationSeconds * 2.2)))
            : '';

        $prompt = sprintf(
            "Product: %s\nFeatures: %s\nBenefits: %s\nMessaging: %s\nCTA: %s\n\nWrite video ad script variation #%d. Make the hook meaningfully different from other variations.%s",
            $brief->productName,
            implode(', ', $brief->features),
            implode(', ', $brief->benefits),
            $brief->messaging,
            $brief->cta,
            $variationSeed,
            $durationLine,
        );

        $response = agent(
            instructions: 'You write short-form video ad scripts using the structure Hook -> Problem -> Product -> Benefits -> CTA. Keep each section to one punchy sentence.',
            schema: fn (JsonSchema $schema) => [
                'hook' => $schema->string()->required(),
                'problem' => $schema->string()->required(),
                'product' => $schema->string()->required(),
                'benefits' => $schema->string()->required(),
                'cta' => $schema->string()->required(),
            ],
        )->prompt($prompt);

        return $response->toArray();
    }
}
