<?php

declare(strict_types=1);

use App\Models\OperationRun;
use App\Models\PlatformUser;
use App\Models\ManagedEnvironment;
use App\Models\User;
use App\Support\Auth\PlatformCapabilities;
use App\Support\OperationRunOutcome;
use App\Support\OperationRunStatus;
use App\Support\System\SystemOperationRunLinks;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\Feature\Concerns\BuildsGovernanceArtifactTruthFixtures;

uses(RefreshDatabase::class, BuildsGovernanceArtifactTruthFixtures::class);

it('forbids failures page when platform.operations.view is missing', function () {
    $platformUser = PlatformUser::factory()->create([
        'capabilities' => [
            PlatformCapabilities::ACCESS_SYSTEM_PANEL,
        ],
        'is_active' => true,
    ]);

    $this->actingAs($platformUser, 'platform')
        ->get('/system/ops/failures')
        ->assertForbidden();
});

it('prefilters failures page to failed runs', function () {
    $failedRun = OperationRun::factory()->create([
        'status' => OperationRunStatus::Completed->value,
        'outcome' => OperationRunOutcome::Failed->value,
        'type' => 'inventory_sync',
        'context' => [
            'reconciliation' => [
                'reconciled_at' => now()->toIso8601String(),
                'reason' => 'run.infrastructure_timeout_or_abandonment',
                'reason_code' => 'run.infrastructure_timeout_or_abandonment',
                'source' => 'failed_callback',
            ],
        ],
    ]);

    $succeededRun = OperationRun::factory()->create([
        'status' => OperationRunStatus::Completed->value,
        'outcome' => OperationRunOutcome::Succeeded->value,
        'type' => 'inventory_sync',
    ]);

    $platformUser = PlatformUser::factory()->create([
        'capabilities' => [
            PlatformCapabilities::ACCESS_SYSTEM_PANEL,
            PlatformCapabilities::OPERATIONS_VIEW,
        ],
        'is_active' => true,
    ]);

    $this->actingAs($platformUser, 'platform')
        ->get('/system/ops/failures')
        ->assertSuccessful()
        ->assertSee('Failed operations')
        ->assertSee('Show all operations')
        ->assertSee('Automatically reconciled')
        ->assertSee(SystemOperationRunLinks::view($failedRun))
        ->assertDontSee(SystemOperationRunLinks::view($succeededRun));
});

it('renders governance artifact failures without resolving tenant artifact routes on the system panel', function () {
    $tenant = ManagedEnvironment::factory()->create();
    $initiator = User::factory()->create();

    $evidenceRun = $this->makeArtifactTruthRun(
        tenant: $tenant,
        type: 'tenant.evidence.snapshot.generate',
        attributes: [
            'status' => OperationRunStatus::Completed->value,
            'outcome' => OperationRunOutcome::Failed->value,
            'failure_summary' => [
                ['code' => 'operation.failed', 'message' => 'Evidence generation failed'],
            ],
        ],
    );

    $evidenceSnapshot = $this->makeArtifactTruthEvidenceSnapshot($tenant, [
        'operation_run_id' => (int) $evidenceRun->getKey(),
    ]);

    $reviewRun = $this->makeArtifactTruthRun(
        tenant: $tenant,
        type: 'environment.review.compose',
        attributes: [
            'status' => OperationRunStatus::Completed->value,
            'outcome' => OperationRunOutcome::Failed->value,
            'failure_summary' => [
                ['code' => 'operation.failed', 'message' => 'Review composition failed'],
            ],
        ],
    );

    $review = $this->makeArtifactTruthReview(
        tenant: $tenant,
        user: $initiator,
        snapshot: $evidenceSnapshot,
        reviewOverrides: [
            'operation_run_id' => (int) $reviewRun->getKey(),
        ],
    );

    $packRun = $this->makeArtifactTruthRun(
        tenant: $tenant,
        type: 'environment.review_pack.generate',
        attributes: [
            'status' => OperationRunStatus::Completed->value,
            'outcome' => OperationRunOutcome::Failed->value,
            'failure_summary' => [
                ['code' => 'operation.failed', 'message' => 'Review pack generation failed'],
            ],
        ],
    );

    $this->makeArtifactTruthReviewPack(
        tenant: $tenant,
        user: $initiator,
        snapshot: $evidenceSnapshot,
        review: $review,
        packOverrides: [
            'operation_run_id' => (int) $packRun->getKey(),
        ],
    );

    $platformUser = PlatformUser::factory()->create([
        'capabilities' => [
            PlatformCapabilities::ACCESS_SYSTEM_PANEL,
            PlatformCapabilities::OPERATIONS_VIEW,
        ],
        'is_active' => true,
    ]);

    $this->actingAs($platformUser, 'platform')
        ->get('/system/ops/failures')
        ->assertSuccessful()
        ->assertSee('Evidence snapshot generation')
        ->assertSee('Review composition')
        ->assertSee('Review pack generation');
});
