<?php

use App\Jobs\BulkPolicyExportJob;
use App\Models\OperationRun;
use App\Models\Policy;
use App\Models\PolicyVersion;
use App\Models\ManagedEnvironment;
use App\Models\User;
use App\Services\OperationRunService;
use Illuminate\Foundation\Testing\RefreshDatabase;

uses(RefreshDatabase::class);
test('bulk export aborts when more than half of items fail', function () {
    $tenant = ManagedEnvironment::factory()->create();
    $user = User::factory()->create();

    // 4 items total -> failure threshold is floor(4/2)=2, so 3 failures triggers circuit breaker.
    $okPolicy = Policy::factory()->create(['managed_environment_id' => $tenant->id]);
    PolicyVersion::create([
        'managed_environment_id' => $tenant->id,
        'policy_id' => $okPolicy->id,
        'policy_type' => $okPolicy->policy_type,
        'version_number' => 1,
        'snapshot' => ['ok' => true],
        'captured_at' => now(),
    ]);

    $failA = Policy::factory()->create(['managed_environment_id' => $tenant->id]);
    $failB = Policy::factory()->create(['managed_environment_id' => $tenant->id]);
    $failC = Policy::factory()->create(['managed_environment_id' => $tenant->id]);

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

    $policyIds = [$okPolicy->id, $failA->id, $failB->id, $failC->id];
    $opRun = $service->ensureRun(
        tenant: $tenant,
        type: 'policy.export',
        inputs: [
            'scope' => 'subset',
            'policy_ids' => $policyIds,
        ],
        initiator: $user,
    );

    (new BulkPolicyExportJob(
        tenantId: (int) $tenant->getKey(),
        userId: (int) $user->getKey(),
        policyIds: $policyIds,
        backupName: 'Circuit Breaker Backup',
        operationRun: $opRun,
    ))->handle($service);

    $opRun->refresh();
    expect($opRun)->toBeInstanceOf(OperationRun::class);
    expect($opRun->status)->toBe('completed');
    expect($opRun->outcome)->toBe('failed');
    expect($opRun->failure_summary)->not->toBeEmpty();

    $this->assertDatabaseHas('backup_sets', [
        'managed_environment_id' => $tenant->id,
        'name' => 'Circuit Breaker Backup',
        'status' => 'failed',
    ]);
});
