<?php

declare(strict_types=1);

use App\Filament\Resources\PolicyResource\Pages\ListPolicies;
use App\Models\Policy;
use Filament\Actions\Action;
use Filament\Facades\Filament;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Livewire\Features\SupportTesting\Testable;
use Livewire\Livewire;

uses(RefreshDatabase::class);

function getPolicySyncHeaderAction(Testable $component, string $name): ?Action
{
    $instance = $component->instance();
    $instance->cacheInteractsWithHeaderActions();

    foreach ($instance->getCachedHeaderActions() as $action) {
        if ($action instanceof Action && $action->getName() === $name) {
            return $action;
        }
    }

    return null;
}

it('shows sync in header and empty state when policies table is empty', function (): void {
    [$user, $tenant] = createUserWithTenant(role: 'owner');

    $this->actingAs($user);
    $tenant->makeCurrent();
    Filament::setTenant($tenant, true);

    $component = Livewire::test(ListPolicies::class)
        ->assertTableEmptyStateActionsExistInOrder(['sync']);

    $headerSync = getPolicySyncHeaderAction($component, 'sync');
    expect($headerSync)->not->toBeNull();
    expect($headerSync?->isVisible())->toBeTrue();
});

it('shows sync only in header when policies table is not empty', function (): void {
    [$user, $tenant] = createUserWithTenant(role: 'owner');

    $this->actingAs($user);
    $tenant->makeCurrent();
    Filament::setTenant($tenant, true);

    Policy::factory()->create([
        'managed_environment_id' => (int) $tenant->getKey(),
        'ignored_at' => null,
    ]);

    $component = Livewire::test(ListPolicies::class);

    $headerSync = getPolicySyncHeaderAction($component, 'sync');
    expect($headerSync)->not->toBeNull();
    expect($headerSync?->isVisible())->toBeTrue();
});
