<?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 EntraAdminRolesSource implements EvidenceSourceProvider
{
    public function key(): string
    {
        return 'entra_admin_roles';
    }

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

        $payload = is_array($report?->payload) ? $report->payload : [];
        $roles = is_array($payload['roles'] ?? null) ? $payload['roles'] : [];

        return [
            'dimension_key' => $this->key(),
            'state' => $report instanceof StoredReport ? EvidenceCompletenessState::Complete->value : EvidenceCompletenessState::Missing->value,
            'required' => true,
            'source_kind' => 'stored_report',
            'source_record_type' => 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' => [
                'role_count' => count($roles),
                'roles' => $roles,
            ],
            'fingerprint_payload' => [
                'fingerprint' => $report?->fingerprint,
                'role_count' => count($roles),
            ],
            'sort_order' => 30,
        ];
    }
}
