<?php

declare(strict_types=1);

namespace App\Support\Ui\EnterpriseDetail;

final readonly class EnterpriseDetailPageData
{
    /**
     * @param  array{
     *      title?: string,
     *      description?: ?string,
     *      facts?: list<array<string, mixed>>,
     *      primaryNextStep?: array{
     *          label?: string,
     *          text: string,
     *          source: string,
     *          secondaryGuidance?: list<array{label: string, text: string, source: string}>
     *      },
     *      compactCounts?: array{
     *          summaryLine?: ?string,
     *          primaryFacts?: list<array<string, mixed>>,
     *          diagnosticFacts?: list<array<string, mixed>>
     *      },
     *      attentionNote?: ?string
     * }|null  $decisionZone
     * @param  list<DetailSectionData>  $mainSections
     * @param  list<SupportingCardData>  $supportingGroups
     * @param  list<TechnicalDetailData>  $technicalSections
     * @param  list<array{title: string, description?: ?string, icon?: ?string}>  $emptyStateNotes
     */
    public function __construct(
        public string $resourceType,
        public string $scope,
        public SummaryHeaderData $header,
        public ?array $decisionZone = null,
        public array $mainSections = [],
        public array $supportingGroups = [],
        public array $technicalSections = [],
        public array $emptyStateNotes = [],
    ) {}

    /**
     * @return array{
     *     resourceType: string,
     *     scope: string,
     *     header: array{
     *         title: string,
     *         subtitle: ?string,
     *         statusBadges: list<array{label: string, color?: string, icon?: ?string, iconColor?: ?string}>,
     *         keyFacts: list<array{label: string, value: string, hint?: ?string, badge?: ?array{label: string, color?: string, icon?: ?string, iconColor?: ?string}}>,
     *         primaryActions: list<array{label: string, placement: string, url: ?string, actionName: ?string, destructive: bool, requiresConfirmation: bool, visible: bool, icon: ?string, openInNewTab: bool}>,
     *         descriptionHint: ?string
     *     },
     *     decisionZone: array<string, mixed>|null,
     *     mainSections: list<array<string, mixed>>,
     *     supportingGroups: list<array<string, mixed>>,
     *     technicalSections: list<array<string, mixed>>,
     *     emptyStateNotes: list<array{title: string, description?: ?string, icon?: ?string}>
     * }
     */
    public function toArray(): array
    {
        return [
            'resourceType' => $this->resourceType,
            'scope' => $this->scope,
            'header' => $this->header->toArray(),
            'decisionZone' => $this->decisionZone,
            'mainSections' => array_values(array_map(
                static fn (DetailSectionData $section): array => $section->toArray(),
                $this->mainSections,
            )),
            'supportingGroups' => array_values(array_map(
                static fn (SupportingCardData $group): array => $group->toArray(),
                $this->supportingGroups,
            )),
            'technicalSections' => array_values(array_map(
                static fn (TechnicalDetailData $section): array => $section->toArray(),
                $this->technicalSections,
            )),
            'emptyStateNotes' => array_values($this->emptyStateNotes),
        ];
    }
}
