<?php

use App\Jobs\BulkPolicyDeleteJob;
use App\Models\OperationRun;
use App\Models\Policy;
use App\Models\ManagedEnvironment;
use App\Models\User;
use App\Services\OperationRunService;
use App\Services\Operations\BulkSelectionIdentity;
use Illuminate\Foundation\Testing\RefreshDatabase;

uses(RefreshDatabase::class);

test('bulk delete sync execution updates policies immediately', function () {
    $tenant = ManagedEnvironment::factory()->create();
    $user = User::factory()->create();
    createUserWithTenant(tenant: $tenant, user: $user, role: 'owner');
    $policies = Policy::factory()->count(10)->create(['managed_environment_id' => $tenant->id]);
    $policyIds = $policies->pluck('id')->toArray();

    /** @var OperationRunService $service */
    $service = app(OperationRunService::class);

    /** @var BulkSelectionIdentity $selection */
    $selection = app(BulkSelectionIdentity::class);

    $selectionIdentity = $selection->fromIds($policyIds);

    $opRun = $service->enqueueBulkOperation(
        tenant: $tenant,
        type: 'policy.delete',
        targetScope: [
            'entra_tenant_id' => (string) ($tenant->managed_environment_id ?? $tenant->external_id ?? $tenant->getKey()),
        ],
        selectionIdentity: $selectionIdentity,
        dispatcher: function ($operationRun) use ($tenant, $user, $policyIds): void {
            // Simulate sync execution (workers will run immediately on sync queue)
            BulkPolicyDeleteJob::dispatchSync(
                tenantId: (int) $tenant->getKey(),
                userId: (int) $user->getKey(),
                policyIds: $policyIds,
                operationRun: $operationRun,
            );
        },
        initiator: $user,
        emitQueuedNotification: false,
    );

    $opRun->refresh();
    expect($opRun)->toBeInstanceOf(OperationRun::class);
    expect($opRun->status)->toBe('completed');
    expect($opRun->outcome)->toBe('succeeded');
    expect($opRun->summary_counts)->toMatchArray([
        'total' => 10,
        'processed' => 10,
        'succeeded' => 10,
    ]);

    expect(($opRun->summary_counts['failed'] ?? 0))->toBe(0);

    $policies->each(function ($policy) {
        expect($policy->refresh()->ignored_at)->not->toBeNull();
    });
});
