<?php

declare(strict_types=1);

use App\Filament\Resources\BackupScheduleResource\Pages\EditBackupSchedule;
use App\Filament\Resources\BackupScheduleResource\RelationManagers\BackupScheduleOperationRunsRelationManager;
use App\Models\BackupSchedule;
use App\Models\OperationRun;
use Filament\Facades\Filament;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Livewire\Livewire;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

uses(RefreshDatabase::class);

function makeBackupScheduleForTenant(\App\Models\ManagedEnvironment $tenant, string $name): BackupSchedule
{
    return BackupSchedule::query()->create([
        'managed_environment_id' => (int) $tenant->getKey(),
        'name' => $name,
        'is_enabled' => true,
        'timezone' => 'UTC',
        'frequency' => 'daily',
        'time_of_day' => '01:00:00',
        'days_of_week' => null,
        'policy_types' => ['deviceConfiguration'],
        'include_foundations' => true,
        'retention_keep_last' => 30,
    ]);
}

it('shows only operation runs belonging to the owner backup schedule', function (): void {
    [$user, $tenant] = createUserWithTenant(role: 'owner');

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

    $scheduleA = makeBackupScheduleForTenant($tenant, 'Schedule A');
    $scheduleB = makeBackupScheduleForTenant($tenant, 'Schedule B');

    $runA = OperationRun::factory()->forTenant($tenant)->create([
        'type' => 'backup_schedule_run',
        'context' => ['backup_schedule_id' => (int) $scheduleA->getKey()],
    ]);
    $runB = OperationRun::factory()->forTenant($tenant)->create([
        'type' => 'backup_schedule_run',
        'context' => ['backup_schedule_id' => (int) $scheduleB->getKey()],
    ]);

    Livewire::test(BackupScheduleOperationRunsRelationManager::class, [
        'ownerRecord' => $scheduleA,
        'pageClass' => EditBackupSchedule::class,
    ])
        ->assertCanSeeTableRecords([$runA])
        ->assertCanNotSeeTableRecords([$runB]);
});

it('returns 404 when a forged same-tenant run key is mounted on the wrong schedule relation manager', function (): void {
    [$user, $tenant] = createUserWithTenant(role: 'owner');

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

    $scheduleA = makeBackupScheduleForTenant($tenant, 'Schedule A');
    $scheduleB = makeBackupScheduleForTenant($tenant, 'Schedule B');

    $foreignRun = OperationRun::factory()->forTenant($tenant)->create([
        'type' => 'backup_schedule_run',
        'context' => ['backup_schedule_id' => (int) $scheduleB->getKey()],
    ]);

    $component = Livewire::test(BackupScheduleOperationRunsRelationManager::class, [
        'ownerRecord' => $scheduleA,
        'pageClass' => EditBackupSchedule::class,
    ]);

    $table = $component->instance()->getTable();

    expect(fn () => $table->getRecordUrl($foreignRun))
        ->toThrow(NotFoundHttpException::class);
});
