<?php

namespace App\Service;

use App\Repository\ConcessionRepository;

/**
 * Référentiel des concessions, importé via Paramètres (ID_CONCESSION + nom).
 * Partout dans l'app les concessions sont stockées par ID externe ; ce service
 * résout les IDs en noms pour l'affichage. Un ID inconnu (ou un ancien nom
 * hérité d'avant la bascule aux IDs) est affiché tel quel.
 */
final class ConcessionsProvider
{
    /** @var array<string, string>|null map id => nom (cache par requête) */
    private ?array $map = null;

    public function __construct(
        private readonly ConcessionRepository $repository,
    ) {
    }

    /**
     * Map id => nom, triée par nom.
     *
     * @return array<string, string>
     */
    public function all(): array
    {
        return $this->map ??= $this->repository->allByExternalId();
    }

    public function isValid(string $id): bool
    {
        return isset($this->all()[$id]);
    }

    /** Nom affichable d'une concession ; valeur inconnue renvoyée telle quelle. */
    public function label(string $idOrLegacyName): string
    {
        return $this->all()[$idOrLegacyName] ?? $idOrLegacyName;
    }

    /**
     * Map id => nom pour une liste d'IDs donnée, triée par nom (valeurs inconnues conservées).
     *
     * @param array<int, string> $ids
     *
     * @return array<string, string>
     */
    public function labels(array $ids): array
    {
        $out = [];
        foreach ($ids as $id) {
            $out[$id] = $this->label($id);
        }
        asort($out, SORT_NATURAL | SORT_FLAG_CASE);

        return $out;
    }

    /**
     * Noms affichables d'une liste d'IDs, dans l'ordre fourni.
     *
     * @param array<int, string> $ids
     *
     * @return list<string>
     */
    public function names(array $ids): array
    {
        return array_values(array_map($this->label(...), $ids));
    }

    public function count(): int
    {
        return \count($this->all());
    }
}
