<?php

declare(strict_types=1);

use App\Models\OperationRun;
use App\Support\Workspaces\WorkspaceContext;

it('shows likely stale and reconciled lifecycle semantics on the operations surfaces', function (): void {
    [$user, $tenant] = createUserWithTenant(role: 'owner');

    $staleRun = OperationRun::factory()->create([
        'managed_environment_id' => (int) $tenant->getKey(),
        'workspace_id' => (int) $tenant->workspace_id,
        'type' => 'policy.sync',
        'status' => 'running',
        'outcome' => 'pending',
        'started_at' => now()->subMinutes(20),
        'created_at' => now()->subMinutes(20),
    ]);

    $reconciledRun = OperationRun::factory()->create([
        'managed_environment_id' => (int) $tenant->getKey(),
        'workspace_id' => (int) $tenant->workspace_id,
        'type' => 'restore.execute',
        'status' => 'completed',
        'outcome' => 'failed',
        'context' => [
            'reason_code' => 'run.adapter_out_of_sync',
            'reconciliation' => [
                'reconciled_at' => now()->toIso8601String(),
                'reason' => 'run.adapter_out_of_sync',
                'reason_code' => 'run.adapter_out_of_sync',
                'source' => 'adapter_reconciler',
            ],
        ],
        'failure_summary' => [[
            'code' => 'run.adapter_out_of_sync',
            'reason_code' => 'run.adapter_out_of_sync',
            'message' => 'A related restore record reached terminal truth before the operation run was updated.',
        ]],
    ]);

    $this->actingAs($user)
        ->withSession([WorkspaceContext::SESSION_KEY => (int) $tenant->workspace_id])
        ->get(\App\Support\OperationRunLinks::index())
        ->assertOk()
        ->assertSee('Likely stale')
        ->assertSee('belong in terminal follow-up');

    $this->actingAs($user)
        ->withSession([WorkspaceContext::SESSION_KEY => (int) $tenant->workspace_id])
        ->get(\App\Support\OperationRunLinks::tenantlessView($reconciledRun))
        ->assertOk()
        ->assertSee('Automatically reconciled')
        ->assertSee('Still active: No. Automatic reconciliation: Yes.');

    $this->actingAs($user)
        ->withSession([WorkspaceContext::SESSION_KEY => (int) $tenant->workspace_id])
        ->get(\App\Support\OperationRunLinks::tenantlessView($staleRun))
        ->assertOk()
        ->assertSee('Likely stale operation');
});

it('renders lifecycle outcome fallbacks when historical runs are missing stored outcomes', function (): void {
    [$user, $tenant] = createUserWithTenant(role: 'owner');

    $staleRun = OperationRun::factory()->create([
        'managed_environment_id' => (int) $tenant->getKey(),
        'workspace_id' => (int) $tenant->workspace_id,
        'type' => 'policy.sync',
        'status' => 'running',
        'outcome' => '',
        'started_at' => now()->subMinutes(20),
        'created_at' => now()->subMinutes(20),
    ]);

    $reconciledRun = OperationRun::factory()->create([
        'managed_environment_id' => (int) $tenant->getKey(),
        'workspace_id' => (int) $tenant->workspace_id,
        'type' => 'restore.execute',
        'status' => 'completed',
        'outcome' => '',
        'context' => [
            'reason_code' => 'run.adapter_out_of_sync',
            'reconciliation' => [
                'reconciled_at' => now()->toIso8601String(),
                'reason' => 'run.adapter_out_of_sync',
                'reason_code' => 'run.adapter_out_of_sync',
                'source' => 'adapter_reconciler',
            ],
        ],
        'failure_summary' => [[
            'code' => 'run.adapter_out_of_sync',
            'reason_code' => 'run.adapter_out_of_sync',
            'message' => 'A related restore record reached terminal truth before the operation run was updated.',
        ]],
    ]);

    $this->actingAs($user)
        ->withSession([WorkspaceContext::SESSION_KEY => (int) $tenant->workspace_id])
        ->get(\App\Support\OperationRunLinks::index())
        ->assertOk()
        ->assertSee('Awaiting result');

    $this->actingAs($user)
        ->withSession([WorkspaceContext::SESSION_KEY => (int) $tenant->workspace_id])
        ->get(\App\Support\OperationRunLinks::tenantlessView($staleRun))
        ->assertOk()
        ->assertSee('Awaiting result');

    $this->actingAs($user)
        ->withSession([WorkspaceContext::SESSION_KEY => (int) $tenant->workspace_id])
        ->get(\App\Support\OperationRunLinks::tenantlessView($reconciledRun))
        ->assertOk()
        ->assertSee('Reconciled failed');
});
