<?php

declare(strict_types=1);

use App\Filament\Pages\BaselineCompareLanding;
use App\Models\BaselineProfile;
use App\Models\BaselineSnapshot;
use App\Models\BaselineTenantAssignment;
use App\Support\Baselines\BaselineCompareStats;
use App\Support\Ui\OperatorExplanation\ExplanationFamily;
use Filament\Facades\Filament;
use Livewire\Livewire;

it('shows an unavailable explanation before any baseline compare result exists', function (): void {
    [$user, $tenant] = createUserWithTenant(role: 'owner');
    $this->actingAs($user);

    $tenant->makeCurrent();
    Filament::setTenant($tenant, true);

    $profile = BaselineProfile::factory()->active()->create([
        'workspace_id' => (int) $tenant->workspace_id,
    ]);

    $snapshot = BaselineSnapshot::factory()->create([
        'workspace_id' => (int) $tenant->workspace_id,
        'baseline_profile_id' => (int) $profile->getKey(),
    ]);

    $profile->update(['active_snapshot_id' => (int) $snapshot->getKey()]);

    BaselineTenantAssignment::factory()->create([
        'workspace_id' => (int) $tenant->workspace_id,
        'managed_environment_id' => (int) $tenant->getKey(),
        'baseline_profile_id' => (int) $profile->getKey(),
    ]);

    $stats = BaselineCompareStats::forTenant($tenant);
    $explanation = $stats->operatorExplanation();
    $summary = $stats->summaryAssessment();

    expect($stats->state)->toBe('idle')
        ->and($explanation->family)->toBe(ExplanationFamily::Unavailable)
        ->and($explanation->nextActionText)->toBe('Run the baseline compare to generate a result');

    Livewire::actingAs($user)
        ->test(BaselineCompareLanding::class)
        ->assertSee($summary->headline)
        ->assertSee($summary->nextActionLabel())
        ->assertSee($explanation->coverageStatement ?? '');
});
