<?php

declare(strict_types=1);

use App\Models\EvidenceSnapshot;
use App\Services\EnvironmentReviews\EnvironmentReviewLifecycleService;
use App\Support\EnvironmentReviewStatus;

it('creates a successor draft from a published environment review without mutating the published review body', function (): void {
    [$user, $tenant] = createUserWithTenant(role: 'owner');
    $publishedReview = app(EnvironmentReviewLifecycleService::class)->publish(
        composeEnvironmentReviewForTest($tenant, $user),
        $user,
        'Ready for the next review cycle.',
    );

    EvidenceSnapshot::query()
        ->where('managed_environment_id', (int) $tenant->getKey())
        ->where('status', 'active')
        ->update([
            'status' => 'expired',
            'expires_at' => now(),
        ]);

    $nextSnapshot = seedEnvironmentReviewEvidence(
        tenant: $tenant,
        findingCount: 5,
        driftCount: 2,
        operationRunCount: 2,
    );

    $nextReview = app(EnvironmentReviewLifecycleService::class)->createNextReview($publishedReview, $user, $nextSnapshot);
    $publishedReview->refresh();

    expect((int) $nextReview->getKey())->not->toBe((int) $publishedReview->getKey())
        ->and($nextReview->isMutable())->toBeTrue()
        ->and($nextReview->evidence_snapshot_id)->toBe((int) $nextSnapshot->getKey());

    expect($publishedReview->status)->toBe(EnvironmentReviewStatus::Superseded->value)
        ->and($publishedReview->superseded_by_review_id)->toBe((int) $nextReview->getKey())
        ->and($publishedReview->published_at)->not->toBeNull();
});
