<?php

declare(strict_types=1);

namespace App\Support\References;

final class ResolvedReferencePresenter
{
    public function __construct(
        private readonly ReferenceTypeLabelCatalog $typeLabels,
        private readonly ReferenceStatePresenter $statePresenter,
    ) {}

    /**
     * @return array{
     *   referenceClass: string,
     *   typeLabel: string,
     *   primaryLabel: string,
     *   secondaryLabel: ?string,
     *   state: string,
     *   stateLabel: string,
     *   stateColor: string,
     *   stateIcon: ?string,
     *   stateIconColor: ?string,
     *   stateDescription: ?string,
     *   showStateBadge: bool,
     *   linkTarget: array{targetKind: string, url: string, actionLabel: string, contextBadge: ?string}|null,
     *   technicalDetail: array{displayId: ?string, fullId: string, sourceHint: ?string, copyable: bool, defaultCollapsed: bool},
     *   isLinkable: bool,
     *   isDegraded: bool,
     *   variant: string,
     *   meta: array<string, mixed>
     * }
     */
    public function present(ResolvedReference $reference, ReferencePresentationVariant $variant): array
    {
        $badge = $this->statePresenter->badgeSpec($reference->state);
        $typeLabel = $this->typeLabels->label($reference->referenceClass);

        return [
            'referenceClass' => $reference->referenceClass->value,
            'typeLabel' => $typeLabel,
            'primaryLabel' => $reference->primaryLabel,
            'secondaryLabel' => $reference->secondaryLabel,
            'state' => $reference->state->value,
            'stateLabel' => $reference->stateLabel ?? $badge->label,
            'stateColor' => $badge->color,
            'stateIcon' => $badge->icon,
            'stateIconColor' => $badge->iconColor,
            'stateDescription' => $this->statePresenter->description($reference, $typeLabel),
            'showStateBadge' => $reference->state->isDegraded(),
            'linkTarget' => $reference->linkTarget?->toArray(),
            'technicalDetail' => $reference->technicalDetail->toArray(),
            'isLinkable' => $reference->isLinkable(),
            'isDegraded' => $reference->state->isDegraded(),
            'variant' => $variant->value,
            'meta' => $reference->meta,
        ];
    }
}
