<?php

namespace Tests\Feature;

use App\Campaigns\PerformanceVerdict;
use App\Campaigns\PerformanceWindows;
use App\Models\Campaign;
use App\Models\CampaignPerformanceHourStat;
use App\Models\CampaignPerformanceStat;
use App\Models\CampaignPerformanceVerdictLog;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Http;
use Tests\TestCase;

class CampaignPerformanceVerdictTest extends TestCase
{
    use RefreshDatabase;

    public function test_daily_map_appends_a_verdict_log_with_all_five_windows(): void
    {
        $this->travelTo('2026-09-22 12:00:00');
        config(['campaign-performance.llm_enabled' => false]);

        $user = User::factory()->create();
        $campaign = Campaign::create([
            'user_id' => $user->id,
            'name' => 'Italy packages',
            'platform' => 'meta',
            'status' => 'published',
            'budget' => 20,
            'ad_account_id' => 'act_111',
            'external_campaign_id' => '1201',
        ]);

        foreach (range(0, 6) as $offset) {
            CampaignPerformanceStat::create([
                'user_id' => $user->id,
                'platform' => 'meta',
                'external_campaign_id' => '1201',
                'local_campaign_id' => $campaign->id,
                'stat_date' => now()->subDays(6 - $offset)->toDateString(),
                'spend' => 6.0,
                'impressions' => 100,
                'clicks' => 0,
                'platform_status' => 'ACTIVE',
                'fetched_at' => now(),
            ]);
        }

        foreach (range(0, 6) as $offset) {
            CampaignPerformanceHourStat::create([
                'user_id' => $user->id,
                'platform' => 'meta',
                'external_campaign_id' => '1201',
                'local_campaign_id' => $campaign->id,
                'stat_hour' => now()->copy()->startOfHour()->subHours(6 - $offset),
                'spend' => 1.0,
                'impressions' => 20,
                'clicks' => 0,
                'platform_status' => 'ACTIVE',
                'fetched_at' => now(),
            ]);
        }

        Http::fake();

        $this->artisan('campaigns:sync-performance', ['--map' => true])->assertSuccessful();

        $log = CampaignPerformanceVerdictLog::query()->first();
        $this->assertNotNull($log);
        $this->assertSame('daily', $log->run_type);
        $this->assertSame(['3h', '5h', '7h', '3d', '7d'], array_keys($log->windows ?? []));
        $this->assertSame(PerformanceVerdict::Stop->value, $log->final_verdict);
        $this->assertNull($log->hourly_verdict);
    }

    public function test_hourly_map_appends_intraday_windows_and_hourly_verdict(): void
    {
        $this->travelTo('2026-09-22 12:00:00');
        config(['campaign-performance.llm_enabled' => false]);

        $user = User::factory()->create();
        $campaign = Campaign::create([
            'user_id' => $user->id,
            'name' => 'Italy packages',
            'platform' => 'meta',
            'status' => 'published',
            'budget' => 20,
            'ad_account_id' => 'act_111',
            'external_campaign_id' => '1201',
        ]);

        foreach (range(0, 6) as $offset) {
            CampaignPerformanceStat::create([
                'user_id' => $user->id,
                'platform' => 'meta',
                'external_campaign_id' => '1201',
                'local_campaign_id' => $campaign->id,
                'stat_date' => now()->subDays(6 - $offset)->toDateString(),
                'spend' => 10.0,
                'impressions' => 100,
                'clicks' => 0,
                'platform_status' => 'ACTIVE',
                'fetched_at' => now(),
            ]);
        }

        foreach (range(0, 6) as $offset) {
            CampaignPerformanceHourStat::create([
                'user_id' => $user->id,
                'platform' => 'meta',
                'external_campaign_id' => '1201',
                'local_campaign_id' => $campaign->id,
                'stat_hour' => now()->copy()->startOfHour()->subHours(6 - $offset),
                'spend' => 4.0,
                'impressions' => 40,
                'clicks' => 0,
                'platform_status' => 'ACTIVE',
                'fetched_at' => now(),
            ]);
        }

        Http::fake();

        $this->artisan('campaigns:sync-performance', ['--hourly' => true, '--map' => true])->assertSuccessful();

        $log = CampaignPerformanceVerdictLog::query()->first();
        $this->assertNotNull($log);
        $this->assertSame('hourly', $log->run_type);
        $this->assertSame(PerformanceWindows::hourWindowKeys(), array_keys($log->windows ?? []));
        $this->assertIsArray($log->hourly_verdict);
        $this->assertSame(PerformanceVerdict::Stop->value, $log->final_verdict);
    }

    public function test_analysis_windows_are_hardcoded_without_env(): void
    {
        $this->assertSame(
            ['3h', '5h', '7h', '3d', '7d'],
            array_keys(PerformanceWindows::analysis()),
        );
    }
}
