<?php

use App\Filament\Resources\BackupSetResource\RelationManagers\BackupItemsRelationManager;
use App\Jobs\RemovePoliciesFromBackupSetJob;
use App\Models\BackupItem;
use App\Models\BackupSet;
use App\Models\OperationRun;
use App\Models\Policy;
use App\Models\ManagedEnvironment;
use Filament\Facades\Filament;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Queue;
use Livewire\Livewire;

uses(RefreshDatabase::class);

test('backup items table can bulk remove selected items', function () {
    Queue::fake();

    $tenant = ManagedEnvironment::factory()->create();
    $tenant->makeCurrent();
    Filament::setTenant($tenant, true);

    [$user] = createUserWithTenant(tenant: $tenant, role: 'owner');

    $backupSet = BackupSet::factory()->create([
        'managed_environment_id' => $tenant->id,
        'name' => 'Test backup',
        'item_count' => 0,
    ]);

    $policyA = Policy::factory()->create([
        'managed_environment_id' => $tenant->id,
        'ignored_at' => null,
        'last_synced_at' => now(),
    ]);

    $policyB = Policy::factory()->create([
        'managed_environment_id' => $tenant->id,
        'ignored_at' => null,
        'last_synced_at' => now(),
    ]);

    $itemA = BackupItem::factory()->create([
        'managed_environment_id' => $tenant->id,
        'backup_set_id' => $backupSet->id,
        'policy_id' => $policyA->id,
        'policy_identifier' => $policyA->external_id,
        'policy_type' => $policyA->policy_type,
        'platform' => $policyA->platform,
    ]);

    $itemB = BackupItem::factory()->create([
        'managed_environment_id' => $tenant->id,
        'backup_set_id' => $backupSet->id,
        'policy_id' => $policyB->id,
        'policy_identifier' => $policyB->external_id,
        'policy_type' => $policyB->policy_type,
        'platform' => $policyB->platform,
    ]);

    $backupSet->update(['item_count' => $backupSet->items()->count()]);
    expect($backupSet->refresh()->item_count)->toBe(2);

    Livewire::actingAs($user)
        ->test(BackupItemsRelationManager::class, [
            'ownerRecord' => $backupSet,
            'pageClass' => \App\Filament\Resources\BackupSetResource\Pages\ViewBackupSet::class,
        ])
        ->callTableBulkAction('bulk_remove', collect([$itemA, $itemB]))
        ->assertHasNoTableBulkActionErrors();

    Queue::assertPushed(RemovePoliciesFromBackupSetJob::class);

    $run = OperationRun::query()
        ->where('managed_environment_id', $tenant->getKey())
        ->where('type', 'backup_set.update')
        ->latest('id')
        ->first();

    expect($run)->not->toBeNull();
    expect($run?->status)->toBe('queued');
    expect($run?->outcome)->toBe('pending');
    expect($run?->context['backup_set_id'] ?? null)->toBe((int) $backupSet->getKey());

    // Enqueue-only: deletion happens in the job.
    $backupSet->refresh();
    expect($backupSet->items()->count())->toBe(2);
    expect($backupSet->item_count)->toBe(2);
});
