<?php

declare(strict_types=1);

use App\Models\OperationRun;
use App\Models\ManagedEnvironment;
use App\Models\User;
use App\Services\OperationRunService;
use App\Services\Operations\BulkSelectionIdentity;

it('reuses an active bulk run without dispatching twice', function (): void {
    $entraTenantId = '00000000-0000-0000-0000-000000000001';
    $tenant = ManagedEnvironment::factory()->create(['managed_environment_id' => $entraTenantId]);
    $user = User::factory()->create();

    $selectionIdentity = app(BulkSelectionIdentity::class)->fromIds(['a', 'b', 'c']);

    $service = app(OperationRunService::class);

    $dispatchCount = 0;

    $runA = $service->enqueueBulkOperation(
        tenant: $tenant,
        type: 'policy.delete',
        targetScope: ['entra_tenant_id' => $entraTenantId],
        selectionIdentity: $selectionIdentity,
        dispatcher: function () use (&$dispatchCount): void {
            $dispatchCount++;
        },
        initiator: $user,
    );

    $runB = $service->enqueueBulkOperation(
        tenant: $tenant,
        type: 'policy.delete',
        targetScope: ['entra_tenant_id' => $entraTenantId],
        selectionIdentity: $selectionIdentity,
        dispatcher: function () use (&$dispatchCount): void {
            $dispatchCount++;
        },
        initiator: $user,
    );

    expect($runA->getKey())->toBe($runB->getKey());
    expect($dispatchCount)->toBe(1);

    expect(OperationRun::query()->where('managed_environment_id', $tenant->id)->count())->toBe(1);
})->group('ops-ux');

it('passes the OperationRun to the dispatcher when accepted', function (): void {
    $entraTenantId = '00000000-0000-0000-0000-000000000001';
    $tenant = ManagedEnvironment::factory()->create(['managed_environment_id' => $entraTenantId]);
    $user = User::factory()->create();

    $selectionIdentity = app(BulkSelectionIdentity::class)->fromIds(['a']);

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

    $receivedId = null;

    $run = $service->enqueueBulkOperation(
        tenant: $tenant,
        type: 'policy.delete',
        targetScope: ['entra_tenant_id' => $entraTenantId],
        selectionIdentity: $selectionIdentity,
        dispatcher: function (OperationRun $operationRun) use (&$receivedId): void {
            $receivedId = $operationRun->getKey();
        },
        initiator: $user,
    );

    expect($receivedId)->toBe($run->getKey());
})->group('ops-ux');
