<?php

declare(strict_types=1);

namespace App\Services\Evidence\Sources;

use App\Models\StoredReport;
use App\Models\ManagedEnvironment;
use App\Services\Evidence\Contracts\EvidenceSourceProvider;
use App\Support\Evidence\EvidenceCompletenessState;

final class PermissionPostureSource implements EvidenceSourceProvider
{
    public function key(): string
    {
        return 'permission_posture';
    }

    public function collect(ManagedEnvironment $tenant): array
    {
        $report = StoredReport::query()
            ->where('managed_environment_id', (int) $tenant->getKey())
            ->where('report_type', StoredReport::REPORT_TYPE_PERMISSION_POSTURE)
            ->latest('id')
            ->first();

        $payload = is_array($report?->payload) ? $report->payload : [];
        $requiredCount = (int) ($payload['required_count'] ?? 0);
        $grantedCount = (int) ($payload['granted_count'] ?? 0);

        $state = match (true) {
            ! $report instanceof StoredReport => EvidenceCompletenessState::Missing->value,
            $requiredCount > 0 && $grantedCount < $requiredCount => EvidenceCompletenessState::Partial->value,
            default => EvidenceCompletenessState::Complete->value,
        };

        return [
            'dimension_key' => $this->key(),
            'state' => $state,
            'required' => true,
            'source_kind' => 'stored_report',
            'source_record_type' => $report instanceof StoredReport ? StoredReport::class : StoredReport::class,
            'source_record_id' => $report instanceof StoredReport ? (string) $report->getKey() : null,
            'source_fingerprint' => $report?->fingerprint,
            'measured_at' => $report?->updated_at,
            'freshness_at' => $report?->updated_at,
            'summary_payload' => [
                'posture_score' => $payload['posture_score'] ?? null,
                'required_count' => $requiredCount,
                'granted_count' => $grantedCount,
                'payload' => $payload,
            ],
            'fingerprint_payload' => [
                'fingerprint' => $report?->fingerprint,
                'required_count' => $requiredCount,
                'granted_count' => $grantedCount,
            ],
            'sort_order' => 20,
        ];
    }
}
