<?php

declare(strict_types=1);

use App\Models\OperationRun;
use App\Notifications\OperationRunCompleted;
use App\Services\OperationRunService;
use Filament\Facades\Filament;

it('renders blocked terminal notifications distinctly from failed runs', function (): void {
    [$user, $tenant] = createUserWithTenant(role: 'owner');
    $this->actingAs($user);

    $tenant->makeCurrent();
    Filament::setTenant($tenant, true);

    $run = OperationRun::factory()->create([
        'managed_environment_id' => (int) $tenant->getKey(),
        'user_id' => (int) $user->getKey(),
        'initiator_name' => $user->name,
        'type' => 'inventory_sync',
        'status' => 'queued',
        'outcome' => 'pending',
        'context' => [
            'reason_code' => 'missing_capability',
            'blocked_by' => 'queued_execution_legitimacy',
        ],
    ]);

    app(OperationRunService::class)->updateRun(
        $run,
        status: 'completed',
        outcome: 'blocked',
        summaryCounts: [
            'total' => 2,
            'processed' => 0,
            'failed' => 0,
        ],
        failures: [[
            'code' => 'operation.blocked',
            'reason_code' => 'missing_capability',
            'message' => 'Operation blocked because the initiating actor no longer has the required capability.',
        ]],
    );

    $this->assertDatabaseHas('notifications', [
        'notifiable_id' => $user->getKey(),
        'notifiable_type' => $user->getMorphClass(),
        'type' => OperationRunCompleted::class,
        'data->title' => 'Inventory sync blocked by prerequisite',
    ]);

    $notification = $user->notifications()->latest('id')->first();

    expect($notification)->not->toBeNull()
        ->and($notification->data['body'] ?? null)->toContain('Permission required')
        ->and($notification->data['body'] ?? null)->toContain('initiating actor no longer has the required capability')
        ->and($notification->data['body'] ?? null)->toContain('Review workspace or tenant access before retrying.')
        ->and($notification->data['body'] ?? null)->toContain('Total: 2');
});
