<?php

use App\Filament\Resources\RestoreRunResource\Pages\ListRestoreRuns;
use App\Models\BackupSet;
use App\Models\RestoreRun;
use Filament\Facades\Filament;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Livewire\Livewire;

uses(RefreshDatabase::class);

test('rerun action is disabled when rbac_status is null', function () {
    [$user, $tenant] = createUserWithTenant(role: 'owner');

    $tenant->update([
        'rbac_status' => null,
        'rbac_last_checked_at' => null,
    ]);

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

    $restoreRun = RestoreRun::factory()->create([
        'managed_environment_id' => $tenant->id,
        'backup_set_id' => $backupSet->id,
        'status' => 'completed',
    ]);

    $this->actingAs($user);
    $tenant->makeCurrent();
    Filament::setTenant($tenant, true);

    Livewire::test(ListRestoreRuns::class)
        ->assertTableActionDisabled('rerun', $restoreRun);
});

test('rerun action is enabled when rbac_status is ok and fresh', function () {
    [$user, $tenant] = createUserWithTenant(role: 'owner');

    $tenant->update([
        'rbac_status' => 'ok',
        'rbac_last_checked_at' => now()->subMinutes(30),
    ]);

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

    $restoreRun = RestoreRun::factory()->create([
        'managed_environment_id' => $tenant->id,
        'backup_set_id' => $backupSet->id,
        'status' => 'completed',
    ]);

    $this->actingAs($user);
    $tenant->makeCurrent();
    Filament::setTenant($tenant, true);

    Livewire::test(ListRestoreRuns::class)
        ->assertTableActionEnabled('rerun', $restoreRun);
});

test('rerun action tooltip contains reason when blocked', function () {
    [$user, $tenant] = createUserWithTenant(role: 'owner');

    $tenant->update([
        'rbac_status' => 'not_configured',
        'rbac_last_checked_at' => null,
    ]);

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

    $restoreRun = RestoreRun::factory()->create([
        'managed_environment_id' => $tenant->id,
        'backup_set_id' => $backupSet->id,
        'status' => 'completed',
    ]);

    $this->actingAs($user);
    $tenant->makeCurrent();
    Filament::setTenant($tenant, true);

    Livewire::test(ListRestoreRuns::class)
        ->assertTableActionExists(
            'rerun',
            fn ($action): bool => str_contains((string) $action->getTooltip(), 'not configured'),
            $restoreRun
        );
});
