<?php

declare(strict_types=1);

namespace App\Services\EnvironmentReviews;

use App\Models\EvidenceSnapshot;
use App\Models\ManagedEnvironment;
use Illuminate\Support\Arr;

final class EnvironmentReviewFingerprint
{
    public function forSnapshot(ManagedEnvironment $tenant, EvidenceSnapshot $snapshot): string
    {
        $summary = is_array($snapshot->summary) ? $snapshot->summary : [];

        $payload = [
            'managed_environment_id' => (int) $tenant->getKey(),
            'workspace_id' => (int) $tenant->workspace_id,
            'evidence_snapshot_id' => (int) $snapshot->getKey(),
            'snapshot_fingerprint' => (string) $snapshot->fingerprint,
            'snapshot_completeness' => (string) $snapshot->completeness_state,
            'dimension_states' => collect(Arr::wrap($summary['dimensions'] ?? []))
                ->map(static fn (mixed $dimension): array => [
                    'key' => (string) data_get($dimension, 'key'),
                    'state' => (string) data_get($dimension, 'state'),
                    'required' => (bool) data_get($dimension, 'required', false),
                ])
                ->sortBy('key')
                ->values()
                ->all(),
            'counts' => [
                'finding_count' => (int) ($summary['finding_count'] ?? 0),
                'report_count' => (int) ($summary['report_count'] ?? 0),
                'operation_count' => (int) ($summary['operation_count'] ?? 0),
            ],
        ];

        return hash('sha256', json_encode($payload, JSON_THROW_ON_ERROR));
    }
}
