<?php

declare(strict_types=1);

use App\Filament\Resources\BaselineSnapshotResource;
use App\Filament\Resources\EvidenceSnapshotResource;
use App\Filament\Resources\OperationRunResource;
use App\Filament\Resources\ManagedEnvironmentResource;
use App\Filament\Resources\EnvironmentReviewResource;
use App\Models\ManagedEnvironment;
use App\Support\Workspaces\WorkspaceContext;
use Filament\Facades\Filament;
use Illuminate\Foundation\Testing\RefreshDatabase;

uses(RefreshDatabase::class);

function tenantSearchTitles($results): array
{
    return collect($results)->map(fn ($result): string => (string) $result->title)->all();
}

it('keeps retired tenant resources out of global search', function (): void {
    $active = ManagedEnvironment::factory()->active()->create(['name' => 'Lifecycle Active']);
    [$user, $active] = createUserWithTenant(tenant: $active, role: 'owner');

    $onboarding = ManagedEnvironment::factory()->onboarding()->create([
        'workspace_id' => (int) $active->workspace_id,
        'name' => 'Lifecycle Onboarding',
    ]);
    $draft = ManagedEnvironment::factory()->draft()->create([
        'workspace_id' => (int) $active->workspace_id,
        'name' => 'Lifecycle Draft',
    ]);
    $archived = ManagedEnvironment::factory()->archived()->create([
        'workspace_id' => (int) $active->workspace_id,
        'name' => 'Lifecycle Archived',
    ]);

    createUserWithTenant(tenant: $onboarding, user: $user, role: 'owner');
    createUserWithTenant(tenant: $draft, user: $user, role: 'owner');
    createUserWithTenant(tenant: $archived, user: $user, role: 'owner');

    $this->actingAs($user);
    Filament::setCurrentPanel('admin');
    Filament::setTenant(null, true);
    Filament::bootCurrentPanel();

    session()->put(WorkspaceContext::SESSION_KEY, (int) $active->workspace_id);

    $results = ManagedEnvironmentResource::getGlobalSearchResults('Lifecycle');

    expect(ManagedEnvironmentResource::canGloballySearch())->toBeFalse()
        ->and(tenantSearchTitles($results))->toBe([]);
});

it('keeps first-slice taxonomy resources out of global search', function (): void {
    expect(OperationRunResource::canGloballySearch())->toBeFalse()
        ->and(EvidenceSnapshotResource::canGloballySearch())->toBeFalse()
        ->and(BaselineSnapshotResource::canGloballySearch())->toBeFalse()
        ->and(EnvironmentReviewResource::canGloballySearch())->toBeFalse();
});
