<?php

declare(strict_types=1);

namespace App\Services\Baselines\SnapshotRendering;

final readonly class RenderedSnapshotGroup
{
    /**
     * @param  array<int, RenderedSnapshotItem>  $items
     * @param  array<string, mixed>  $technicalPayload
     * @param  array<string, mixed>  $subjectDescriptor
     */
    public function __construct(
        public string $policyType,
        public string $label,
        public int $itemCount,
        public FidelityState $fidelity,
        public GapSummary $gapSummary,
        public bool $initiallyCollapsed,
        public array $items,
        public ?string $renderingError = null,
        public ?string $coverageHint = null,
        public ?string $capturedAt = null,
        public array $technicalPayload = [],
        public array $subjectDescriptor = [],
    ) {}

    /**
     * @return 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>,
    *   subjectDescriptor: array<string, mixed>
     * }
     */
    public function toArray(): array
    {
        return [
            'policyType' => $this->policyType,
            'label' => $this->label,
            'itemCount' => $this->itemCount,
            'fidelity' => $this->fidelity->value,
            'gapSummary' => $this->gapSummary->toArray(),
            'initiallyCollapsed' => $this->initiallyCollapsed,
            'items' => array_map(
                static fn (RenderedSnapshotItem $item): array => $item->toArray(),
                $this->items,
            ),
            'renderingError' => $this->renderingError,
            'coverageHint' => $this->coverageHint,
            'capturedAt' => $this->capturedAt,
            'technicalPayload' => $this->technicalPayload,
            'subjectDescriptor' => $this->subjectDescriptor,
        ];
    }
}
