<?php

declare(strict_types=1);

use App\Models\BaselineProfile;
use App\Models\Policy;
use App\Models\PolicyVersion;
use App\Models\ManagedEnvironment;
use App\Support\Baselines\PolicyVersionCapturePurpose;
use Illuminate\Foundation\Testing\RefreshDatabase;

uses(RefreshDatabase::class);

it('prunes baseline-purpose policy versions past retention but keeps backups', function (): void {
    config()->set('tenantpilot.baselines.full_content_capture.retention_days', 30);

    $tenant = ManagedEnvironment::factory()->create();

    $policy = Policy::factory()->create([
        'managed_environment_id' => (int) $tenant->getKey(),
    ]);

    $profile = BaselineProfile::factory()->active()->create([
        'workspace_id' => (int) $tenant->workspace_id,
    ]);

    $oldBaselineCompare = PolicyVersion::factory()->create([
        'managed_environment_id' => (int) $tenant->getKey(),
        'policy_id' => (int) $policy->getKey(),
        'version_number' => 1,
        'capture_purpose' => PolicyVersionCapturePurpose::BaselineCompare->value,
        'baseline_profile_id' => (int) $profile->getKey(),
        'captured_at' => now()->subDays(45),
    ]);

    $oldBaselineCapture = PolicyVersion::factory()->create([
        'managed_environment_id' => (int) $tenant->getKey(),
        'policy_id' => (int) $policy->getKey(),
        'version_number' => 2,
        'capture_purpose' => PolicyVersionCapturePurpose::BaselineCapture->value,
        'baseline_profile_id' => (int) $profile->getKey(),
        'captured_at' => now()->subDays(45),
    ]);

    $recentBaselineCompare = PolicyVersion::factory()->create([
        'managed_environment_id' => (int) $tenant->getKey(),
        'policy_id' => (int) $policy->getKey(),
        'version_number' => 3,
        'capture_purpose' => PolicyVersionCapturePurpose::BaselineCompare->value,
        'baseline_profile_id' => (int) $profile->getKey(),
        'captured_at' => now()->subDays(10),
    ]);

    $oldBackup = PolicyVersion::factory()->create([
        'managed_environment_id' => (int) $tenant->getKey(),
        'policy_id' => (int) $policy->getKey(),
        'version_number' => 4,
        'capture_purpose' => PolicyVersionCapturePurpose::Backup->value,
        'captured_at' => now()->subDays(45),
    ]);

    $this->artisan('tenantpilot:baseline-evidence:prune')->assertExitCode(0);

    expect($oldBaselineCompare->refresh()->trashed())->toBeTrue();
    expect($oldBaselineCapture->refresh()->trashed())->toBeTrue();
    expect($recentBaselineCompare->refresh()->trashed())->toBeFalse();
    expect($oldBackup->refresh()->trashed())->toBeFalse();
});
