<?php

declare(strict_types=1);

use App\Filament\Pages\TenantDashboard;
use App\Filament\Widgets\Dashboard\DashboardKpis;
use App\Filament\Widgets\Dashboard\RecentOperations as DashboardRecentOperations;
use App\Filament\Widgets\Dashboard\RecoveryReadiness;
use App\Models\BackupItem;
use App\Models\BackupSet;
use App\Models\Finding;
use App\Models\OperationRun;
use App\Models\User;
use Filament\Facades\Filament;
use Illuminate\Support\Facades\Bus;
use Livewire\Livewire;

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

    Finding::factory()->create([
        'tenant_id' => $tenant->getKey(),
        'finding_type' => Finding::FINDING_TYPE_DRIFT,
        'severity' => Finding::SEVERITY_HIGH,
        'status' => Finding::STATUS_NEW,
    ]);

    $operation = OperationRun::factory()->create([
        'tenant_id' => $tenant->getKey(),
        'type' => 'inventory_sync',
        'status' => 'queued',
        'outcome' => 'pending',
        'initiator_name' => 'System',
    ]);

    $backupSet = BackupSet::factory()->create([
        'tenant_id' => (int) $tenant->getKey(),
        'name' => 'DB-only healthy backup',
        'item_count' => 1,
        'completed_at' => now()->subMinutes(30),
    ]);

    BackupItem::factory()->create([
        'tenant_id' => (int) $tenant->getKey(),
        'backup_set_id' => (int) $backupSet->getKey(),
        'payload' => ['id' => 'healthy-policy'],
        'metadata' => [],
        'assignments' => [],
    ]);

    $this->actingAs($user);

    Bus::fake();
    Filament::setTenant($tenant, true);

    assertNoOutboundHttp(function () use ($operation, $tenant): void {
        $this->get(TenantDashboard::getUrl(tenant: $tenant))
            ->assertOk()
            ->assertSee('/admin/choose-workspace', false);
        // NeedsAttention, RecentOperations and RecentDriftFindings are
        // lazy-loaded widgets and will not appear in the initial
        // server-rendered HTML.

        Livewire::test(RecoveryReadiness::class)
            ->assertSee('Backup posture')
            ->assertSee('Healthy');

        Livewire::test(DashboardKpis::class)
            ->assertSee('Active operations')
            ->assertSee('healthy queued or running tenant work');

        Livewire::test(DashboardRecentOperations::class)
            ->assertSee('Operation ID')
            ->assertSee('Operation #'.$operation->getKey())
            ->assertSee('Inventory sync');
    });

    Bus::assertNothingDispatched();
});

it('keeps tenant dashboard access deny-as-not-found for non-members', function (): void {
    [, $tenant] = createUserWithTenant(role: 'owner');
    $outsider = User::factory()->create();

    $this->actingAs($outsider)
        ->get(TenantDashboard::getUrl(tenant: $tenant))
        ->assertNotFound();
});
