<?php

use App\Filament\Resources\ManagedEnvironmentResource;
use App\Filament\Resources\ManagedEnvironmentResource\Pages\ViewManagedEnvironment;
use App\Models\ManagedEnvironment;
use App\Models\User;
use App\Support\Workspaces\WorkspaceContext;
use Filament\Actions\Action;
use Filament\Facades\Filament;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Livewire\Livewire;

uses(RefreshDatabase::class);

it('returns 404 for the retired tenant dashboard compatibility route for archived tenants', function () {
    [$user, $tenant] = createUserWithTenant(role: 'readonly');

    $tenant->delete();

    $this->actingAs($user)
        ->get("/admin/t/{$tenant->external_id}")
        ->assertNotFound();
});

it('returns 404 for non-members on the tenant dashboard route for archived tenants', function () {
    $tenant = ManagedEnvironment::factory()->create(['external_id' => 'archived-tenant-a']);
    $tenant->delete();

    $user = User::factory()->create();

    $this->actingAs($user)
        ->get("/admin/t/{$tenant->external_id}")
        ->assertNotFound();
});

it('allows members to inspect the admin tenant view for archived tenants', function () {
    [$user, $tenant] = createUserWithTenant(role: 'owner');

    $tenant->delete();

    $this->actingAs($user)
        ->get(ManagedEnvironmentResource::getUrl('view', ['record' => $tenant]))
        ->assertSuccessful()
        ->assertSee('Environment governance overview')
        ->assertSee($tenant->name);
});

it('shows only restore as the lifecycle mutation on archived tenant detail for owners', function (): void {
    [$user, $tenant] = createUserWithTenant(role: 'owner');

    $tenant->delete();

    Filament::setTenant(null, true);

    Livewire::actingAs($user)
        ->test(ViewManagedEnvironment::class, ['record' => $tenant->getRouteKey()])
        ->assertActionVisible('restore')
        ->assertActionEnabled('restore')
        ->assertActionExists('restore', fn (Action $action): bool => $action->getLabel() === 'Restore')
        ->assertActionHidden('archive')
        ->assertActionDoesNotExist('related_onboarding');
});

it('keeps archived tenant detail inspectable for readonly members while blocking lifecycle mutation', function (): void {
    [$user, $tenant] = createUserWithTenant(role: 'readonly');

    $tenant->delete();

    Filament::setTenant(null, true);

    Livewire::actingAs($user)
        ->test(ViewManagedEnvironment::class, ['record' => $tenant->getRouteKey()])
        ->assertActionVisible('restore')
        ->assertActionDisabled('restore')
        ->assertActionHidden('archive')
        ->assertActionDoesNotExist('related_onboarding');
});

it('keeps archived tenant routes authoritative when another tenant is currently selected', function (): void {
    [$user, $selectedTenant] = createUserWithTenant(role: 'owner');

    $archivedTenant = ManagedEnvironment::factory()->archived()->create([
        'workspace_id' => (int) $selectedTenant->workspace_id,
    ]);

    createUserWithTenant(
        tenant: $archivedTenant,
        user: $user,
        role: 'owner',
        workspaceRole: 'owner',
        ensureDefaultMicrosoftProviderConnection: false,
    );

    Filament::setTenant($selectedTenant, true);

    $this->actingAs($user)
        ->withSession([WorkspaceContext::SESSION_KEY => (int) $selectedTenant->workspace_id])
        ->get(ManagedEnvironmentResource::getUrl('view', ['record' => $archivedTenant]))
        ->assertSuccessful()
        ->assertSee('Environment governance overview')
        ->assertSee($archivedTenant->name);
});

it('keeps onboarding admin tenant routes authoritative when another tenant is currently selected', function (): void {
    [$user, $selectedTenant] = createUserWithTenant(role: 'owner');

    $onboardingTenant = ManagedEnvironment::factory()->onboarding()->create([
        'workspace_id' => (int) $selectedTenant->workspace_id,
    ]);

    createUserWithTenant(
        tenant: $onboardingTenant,
        user: $user,
        role: 'owner',
        workspaceRole: 'owner',
        ensureDefaultMicrosoftProviderConnection: false,
    );

    Filament::setTenant($selectedTenant, true);

    $this->actingAs($user)
        ->withSession([WorkspaceContext::SESSION_KEY => (int) $selectedTenant->workspace_id])
        ->get(ManagedEnvironmentResource::getUrl('view', ['record' => $onboardingTenant]))
        ->assertSuccessful()
        ->assertSee($onboardingTenant->name);
});
