<?php

declare(strict_types=1);

use App\Listeners\SyncRestoreRunToOperationRun;
use App\Models\BackupSet;
use App\Models\OperationRun;
use App\Models\RestoreRun;
use App\Models\ManagedEnvironment;

it('syncs a completed restore run to a completed operation run', function (): void {
    $tenant = ManagedEnvironment::factory()->create();

    $backupSet = BackupSet::factory()->create([
        'managed_environment_id' => $tenant->getKey(),
    ]);

    $restoreRun = RestoreRun::factory()->create([
        'managed_environment_id' => $tenant->getKey(),
        'backup_set_id' => $backupSet->getKey(),
        'status' => 'completed',
        'is_dry_run' => false,
        'metadata' => [
            'total' => 10,
            'succeeded' => 8,
            'failed' => 1,
            'skipped' => 1,
        ],
        // Intentionally malformed outcomes to ensure sync never explodes.
        'results' => [
            'items' => [
                '123' => [
                    'assignment_outcomes' => ['not-an-array'],
                ],
            ],
        ],
    ]);

    app(SyncRestoreRunToOperationRun::class)->handle($restoreRun);

    $opRun = OperationRun::query()
        ->where('managed_environment_id', $tenant->getKey())
        ->where('type', 'restore.execute')
        ->where('context->restore_run_id', $restoreRun->getKey())
        ->first();

    expect($opRun)->not->toBeNull();
    expect($opRun?->status)->toBe('completed');
    expect($opRun?->outcome)->toBe('succeeded');

    expect((int) ($restoreRun->refresh()->operation_run_id ?? 0))->toBe((int) ($opRun?->getKey() ?? 0));

    expect($opRun?->summary_counts['total'] ?? null)->toBe(10);
    expect($opRun?->summary_counts['succeeded'] ?? null)->toBe(8);
    expect($opRun?->summary_counts['failed'] ?? null)->toBe(1);
    expect($opRun?->summary_counts['skipped'] ?? null)->toBe(1);

    expect($opRun?->completed_at)->not->toBeNull();
})->group('ops-ux');
