<?php

use App\Models\Policy;
use App\Models\PolicyVersion;
use App\Models\ManagedEnvironment;
use Illuminate\Foundation\Testing\RefreshDatabase;

uses(RefreshDatabase::class);
test('pruneEligible returns only old non-current versions', function () {
    $tenant = ManagedEnvironment::factory()->create();
    $policy = Policy::factory()->create(['managed_environment_id' => $tenant->id]);

    $oldNonCurrent = PolicyVersion::factory()->create([
        'managed_environment_id' => $tenant->id,
        'policy_id' => $policy->id,
        'version_number' => 1,
        'captured_at' => now()->subDays(120),
    ]);

    PolicyVersion::factory()->create([
        'managed_environment_id' => $tenant->id,
        'policy_id' => $policy->id,
        'version_number' => 2,
        'captured_at' => now()->subDays(10),
    ]);

    $eligibleIds = PolicyVersion::query()
        ->where('managed_environment_id', $tenant->id)
        ->pruneEligible(90)
        ->pluck('id')
        ->all();

    expect($eligibleIds)->toBe([$oldNonCurrent->id]);
});

test('pruneEligible excludes current even when old', function () {
    $tenant = ManagedEnvironment::factory()->create();
    $policy = Policy::factory()->create(['managed_environment_id' => $tenant->id]);

    PolicyVersion::factory()->create([
        'managed_environment_id' => $tenant->id,
        'policy_id' => $policy->id,
        'version_number' => 1,
        'captured_at' => now()->subDays(120),
    ]);

    $eligibleCount = PolicyVersion::query()
        ->where('managed_environment_id', $tenant->id)
        ->pruneEligible(90)
        ->count();

    expect($eligibleCount)->toBe(0);
});

test('pruneEligible excludes archived versions', function () {
    $tenant = ManagedEnvironment::factory()->create();
    $policy = Policy::factory()->create(['managed_environment_id' => $tenant->id]);

    $archived = PolicyVersion::factory()->create([
        'managed_environment_id' => $tenant->id,
        'policy_id' => $policy->id,
        'version_number' => 1,
        'captured_at' => now()->subDays(120),
    ]);

    PolicyVersion::factory()->create([
        'managed_environment_id' => $tenant->id,
        'policy_id' => $policy->id,
        'version_number' => 2,
        'captured_at' => now()->subDays(120),
    ]);

    $archived->delete();

    $eligibleIds = PolicyVersion::query()
        ->where('managed_environment_id', $tenant->id)
        ->pruneEligible(90)
        ->pluck('id')
        ->all();

    expect($eligibleIds)->not->toContain($archived->id);
});
