<?php

declare(strict_types=1);

use App\Models\BackupSet;
use App\Models\ManagedEnvironment;
use App\Models\OperationRun;
use App\Support\OperationRunLinks;
use App\Support\Workspaces\WorkspaceContext;

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 {
    $activeEnvironment = ManagedEnvironment::factory()->create([
        'name' => 'Active ManagedEnvironment',
    ]);
    [$user, $activeEnvironment] = createUserWithTenant(tenant: $activeEnvironment, role: 'owner');
    $this->actingAs($user);

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

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

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

    setAdminPanelContext();

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

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');
});
