<?php

declare(strict_types=1);

use App\Filament\Resources\BaselineProfileResource\Pages\ListBaselineProfiles;
use App\Models\BaselineProfile;
use App\Models\Workspace;
use App\Support\Auth\UiTooltips;
use App\Support\Baselines\BaselineProfileStatus;
use Filament\Actions\Action;
use Livewire\Livewire;

it('requires confirmation for the archive table action', function (): void {
    [$user, $tenant] = createUserWithTenant(role: 'owner');

    $profile = BaselineProfile::factory()->active()->create([
        'workspace_id' => (int) $tenant->workspace_id,
    ]);

    Livewire::actingAs($user)
        ->test(ListBaselineProfiles::class)
        ->assertTableActionExists('archive', fn (Action $action): bool => $action->isConfirmationRequired(), $profile);
});

it('disables archive for workspace members missing workspace_baselines.manage', function (): void {
    [$user, $tenant] = createUserWithTenant(role: 'readonly');

    $profile = BaselineProfile::factory()->active()->create([
        'workspace_id' => (int) $tenant->workspace_id,
    ]);

    Livewire::actingAs($user)
        ->test(ListBaselineProfiles::class)
        ->assertTableActionVisible('archive', $profile)
        ->assertTableActionDisabled('archive', $profile)
        ->assertTableActionExists('archive', fn (Action $action): bool => $action->getTooltip() === UiTooltips::insufficientPermission(), $profile)
        ->callTableAction('archive', $profile);

    $profile->refresh();
    expect($profile->status)->toBe(BaselineProfileStatus::Active);
});

it('archives baseline profiles for authorized workspace members', function (): void {
    [$user, $tenant] = createUserWithTenant(role: 'owner');

    expect(defined(BaselineProfile::class.'::STATUS_DRAFT'))->toBeFalse()
        ->and(defined(BaselineProfile::class.'::STATUS_ACTIVE'))->toBeFalse()
        ->and(defined(BaselineProfile::class.'::STATUS_ARCHIVED'))->toBeFalse();

    $profile = BaselineProfile::factory()->active()->create([
        'workspace_id' => (int) $tenant->workspace_id,
    ]);

    Livewire::actingAs($user)
        ->test(ListBaselineProfiles::class)
        ->assertTableActionVisible('archive', $profile)
        ->assertTableActionEnabled('archive', $profile)
        ->callTableAction('archive', $profile)
        ->assertHasNoTableActionErrors()
        ->assertTableActionHidden('archive', $profile->fresh());

    $profile->refresh();
    expect($profile->status)->toBe(BaselineProfileStatus::Archived);
});

it('does not show workspace-owned baseline profiles from other workspaces in the list', function (): void {
    [$user, $tenant] = createUserWithTenant(role: 'owner');

    $otherWorkspace = Workspace::factory()->create();
    $profile = BaselineProfile::factory()->active()->create([
        'workspace_id' => (int) $otherWorkspace->getKey(),
    ]);

    Livewire::actingAs($user)
        ->test(ListBaselineProfiles::class)
        ->assertCanNotSeeTableRecords([$profile]);
});
