<?php

declare(strict_types=1);

use App\Filament\Resources\BaselineSnapshotResource;
use App\Filament\Resources\EvidenceSnapshotResource;
use App\Filament\Resources\OperationRunResource;
use App\Filament\Resources\TenantResource;
use App\Filament\Resources\TenantReviewResource;
use App\Models\Tenant;
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 tenant global-search aligned with administrative discoverability in the current workspace', function (): void {
    $active = Tenant::factory()->active()->create(['name' => 'Lifecycle Active']);
    [$user, $active] = createUserWithTenant(tenant: $active, role: 'owner');

    $onboarding = Tenant::factory()->onboarding()->create([
        'workspace_id' => (int) $active->workspace_id,
        'name' => 'Lifecycle Onboarding',
    ]);
    $draft = Tenant::factory()->draft()->create([
        'workspace_id' => (int) $active->workspace_id,
        'name' => 'Lifecycle Draft',
    ]);
    $archived = Tenant::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 = TenantResource::getGlobalSearchResults('Lifecycle');

    expect(tenantSearchTitles($results))->toEqualCanonicalizing([
        'Lifecycle Active',
        'Lifecycle Onboarding',
        'Lifecycle Draft',
        'Lifecycle Archived',
    ]);

    expect($results->first()?->url)
        ->not->toBeNull();
    expect(collect($results)->filter(fn ($result): bool => filled($result->url))->count())
        ->toBe($results->count());
});

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(TenantReviewResource::canGloballySearch())->toBeFalse();
});
