<?php

namespace Tests\Feature;

use App\Jobs\GenerateImageCreativeJob;
use App\Models\Creative;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Storage;
use Laravel\Ai\Image;
use Laravel\Ai\StructuredAnonymousAgent;
use Tests\TestCase;

class GenerateImageCreativeJobTest extends TestCase
{
    use RefreshDatabase;

    public function test_it_generates_an_image_creative_from_a_prompt(): void
    {
        Storage::fake('public');

        StructuredAnonymousAgent::fake([
            [
                'product_name' => 'Chromium Browser',
                'benefits' => ['Faster browsing', 'No annoying ads'],
                'features' => ['Built-in ad blocker'],
                'images' => [],
                'messaging' => 'Clean and premium',
                'cta' => 'Get Chromium Browser Free',
            ],
        ]);

        Image::fake();

        $user = User::factory()->create();

        $creative = Creative::create([
            'user_id' => $user->id,
            'type' => 'image',
            'status' => 'queued',
            'source' => 'prompt',
            'prompt' => 'Create a modern ad for Chromium Browser.',
            'ratio' => '1:1',
        ]);

        (new GenerateImageCreativeJob($creative->id))->handle(
            app(\App\Contracts\CreativeBriefResolver::class),
            app(\App\Contracts\ImageCreativeGenerator::class),
        );

        $creative->refresh();

        $this->assertSame('completed', $creative->status);
        $this->assertNotNull($creative->asset_path);
        $this->assertNull($creative->failure_reason);
        Storage::disk('public')->assertExists($creative->asset_path);
    }

    public function test_it_marks_the_creative_as_failed_when_generation_throws(): void
    {
        StructuredAnonymousAgent::fake([
            [
                'product_name' => 'Chromium Browser',
                'benefits' => [],
                'features' => [],
                'images' => [],
                'messaging' => '',
                'cta' => '',
            ],
        ]);

        Image::fake(fn () => throw new \RuntimeException('Provider unavailable'));

        $user = User::factory()->create();

        $creative = Creative::create([
            'user_id' => $user->id,
            'type' => 'image',
            'status' => 'queued',
            'source' => 'prompt',
            'prompt' => 'Create an ad.',
            'ratio' => '1:1',
        ]);

        try {
            (new GenerateImageCreativeJob($creative->id))->handle(
                app(\App\Contracts\CreativeBriefResolver::class),
                app(\App\Contracts\ImageCreativeGenerator::class),
            );
            $this->fail('Expected exception was not thrown.');
        } catch (\RuntimeException $e) {
            $this->assertSame('Provider unavailable', $e->getMessage());
        }

        $creative->refresh();

        $this->assertSame('failed', $creative->status);
        $this->assertSame('Provider unavailable', $creative->failure_reason);
    }
}
