<?php

declare(strict_types=1);

use App\Filament\Resources\AlertDestinationResource\Pages\EditAlertDestination;
use App\Filament\Resources\AlertDestinationResource\Pages\ViewAlertDestination;
use App\Models\AlertDelivery;
use App\Models\AlertDestination;
use App\Support\Workspaces\WorkspaceContext;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Livewire\Livewire;

uses(RefreshDatabase::class);

// ---------------------------------------------------------------------------
// T029 — Deep-link visibility + URL contract
// ---------------------------------------------------------------------------

it('shows view_last_delivery action on view page when a test delivery exists', function (): void {
    [$user] = createUserWithTenant(role: 'owner');
    $this->actingAs($user);

    $workspaceId = (int) session()->get(WorkspaceContext::SESSION_KEY);
    $destination = AlertDestination::factory()->create([
        'workspace_id' => $workspaceId,
        'is_enabled' => true,
    ]);

    AlertDelivery::factory()->test()->create([
        'workspace_id' => $workspaceId,
        'alert_destination_id' => $destination->getKey(),
        'status' => AlertDelivery::STATUS_SENT,
    ]);

    Livewire::test(ViewAlertDestination::class, ['record' => $destination->getRouteKey()])
        ->assertActionVisible('view_last_delivery');
});

it('hides view_last_delivery action on view page when no test delivery exists', function (): void {
    [$user] = createUserWithTenant(role: 'owner');
    $this->actingAs($user);

    $workspaceId = (int) session()->get(WorkspaceContext::SESSION_KEY);
    $destination = AlertDestination::factory()->create([
        'workspace_id' => $workspaceId,
        'is_enabled' => true,
    ]);

    Livewire::test(ViewAlertDestination::class, ['record' => $destination->getRouteKey()])
        ->assertActionHidden('view_last_delivery');
});

it('shows view_last_delivery action on edit page when a test delivery exists', function (): void {
    [$user] = createUserWithTenant(role: 'owner');
    $this->actingAs($user);

    $workspaceId = (int) session()->get(WorkspaceContext::SESSION_KEY);
    $destination = AlertDestination::factory()->create([
        'workspace_id' => $workspaceId,
        'is_enabled' => true,
    ]);

    AlertDelivery::factory()->test()->create([
        'workspace_id' => $workspaceId,
        'alert_destination_id' => $destination->getKey(),
        'status' => AlertDelivery::STATUS_SENT,
    ]);

    Livewire::test(EditAlertDestination::class, ['record' => $destination->getRouteKey()])
        ->assertActionVisible('view_last_delivery');
});

it('hides view_last_delivery action on edit page when no test delivery exists', function (): void {
    [$user] = createUserWithTenant(role: 'owner');
    $this->actingAs($user);

    $workspaceId = (int) session()->get(WorkspaceContext::SESSION_KEY);
    $destination = AlertDestination::factory()->create([
        'workspace_id' => $workspaceId,
        'is_enabled' => true,
    ]);

    Livewire::test(EditAlertDestination::class, ['record' => $destination->getRouteKey()])
        ->assertActionHidden('view_last_delivery');
});

it('generates deep link URL matching the contract filters', function (): void {
    [$user] = createUserWithTenant(role: 'owner');
    $this->actingAs($user);

    $workspaceId = (int) session()->get(WorkspaceContext::SESSION_KEY);
    $destination = AlertDestination::factory()->create([
        'workspace_id' => $workspaceId,
        'is_enabled' => true,
    ]);

    AlertDelivery::factory()->test()->create([
        'workspace_id' => $workspaceId,
        'alert_destination_id' => $destination->getKey(),
        'status' => AlertDelivery::STATUS_SENT,
    ]);

    $component = Livewire::test(ViewAlertDestination::class, ['record' => $destination->getRouteKey()]);

    $url = $component->instance()->getAction('view_last_delivery')->getUrl();

    expect($url)->toContain('alert-deliveries');
    expect($url)->toContain('filters%5Bevent_type%5D%5Bvalue%5D=alerts.test');
    expect($url)->toContain('filters%5Balert_destination_id%5D%5Bvalue%5D='.$destination->getKey());
});
