<?php

use App\Models\BackupSet;
use App\Models\RestoreRun;
use App\Models\ManagedEnvironment;
use Illuminate\Foundation\Testing\RefreshDatabase;

uses(RefreshDatabase::class);
test('deletable scope includes only finished statuses', function () {
    $tenant = ManagedEnvironment::factory()->create();

    $backupSet = BackupSet::create([
        'managed_environment_id' => $tenant->id,
        'name' => 'Backup',
        'status' => 'completed',
        'item_count' => 0,
    ]);

    $statuses = [
        'completed',
        'failed',
        'aborted',
        'completed_with_errors',
        'partial',
        'previewed',
        'running',
        'pending',
    ];

    foreach ($statuses as $status) {
        RestoreRun::create([
            'managed_environment_id' => $tenant->id,
            'backup_set_id' => $backupSet->id,
            'status' => $status,
            'is_dry_run' => true,
            'requested_by' => 'tester@example.com',
        ]);
    }

    $deletableStatuses = RestoreRun::query()
        ->deletable()
        ->pluck('status')
        ->unique()
        ->sort()
        ->values()
        ->all();

    expect($deletableStatuses)->toBe([
        'aborted',
        'completed',
        'completed_with_errors',
        'failed',
        'partial',
        'previewed',
    ]);
});

test('isDeletable accepts partial even if status casing/format differs', function () {
    $tenant = ManagedEnvironment::factory()->create();

    $backupSet = BackupSet::create([
        'managed_environment_id' => $tenant->id,
        'name' => 'Backup',
        'status' => 'completed',
        'item_count' => 0,
    ]);

    $partial = RestoreRun::create([
        'managed_environment_id' => $tenant->id,
        'backup_set_id' => $backupSet->id,
        'status' => 'Partial',
        'is_dry_run' => true,
        'requested_by' => 'tester@example.com',
    ]);

    $completedWithErrors = RestoreRun::create([
        'managed_environment_id' => $tenant->id,
        'backup_set_id' => $backupSet->id,
        'status' => 'completed-with-errors',
        'is_dry_run' => true,
        'requested_by' => 'tester@example.com',
    ]);

    expect($partial->isDeletable())->toBeTrue();
    expect($completedWithErrors->isDeletable())->toBeTrue();
});
