<?php

use App\Models\ManagedEnvironment;
use App\Support\Auth\Capabilities;
use App\Support\Auth\UiTooltips;
use App\Support\Rbac\UiEnforcement;
use Filament\Actions\Action;
use Illuminate\Foundation\Testing\RefreshDatabase;

uses(RefreshDatabase::class);

it('hides actions for non-members on record-scoped surfaces', function () {
    $tenant = ManagedEnvironment::factory()->create();
    [$user] = createUserWithTenant();

    $action = Action::make('test')->action(fn () => null);

    UiEnforcement::forAction($action)
        ->requireCapability(Capabilities::TENANT_VIEW)
        ->apply();

    $this->actingAs($user);
    $action->record($tenant);

    expect($action->isHidden())->toBeTrue();
});

it('disables actions with the standard tooltip for members without the capability', function () {
    $tenant = ManagedEnvironment::factory()->create();
    [$user] = createUserWithTenant($tenant, role: 'readonly');

    $action = Action::make('test')->action(fn () => null);

    UiEnforcement::forAction($action)
        ->requireCapability(Capabilities::TENANT_SYNC)
        ->apply();

    $this->actingAs($user);
    $action->record($tenant);

    expect($action->isHidden())->toBeFalse();
    expect($action->isDisabled())->toBeTrue();
    expect($action->getTooltip())->toBe(UiTooltips::insufficientPermission());
});

it('enables actions for members with the capability', function () {
    $tenant = ManagedEnvironment::factory()->create();
    [$user] = createUserWithTenant($tenant, role: 'owner');

    $action = Action::make('test')->action(fn () => null);

    UiEnforcement::forAction($action)
        ->requireCapability(Capabilities::TENANT_SYNC)
        ->apply();

    $this->actingAs($user);
    $action->record($tenant);

    expect($action->isHidden())->toBeFalse();
    expect($action->isDisabled())->toBeFalse();
    expect($action->getTooltip())->toBeNull();
});

it('preserveVisibility combines existing visibility with membership checks', function () {
    $tenant = ManagedEnvironment::factory()->create();
    [$user] = createUserWithTenant($tenant, role: 'owner');

    $action = Action::make('test')
        ->action(fn () => null)
        ->visible(fn (): bool => false);

    UiEnforcement::forAction($action)
        ->preserveVisibility()
        ->requireCapability(Capabilities::TENANT_VIEW)
        ->apply();

    $this->actingAs($user);
    $action->record($tenant);

    expect($action->isHidden())->toBeTrue();
});

it('disables bulk actions for mixed-authorization selections (capability preflight)', function () {
    $tenantA = ManagedEnvironment::factory()->create();
    $tenantB = ManagedEnvironment::factory()->create([
        'workspace_id' => (int) $tenantA->workspace_id,
    ]);

    [$user] = createUserWithTenant($tenantA, role: 'owner');

    $action = Action::make('test')->action(fn () => null);

    $enforcement = UiEnforcement::forAction($action)
        ->requireCapability(Capabilities::TENANT_SYNC);

    expect($enforcement->bulkSelectionIsAuthorized($user, collect([$tenantA, $tenantB])))->toBeFalse();

    $user->tenants()->syncWithoutDetaching([
        $tenantB->getKey() => ['role' => 'owner'],
    ]);
    app(\App\Services\Auth\CapabilityResolver::class)->clearCache();

    expect($enforcement->bulkSelectionIsAuthorized($user, collect([$tenantA, $tenantB])))->toBeTrue();
});
