<?php

namespace Tests\Feature;

use App\Agent\Tools\Campaign\ChooseInstagramAccount;
use App\Agent\Tools\Campaign\ChoosePage;
use App\Agent\Workspace;
use App\Campaigns\AdPreview;
use App\Models\AllowedPage;
use App\Models\Campaign;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;
use Laravel\Ai\Tools\Request;
use Tests\TestCase;

class AdPreviewIdentityTest extends TestCase
{
    use RefreshDatabase;

    private function campaign(array $attributes = []): Campaign
    {
        $user = User::factory()->create();
        $this->actingAs($user);
        DB::table('agent_conversations')->insert([
            'id' => 'preview-identities',
            'participant_type' => $user->getMorphClass(),
            'participant_id' => $user->id,
            'title' => 'Preview test',
            'created_at' => now(),
            'updated_at' => now(),
        ]);
        $campaign = Campaign::create([
            'user_id' => $user->id,
            'name' => 'Autumn Launch',
            'platform' => 'meta',
            'status' => 'draft',
            'ad_account_id' => 'act_777',
            'placements' => ['facebook', 'instagram'],
            'meta' => ['existing' => 'preserved'],
            ...$attributes,
        ]);
        $campaign->ads()->create(['headline' => 'Autumn offer', 'primary_text' => 'Discover our collection', 'cta' => 'LEARN_MORE']);
        app(Workspace::class)->bindTo('preview-identities');
        app(Workspace::class)->produced($campaign);

        return $campaign;
    }

    public function test_selected_page_and_instagram_names_survive_reload_and_render_in_the_preview(): void
    {
        config([
            'platforms.guardrails.allowed_ad_accounts' => ['act_777'],
            'platforms.meta.mcp.enabled' => false,
            'platforms.meta.token' => 'test-token',
        ]);
        Http::preventStrayRequests();
        Http::fake([
            '*/me/accounts*' => Http::response(['data' => [['id' => 'page-1', 'name' => 'Acme & Sons']]]),
            '*/page-1*' => Http::response(['connected_instagram_account' => ['id' => 'ig-1', 'username' => 'acme_official']]),
            '*/act_777/instagram_accounts*' => Http::response(['data' => [['id' => 'ig-1', 'username' => 'acme_official']]]),
        ]);
        $campaign = $this->campaign();

        app(ChoosePage::class)->handle(new Request(['page_id' => 'page-1']));
        app(ChooseInstagramAccount::class)->handle(new Request(['instagram_account_id' => 'ig-1']));

        $this->assertSame('Acme & Sons', $campaign->fresh()->meta['facebook_page']['name']);
        $this->assertSame('acme_official', $campaign->fresh()->meta['instagram_account']['username']);
        $this->assertSame('preserved', $campaign->fresh()->meta['existing']);
        $this->get(route('chat.show', ['conversation' => 'preview-identities']))
            ->assertOk()->assertSee('Acme & Sons')->assertSee('@acme_official')->assertDontSee('Ad Page');
        Http::assertSentCount(3);
    }

    public function test_instagram_using_the_page_shows_the_page_name_and_escapes_markup(): void
    {
        $campaign = $this->campaign([
            'page_id' => 'page-1',
            'instagram_account_id' => '',
            'meta' => ['facebook_page' => ['id' => 'page-1', 'name' => '<script>alert(1)</script>']],
        ]);

        $this->assertSame(['<script>alert(1)</script>', '<script>alert(1)</script>'], array_column(app(AdPreview::class)->identities($campaign), 'name'));
        $this->get(route('chat.show', ['conversation' => 'preview-identities']))
            ->assertOk()->assertSee('<script>alert(1)</script>')->assertDontSee('<script>alert(1)</script>', false);
    }

    public function test_old_campaigns_resolve_page_names_from_the_local_page_directory(): void
    {
        AllowedPage::factory()->create(['platform' => 'facebook', 'page_id' => 'page-1', 'name' => 'Acme Page']);
        $campaign = $this->campaign(['page_id' => 'page-1', 'placements' => ['facebook']]);

        $this->assertSame([['platform' => 'Facebook', 'name' => 'Acme Page', 'icon' => 'facebook']], app(AdPreview::class)->identities($campaign));
    }

    public function test_stale_identity_names_are_not_used_for_different_selected_ids(): void
    {
        $campaign = $this->campaign([
            'page_id' => 'page-2',
            'instagram_account_id' => 'ig-2',
            'meta' => [
                'facebook_page' => ['id' => 'page-1', 'name' => 'Old Page'],
                'instagram_account' => ['id' => 'ig-1', 'username' => 'old_account'],
            ],
        ]);

        $this->assertSame(['Facebook Page page-2', 'Instagram ig-2'], array_column(app(AdPreview::class)->identities($campaign), 'name'));
    }

    public function test_instagram_only_placement_does_not_show_a_facebook_preview(): void
    {
        $campaign = $this->campaign(['placements' => ['instagram'], 'instagram_account_id' => 'ig-1']);

        $this->assertSame([['platform' => 'Instagram', 'name' => 'Instagram ig-1', 'icon' => 'instagram']], app(AdPreview::class)->identities($campaign));
    }
}
