<?php

declare(strict_types=1);

namespace App\Services\Baselines\SnapshotRendering;

final readonly class RenderedSnapshot
{
    /**
     * @param  array<int, array{
     *   policyType: string,
     *   label: string,
     *   itemCount: int,
     *   fidelity: string,
     *   gapCount: int,
     *   capturedAt: ?string,
     *   coverageHint: ?string
     * }>  $summaryRows
     * @param  array<int, RenderedSnapshotGroup>  $groups
     * @param  array<string, mixed>  $technicalDetail
     */
    public function __construct(
        public int $snapshotId,
        public ?string $baselineProfileName,
        public ?string $capturedAt,
        public ?string $snapshotIdentityHash,
        public string $stateLabel,
        public string $fidelitySummary,
        public FidelityState $overallFidelity,
        public int $overallGapCount,
        public array $summaryRows,
        public array $groups,
        public array $technicalDetail,
        public bool $hasItems,
    ) {}

    /**
     * @return array{
     *   page: string,
     *   snapshot: array{
     *     snapshotId: int,
     *     baselineProfileName: ?string,
     *     capturedAt: ?string,
     *     snapshotIdentityHash: ?string,
     *     stateLabel: string,
     *     fidelitySummary: string,
     *     overallFidelity: string,
     *     overallGapCount: int
     *   },
     *   summaryRows: list<array{
     *     policyType: string,
     *     label: string,
     *     itemCount: int,
     *     fidelity: string,
     *     gapCount: int,
     *     capturedAt: ?string,
     *     coverageHint: ?string
     *   }>,
     *   groups: list<array{
     *     policyType: string,
     *     label: string,
     *     itemCount: int,
     *     fidelity: string,
     *     gapSummary: array{count: int, has_gaps: bool, messages: list<string>, badge_state: string},
     *     initiallyCollapsed: bool,
     *     items: list<array{
     *       label: string,
     *       typeLabel: string,
     *       identityHint: string,
     *       referenceStatus: string,
     *       fidelity: string,
     *       gapSummary: array{count: int, has_gaps: bool, messages: list<string>, badge_state: string},
     *       observedAt: ?string,
     *       sourceReference: ?string,
     *       structuredAttributes: list<array{label: string, value: string, priority: string}>
     *     }>,
     *     renderingError: ?string,
     *     coverageHint: ?string,
     *     capturedAt: ?string,
     *     technicalPayload: array<string, mixed>
     *   }>,
     *   technicalDetail: array<string, mixed>,
     *   hasItems: bool
     * }
     */
    public function toArray(): array
    {
        return [
            'page' => 'baseline-snapshot-detail',
            'snapshot' => [
                'snapshotId' => $this->snapshotId,
                'baselineProfileName' => $this->baselineProfileName,
                'capturedAt' => $this->capturedAt,
                'snapshotIdentityHash' => $this->snapshotIdentityHash,
                'stateLabel' => $this->stateLabel,
                'fidelitySummary' => $this->fidelitySummary,
                'overallFidelity' => $this->overallFidelity->value,
                'overallGapCount' => $this->overallGapCount,
            ],
            'summaryRows' => $this->summaryRows,
            'groups' => array_map(
                static fn (RenderedSnapshotGroup $group): array => $group->toArray(),
                $this->groups,
            ),
            'technicalDetail' => $this->technicalDetail,
            'hasItems' => $this->hasItems,
        ];
    }
}
