<?php

declare(strict_types=1);

use App\Filament\Resources\ProviderConnectionResource;
use App\Models\ManagedEnvironment;
use App\Models\ManagedEnvironmentOnboardingSession;
use App\Models\ProviderConnection;
use App\Support\ManagedEnvironmentLinks;
use App\Support\Workspaces\WorkspaceContext;
use Illuminate\Foundation\Testing\RefreshDatabase;

uses(RefreshDatabase::class);

pest()->browser()->timeout(20_000);

it('smokes provider-connection detail and managed-environment related provider summary continuity', function (): void {
    [$user, $tenant] = createUserWithTenant(
        role: 'owner',
        workspaceRole: 'manager',
        ensureDefaultMicrosoftProviderConnection: false,
    );

    $tenant->forceFill([
        'name' => 'Spec 281 Browser Environment',
        'managed_environment_id' => '88888888-8888-8888-8888-888888888888',
        'status' => ManagedEnvironment::STATUS_ONBOARDING,
    ])->save();

    $connection = ProviderConnection::factory()->consentGranted()->create([
        'workspace_id' => (int) $tenant->workspace_id,
        'managed_environment_id' => (int) $tenant->getKey(),
        'provider' => 'microsoft',
        'display_name' => 'Spec 281 Browser Connection',
        'entra_tenant_id' => '88888888-8888-8888-8888-888888888888',
        'is_default' => true,
        'verification_status' => 'healthy',
    ]);

    $draft = ManagedEnvironmentOnboardingSession::query()->create([
        'workspace_id' => (int) $tenant->workspace_id,
        'managed_environment_id' => (int) $tenant->getKey(),
        'entra_tenant_id' => '88888888-8888-8888-8888-888888888888',
        'current_step' => 'connection',
        'state' => [
            'provider_connection_id' => (int) $connection->getKey(),
        ],
        'started_by_user_id' => (int) $user->getKey(),
        'updated_by_user_id' => (int) $user->getKey(),
    ]);

    $this->actingAs($user)->withSession([
        WorkspaceContext::SESSION_KEY => (int) $tenant->workspace_id,
        WorkspaceContext::LAST_ENVIRONMENT_IDS_SESSION_KEY => [
            (string) $tenant->workspace_id => (int) $tenant->getKey(),
        ],
    ]);

    $providerConnectionViewPath = (string) parse_url(ProviderConnectionResource::getUrl('view', [
        'record' => $connection,
        'environment_id' => (int) $tenant->getKey(),
    ], panel: 'admin'), PHP_URL_PATH);
    $tenantViewPath = (string) parse_url(ManagedEnvironmentLinks::viewUrl($tenant), PHP_URL_PATH);

    visit(ProviderConnectionResource::getUrl('view', [
        'record' => $connection,
        'environment_id' => (int) $tenant->getKey(),
    ], panel: 'admin'))
        ->waitForText('Spec 281 Browser Connection')
        ->assertScript("window.location.pathname === '{$providerConnectionViewPath}'", true)
        ->assertSee('Target scope')
        ->assertSee('Spec 281 Browser Environment')
        ->assertSee('Provider context')
        ->assertSee('Microsoft tenant ID')
        ->assertNoJavaScriptErrors()
        ->assertNoConsoleLogs();

    visit(route('admin.onboarding.draft', ['onboardingDraft' => (int) $draft->getKey()]))
        ->waitForText('Provider connection')
        ->assertSee('Ready - Spec 281 Browser Environment')
        ->assertSee('Spec 281 Browser Environment')
        ->assertNoJavaScriptErrors()
        ->assertNoConsoleLogs();

    visit(ManagedEnvironmentLinks::viewUrl($tenant))
        ->waitForText('Provider Health')
        ->assertScript("window.location.pathname === '{$tenantViewPath}'", true)
        ->assertSee('Spec 281 Browser Connection')
        ->assertSee('Spec 281 Browser Environment')
        ->assertNoJavaScriptErrors()
        ->assertNoConsoleLogs();
});
