/*
  O que um produto diz sobre um serviço da biblioteca: ofereço, ou não.

  Mora fora da API porque é o mesmo pedaço lido em dois lugares (a rota que
  grava o produto e a tela que monta a lista), e porque um vínculo inválido
  vindo do navegador não pode virar linha no banco.
*/

export type VinculoDeServico = {
  serviceId: string;
  ligado: boolean;
};

const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;

export function ehVinculoDeServico(bruto: unknown): VinculoDeServico | null {
  if (!bruto || typeof bruto !== "object" || Array.isArray(bruto)) return null;
  const linha = bruto as Record<string, unknown>;
  const id = String(linha.service_id ?? linha.serviceId ?? "").trim();
  if (!UUID.test(id)) return null;
  /* Só o `false` explícito desliga: um campo faltando não pode apagar da
     vitrine um serviço que o lojista deixou ligado. */
  const ligado = (linha.enabled ?? linha.ligado) !== false;
  return { serviceId: id.toLowerCase(), ligado };
}

export function lerVinculosDeServico(bruto: unknown): VinculoDeServico[] {
  if (!Array.isArray(bruto)) return [];
  const vistos = new Set<string>();
  const lista: VinculoDeServico[] = [];
  for (const item of bruto) {
    const vinculo = ehVinculoDeServico(item);
    if (!vinculo || vistos.has(vinculo.serviceId)) continue;
    vistos.add(vinculo.serviceId);
    lista.push(vinculo);
  }
  return lista;
}
