<?php

namespace Tests\Feature;

use App\Agent\Tools\Campaign\StartCampaign;
use App\Models\Campaign;
use App\Models\User;
use App\Support\GeneratedNames;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Carbon;
use Laravel\Ai\Tools\Request;
use Tests\TestCase;

class GeneratedNamesTest extends TestCase
{
    use RefreshDatabase;

    public function test_default_campaign_names_include_the_creator_platform_and_date(): void
    {
        $this->travelTo(Carbon::parse('2026-10-01 12:00:00'));
        $user = User::factory()->create(['name' => 'Koushik Das']);
        $this->actingAs($user);

        app(StartCampaign::class)->handle(new Request(['platform' => 'meta']));

        $this->assertSame('campaign_koushik-das-u'.$user->id.'_META_2026-10-01', Campaign::sole()->name);
    }

    public function test_an_explicit_campaign_name_is_preserved(): void
    {
        $this->actingAs(User::factory()->create());

        app(StartCampaign::class)->handle(new Request(['platform' => 'meta', 'name' => 'Autumn Launch']));

        $this->assertSame('Autumn Launch', Campaign::sole()->name);
    }

    public function test_creative_names_include_concept_format_and_creation_date(): void
    {
        $date = Carbon::parse('2026-09-30');

        $this->assertSame('speed-focused-banner_Image-1200x1200_2026-09-30', GeneratedNames::creative('Speed Focused Banner', 'image', '1:1', $date));
        $this->assertSame('customer-story_Video-9x16_2026-09-30', GeneratedNames::creative('Customer Story', 'video', '9:16', $date));
        $this->assertSame('product-launch_Image-1080x720_2026-09-30', GeneratedNames::creative('Product Launch', 'image', '1080:720', $date));
    }

    public function test_long_concepts_keep_the_format_and_date_within_the_title_limit(): void
    {
        $name = GeneratedNames::creative(str_repeat('Product benefit ', 30), 'image', '1.91:1', Carbon::parse('2026-10-01'));

        $this->assertLessThanOrEqual(80, mb_strlen($name));
        $this->assertStringEndsWith('_Image-1200x628_2026-10-01', $name);
    }
}
