<?php

declare(strict_types=1);

use App\Support\Navigation\CanonicalNavigationContext;
use Illuminate\Http\Request;

it('serializes canonical navigation query data', function (): void {
    $context = new CanonicalNavigationContext(
        sourceSurface: 'finding.detail_section',
        canonicalRouteName: 'admin.operations.view',
        tenantId: 44,
        backLinkLabel: 'Back to finding',
        backLinkUrl: '/admin/findings/12',
        filterPayload: [
            'tableFilters' => [
                'managed_environment_id' => ['value' => '44'],
            ],
        ],
    );

    expect($context->toQuery())
        ->toMatchArray([
            'tableFilters' => [
                'managed_environment_id' => ['value' => '44'],
            ],
            'nav' => [
                'source_surface' => 'finding.detail_section',
                'canonical_route_name' => 'admin.operations.view',
                'environment_id' => 44,
                'back_label' => 'Back to finding',
                'back_url' => '/admin/findings/12',
            ],
        ]);
});

it('round trips from a request payload', function (): void {
    $request = Request::create('/admin/operations/12', 'GET', [
        'nav' => [
            'source_surface' => 'backup_set.detail_section',
            'canonical_route_name' => 'admin.operations.view',
            'environment_id' => 22,
            'back_label' => 'Back to backup set',
            'back_url' => '/admin/backup-sets/8',
        ],
    ]);

    $context = CanonicalNavigationContext::fromRequest($request);

    expect($context)->not->toBeNull()
        ->and($context?->tenantId)->toBe(22)
        ->and($context?->backLinkLabel)->toBe('Back to backup set')
        ->and($context?->backLinkUrl)->toBe('/admin/backup-sets/8');
});

it('serializes governance inbox family context for secondary surface return links', function (): void {
    $context = CanonicalNavigationContext::forGovernanceInbox(
        canonicalRouteName: 'filament.admin.pages.governance.inbox',
        tenantId: 12,
        familyKey: 'finding_exceptions',
        backLinkUrl: '/admin/governance/inbox?environment_id=12&family=finding_exceptions',
    );

    $roundTrip = CanonicalNavigationContext::fromRequest(Request::create('/admin/finding-exceptions/queue', 'GET', $context->toQuery()));

    expect($context->toQuery()['nav'])
        ->toMatchArray([
            'source_surface' => 'governance.inbox',
            'environment_id' => 12,
            'family_key' => 'finding_exceptions',
            'back_label' => 'Back to governance inbox',
        ])
        ->and($roundTrip?->sourceSurface)->toBe('governance.inbox')
        ->and($roundTrip?->tenantId)->toBe(12)
        ->and($roundTrip?->familyKey)->toBe('finding_exceptions')
        ->and($roundTrip?->backLinkUrl)->toBe('/admin/governance/inbox?environment_id=12&family=finding_exceptions');
});
