<?php

declare(strict_types=1);

use App\Models\Finding;
use App\Models\FindingException;
use Filament\Facades\Filament;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Gate;

uses(RefreshDatabase::class);

it('allows tenant viewers to inspect exception detail and hides records from non-members', function (): void {
    [$viewer, $tenant] = createUserWithTenant(role: 'readonly');
    [$owner] = createUserWithTenant(tenant: $tenant, role: 'owner');

    $finding = Finding::factory()->for($tenant)->create();

    $exception = FindingException::query()->create([
        'managed_environment_id' => (int) $tenant->getKey(),
        'finding_id' => (int) $finding->getKey(),
        'requested_by_user_id' => (int) $owner->getKey(),
        'owner_user_id' => (int) $owner->getKey(),
        'status' => FindingException::STATUS_PENDING,
        'current_validity_state' => FindingException::VALIDITY_MISSING_SUPPORT,
        'request_reason' => 'Temporary governance request',
        'requested_at' => now(),
        'review_due_at' => now()->addDays(7),
        'evidence_summary' => ['reference_count' => 0],
    ]);

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

    expect(Gate::forUser($viewer)->allows('view', $exception))->toBeTrue();

    $outsider = \App\Models\User::factory()->create();

    $response = Gate::forUser($outsider)->inspect('view', $exception);

    expect($response->allowed())->toBeFalse()
        ->and($response->status())->toBe(404);
});
