<?php

declare(strict_types=1);

use App\Models\OperationRun;
use App\Support\Workspaces\WorkspaceContext;
use Filament\Facades\Filament;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Bus;

uses(RefreshDatabase::class);

it('renders Monitoring pages DB-only (no outbound HTTP, no background work)', function (): void {
    [$user, $tenant] = createUserWithTenant(role: 'owner');

    $run = OperationRun::factory()->create([
        'managed_environment_id' => (int) $tenant->getKey(),
        'workspace_id' => (int) $tenant->workspace_id,
        'type' => 'policy.sync',
        'status' => 'queued',
        'outcome' => 'pending',
        'initiator_name' => 'System',
    ]);

    $this->actingAs($user);

    Bus::fake();

    Filament::setTenant(null, true);

    assertNoOutboundHttp(function () use ($tenant, $run) {
        $this->withSession([WorkspaceContext::SESSION_KEY => (int) $tenant->workspace_id])
            ->get(\App\Support\OperationRunLinks::index())
            ->assertOk();

        $this->withSession([WorkspaceContext::SESSION_KEY => (int) $tenant->workspace_id])
            ->get(\App\Support\OperationRunLinks::tenantlessView($run))
            ->assertOk();

        $this->withSession([WorkspaceContext::SESSION_KEY => (int) $tenant->workspace_id])
            ->followingRedirects()
            ->get('/admin/alerts')
            ->assertOk()
            ->assertSee('Alert targets')
            ->assertSee('Alert rules')
            ->assertSee('Alert deliveries');

        $this->withSession([WorkspaceContext::SESSION_KEY => (int) $tenant->workspace_id])
            ->get('/admin/audit-log')
            ->assertOk();
    });

    Bus::assertNothingDispatched();
});

it('shows lifecycle aggregate visibility for stale and reconciled runs', function (): void {
    [$user, $tenant] = createUserWithTenant(role: 'owner');

    OperationRun::factory()->create([
        'managed_environment_id' => (int) $tenant->getKey(),
        'workspace_id' => (int) $tenant->workspace_id,
        'type' => 'policy.sync',
        'status' => 'running',
        'outcome' => 'pending',
        'started_at' => now()->subMinutes(30),
        'created_at' => now()->subMinutes(30),
    ]);

    OperationRun::factory()->create([
        'managed_environment_id' => (int) $tenant->getKey(),
        'workspace_id' => (int) $tenant->workspace_id,
        'type' => 'restore.execute',
        'status' => 'completed',
        'outcome' => 'failed',
        'context' => [
            'reason_code' => 'run.adapter_out_of_sync',
            'reconciliation' => [
                'reconciled_at' => now()->toIso8601String(),
                'reason' => 'run.adapter_out_of_sync',
                'reason_code' => 'run.adapter_out_of_sync',
                'source' => 'adapter_reconciler',
            ],
        ],
    ]);

    $this->actingAs($user)
        ->withSession([WorkspaceContext::SESSION_KEY => (int) $tenant->workspace_id])
        ->get(\App\Support\OperationRunLinks::index())
        ->assertOk()
        ->assertSee('active operation(s) are beyond their lifecycle window and belong in the stale-attention view')
        ->assertSee('operation(s) already carry reconciled stale lineage and belong in terminal follow-up');
});

it('renders completed operation rows without leaking array-state unknown badges', function (): void {
    [$user, $tenant] = createUserWithTenant(role: 'owner');

    OperationRun::factory()->create([
        'managed_environment_id' => (int) $tenant->getKey(),
        'workspace_id' => (int) $tenant->workspace_id,
        'type' => 'baseline_compare',
        'status' => 'completed',
        'outcome' => 'partially_succeeded',
        'initiator_name' => 'Ahmed Darrazi',
        'created_at' => now()->subHours(6),
        'started_at' => now()->subHours(6),
        'completed_at' => now()->subHours(6)->addMinute(),
    ]);

    $this->actingAs($user)
        ->withSession([WorkspaceContext::SESSION_KEY => (int) $tenant->workspace_id])
        ->get(\App\Support\OperationRunLinks::index())
        ->assertOk()
        ->assertSee('Operation finished')
        ->assertSee('Completed with follow-up')
        ->assertDontSee('Operation finished Unknown')
        ->assertDontSee('Completed with follow-up Unknown');
});
