<?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 completes with errors when some policies cannot be exported', function () {
    $tenant = ManagedEnvironment::factory()->create();
    $user = User::factory()->create();

    $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(),
    ]);

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

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

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

    (new BulkPolicyExportJob(
        tenantId: (int) $tenant->getKey(),
        userId: (int) $user->getKey(),
        policyIds: [$okPolicy->id, $missingVersionPolicy->id],
        backupName: 'Failures Backup',
        operationRun: $opRun,
    ))->handle($service);

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

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