<?php

use App\Filament\Pages\ChooseEnvironment;
use App\Filament\Pages\EnvironmentDashboard;
use App\Models\ManagedEnvironment;
use App\Models\Workspace;
use App\Support\Workspaces\WorkspaceContext;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Livewire\Livewire;

uses(RefreshDatabase::class);

it('lists only selectable managed environments from the active workspace', function (): void {
    [$user, $environment] = createUserWithTenant(role: 'owner', workspaceRole: 'manager');

    $archived = ManagedEnvironment::factory()->archived()->create([
        'workspace_id' => (int) $environment->workspace_id,
        'name' => 'Archived environment',
    ]);
    $user->tenants()->syncWithoutDetaching([
        $archived->getKey() => ['role' => 'owner'],
    ]);

    $otherWorkspace = Workspace::factory()->create();
    $otherEnvironment = ManagedEnvironment::factory()->create([
        'workspace_id' => (int) $otherWorkspace->getKey(),
        'name' => 'Other workspace environment',
    ]);
    $user->tenants()->syncWithoutDetaching([
        $otherEnvironment->getKey() => ['role' => 'owner'],
    ]);

    $this->actingAs($user)->withSession([
        WorkspaceContext::SESSION_KEY => (int) $environment->workspace_id,
    ]);

    $tenants = Livewire::actingAs($user)
        ->test(ChooseEnvironment::class)
        ->instance()
        ->getTenants();

    expect($tenants->pluck('id')->all())->toBe([(int) $environment->getKey()]);
});

it('persists managed-environment context and redirects into the workspace-first environment shell', function (): void {
    [$user, $environment] = createUserWithTenant(role: 'owner', workspaceRole: 'manager');

    $this->actingAs($user)->withSession([
        WorkspaceContext::SESSION_KEY => (int) $environment->workspace_id,
    ]);

    Livewire::actingAs($user)
        ->test(ChooseEnvironment::class)
        ->call('selectEnvironment', (int) $environment->getKey())
        ->assertRedirect(EnvironmentDashboard::getUrl(tenant: $environment));

    expect(session(WorkspaceContext::LAST_ENVIRONMENT_IDS_SESSION_KEY))->toBe([
        (string) $environment->workspace_id => (int) $environment->getKey(),
    ]);
});

it('keeps route builders on managed-environment slug for the workspace-first shell', function (): void {
    [$user, $environment] = createUserWithTenant(role: 'owner', workspaceRole: 'manager');

    $this->actingAs($user)->withSession([
        WorkspaceContext::SESSION_KEY => (int) $environment->workspace_id,
    ]);

    expect(EnvironmentDashboard::getUrl(tenant: $environment))
        ->toContain('/admin/workspaces/'.$environment->workspace->slug.'/environments/'.$environment->slug);
});
