<?php

declare(strict_types=1);

use App\Filament\Pages\BaselineCompareLanding;
use App\Filament\Widgets\Dashboard\BaselineCompareNow;
use App\Filament\Widgets\ManagedEnvironment\BaselineCompareCoverageBanner;
use App\Models\BaselineProfile;
use App\Models\BaselineSnapshot;
use App\Models\BaselineTenantAssignment;
use App\Models\Finding;
use App\Models\OperationRun;
use App\Support\Baselines\BaselineCompareReasonCode;
use App\Support\OperationRunOutcome;
use App\Support\OperationRunStatus;
use App\Support\OperationRunType;
use Filament\Facades\Filament;
use Livewire\Livewire;

function createBaselineCompareSummaryConsistencyTenant(): array
{
    [$user, $tenant] = createUserWithTenant(role: 'owner');

    $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(),
    ]);

    return [$user, $tenant, $profile, $snapshot];
}

it('keeps widget, landing, and banner equally cautious for the same limited-confidence compare result', function (): void {
    [$user, $tenant] = createUserWithTenant(role: 'owner');
    $this->actingAs($user);

    $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(),
    ]);

    OperationRun::factory()->create([
        'managed_environment_id' => (int) $tenant->getKey(),
        'workspace_id' => (int) $tenant->workspace_id,
        'type' => OperationRunType::BaselineCompare->value,
        'status' => OperationRunStatus::Completed->value,
        'outcome' => OperationRunOutcome::PartiallySucceeded->value,
        'completed_at' => now(),
        'context' => [
            'baseline_profile_id' => (int) $profile->getKey(),
            'baseline_snapshot_id' => (int) $snapshot->getKey(),
            'baseline_compare' => [
                'reason_code' => BaselineCompareReasonCode::CoverageUnproven->value,
                'coverage' => [
                    'effective_types' => ['deviceConfiguration', 'deviceCompliancePolicy'],
                    'covered_types' => ['deviceConfiguration'],
                    'uncovered_types' => ['deviceCompliancePolicy'],
                    'proof' => false,
                ],
            ],
        ],
    ]);

    setAdminPanelContext($tenant);

    Livewire::test(BaselineCompareNow::class)
        ->assertSee('Needs review')
        ->assertSee('The last compare finished, but normal result output was suppressed.')
        ->assertDontSee('Aligned');

    Livewire::test(BaselineCompareLanding::class)
        ->assertSee('Needs review')
        ->assertSee('The last compare finished, but normal result output was suppressed.')
        ->assertSee('Limited confidence')
        ->assertDontSee('Aligned');

    Livewire::test(BaselineCompareCoverageBanner::class)
        ->assertSee('The last compare finished, but normal result output was suppressed.')
        ->assertSee('Review compare detail');
});

it('keeps widget, landing, and banner aligned when overdue workflow remains without new drift', function (): void {
    [$user, $tenant, $profile, $snapshot] = createBaselineCompareSummaryConsistencyTenant();
    $this->actingAs($user);

    OperationRun::factory()->create([
        'managed_environment_id' => (int) $tenant->getKey(),
        'workspace_id' => (int) $tenant->workspace_id,
        'type' => OperationRunType::BaselineCompare->value,
        'status' => OperationRunStatus::Completed->value,
        'outcome' => OperationRunOutcome::Succeeded->value,
        'completed_at' => now(),
        'context' => [
            'baseline_profile_id' => (int) $profile->getKey(),
            'baseline_snapshot_id' => (int) $snapshot->getKey(),
            'baseline_compare' => [
                'reason_code' => BaselineCompareReasonCode::NoDriftDetected->value,
                'coverage' => [
                    'effective_types' => ['deviceConfiguration'],
                    'covered_types' => ['deviceConfiguration'],
                    'uncovered_types' => [],
                    'proof' => true,
                ],
            ],
        ],
    ]);

    Finding::factory()->triaged()->create([
        'workspace_id' => (int) $tenant->workspace_id,
        'managed_environment_id' => (int) $tenant->getKey(),
        'due_at' => now()->subDay(),
    ]);

    setAdminPanelContext($tenant);

    Livewire::test(BaselineCompareNow::class)
        ->assertSee('Action required')
        ->assertSee('overdue finding')
        ->assertSee('Open findings');

    Livewire::test(BaselineCompareLanding::class)
        ->assertSee('Action required')
        ->assertSee('overdue finding')
        ->assertSee('Open findings');

    Livewire::test(BaselineCompareCoverageBanner::class)
        ->assertSee('overdue finding')
        ->assertSee('Open findings');
});

it('keeps widget, landing, and banner aligned while compare is still running', function (): void {
    [$user, $tenant, $profile, $snapshot] = createBaselineCompareSummaryConsistencyTenant();
    $this->actingAs($user);

    OperationRun::factory()->create([
        'managed_environment_id' => (int) $tenant->getKey(),
        'workspace_id' => (int) $tenant->workspace_id,
        'type' => OperationRunType::BaselineCompare->value,
        'status' => OperationRunStatus::Running->value,
        'outcome' => OperationRunOutcome::Pending->value,
        'context' => [
            'baseline_profile_id' => (int) $profile->getKey(),
            'baseline_snapshot_id' => (int) $snapshot->getKey(),
        ],
    ]);

    setAdminPanelContext($tenant);

    Livewire::test(BaselineCompareNow::class)
        ->assertSee('In progress')
        ->assertSee('Baseline compare is in progress.')
        ->assertSee('Open operation');

    Livewire::test(BaselineCompareLanding::class)
        ->assertSee('In progress')
        ->assertSee('Baseline compare is in progress.')
        ->assertSee('Open operation');

    Livewire::test(BaselineCompareCoverageBanner::class)
        ->assertSee('Baseline compare is in progress.')
        ->assertSee('Open operation');
});
