<?php

declare(strict_types=1);

use App\Models\BackupSet;
use App\Models\OperationRun;
use App\Models\Tenant;
use App\Support\OperationRunLinks;
use App\Support\Workspaces\WorkspaceContext;
use Filament\Facades\Filament;

it('renders operation run related context with backup set details', function (): void {
    [$user, $tenant] = createUserWithTenant(role: 'owner');
    $this->actingAs($user);

    $backupSet = BackupSet::factory()->for($tenant)->create([
        'name' => 'Nightly backup',
    ]);

    $run = OperationRun::factory()->for($tenant)->create([
        'workspace_id' => (int) $tenant->workspace_id,
        'type' => 'backup_set.update',
        'context' => [
            'backup_set_id' => (int) $backupSet->getKey(),
        ],
    ]);

    $this->get(OperationRunLinks::tenantlessView($run))
        ->assertOk()
        ->assertSee('Nightly backup')
        ->assertSee('Backup set #'.$backupSet->getKey());
});

it('keeps archived run references viewable with lifecycle-aware framing', function (): void {
    $activeTenant = Tenant::factory()->create([
        'name' => 'Active Tenant',
    ]);
    [$user, $activeTenant] = createUserWithTenant(tenant: $activeTenant, role: 'owner');
    $this->actingAs($user);

    $archivedTenant = Tenant::factory()->create([
        'name' => 'Archived Tenant',
        'workspace_id' => (int) $activeTenant->workspace_id,
    ]);

    createUserWithTenant(tenant: $archivedTenant, user: $user, role: 'owner');
    $archivedTenant->delete();

    $run = OperationRun::factory()->for($archivedTenant)->create([
        'workspace_id' => (int) $activeTenant->workspace_id,
        'type' => 'policy.sync',
    ]);

    Filament::setTenant(null, true);

    $this->withSession([WorkspaceContext::SESSION_KEY => (int) $activeTenant->workspace_id])
        ->get(OperationRunLinks::tenantlessView($run))
        ->assertOk()
        ->assertSee('Operation tenant is not available in the current tenant selector')
        ->assertSee('This tenant is currently archived')
        ->assertSee('Back to Operations')
        ->assertDontSee('← Back to Archived Tenant');
});

it('resolves legacy operation values to canonical operation metadata on read paths', function (): void {
    [$user, $tenant] = createUserWithTenant(role: 'owner');
    $this->actingAs($user);

    $run = OperationRun::factory()->for($tenant)->create([
        'workspace_id' => (int) $tenant->workspace_id,
        'type' => 'backup_schedule_run',
    ]);

    expect($run->canonicalOperationType())->toBe('backup.schedule.execute');

    $this->withSession([WorkspaceContext::SESSION_KEY => (int) $tenant->workspace_id])
        ->get(OperationRunLinks::tenantlessView($run))
        ->assertOk()
        ->assertSee('Backup schedule run')
        ->assertDontSee('backup_schedule_run');
});
