/**
 * De ONDE a tela busca as definições aprovadas de uma conversa.
 *
 * ─── Por que isto não é um `if` na tela ────────────────────────────────────
 *
 * Há duas rotas: a do canal oficial (`/channels/templates`, que resolve a
 * conexão pela sessão da Meta) e a do canal intermediado
 * (`/channels/partner/templates`, que resolve pela conexão de parceiro).
 * Perguntar "qual delas?" com o nome do provider na mão é o `if (provider ===
 * ...)` que o invariante 1 da doutrina proíbe — e que o `lint:channels` reprova.
 *
 * A tela recebe um rótulo NEUTRO e monta a URL com ele. Um canal novo entra
 * aqui, e nenhuma linha muda do lado de lá.
 *
 * ─── Por que não basta juntar as duas listas ───────────────────────────────
 *
 * Porque a definição é aprovada POR CONTA. Oferecer no seletor de uma conversa
 * um modelo que existe só na outra conta produz um envio que a plataforma
 * recusa — e o operador, que escolheu de uma lista que o CRM lhe ofereceu,
 * conclui que o sistema está quebrado. Melhor mostrar menos e certo.
 */
import type { ProviderDeMensagem } from "./types";

export type FonteDeTemplates = "oficial" | "parceiro" | "graph";

/**
 * Qual rota serve as definições de cada canal.
 *
 * MAPA EXPLÍCITO, e não derivado de uma capability. A primeira versão usava
 * `canManageTemplates` como discriminante e estava errada: o canal oficial
 * TAMBÉM gerencia definições pela API, então os dois respondiam `true` e todo
 * canal caía na mesma rota. Capability descreve o que o CANAL faz; isto aqui é
 * uma decisão da NOSSA arquitetura de rotas, e as duas não coincidem por sorte.
 *
 * `Record<ProviderDeMensagem, …>` de propósito: um canal DE MENSAGEM novo não
 * compila até
 * alguém decidir de onde vêm as definições dele. Esquecer essa decisão devolve
 * lista vazia em silêncio — que foi exatamente o defeito de origem.
 */
const FONTE: Record<ProviderDeMensagem, FonteDeTemplates | null> = {
  // Manda texto livre a qualquer hora: não há definição a listar, e um seletor
  // ali ofereceria solução para um problema que este canal não tem.
  waha: null,
  meta_cloud: "oficial",
  zernio: "parceiro",
  zernio_social: null,
  // Parceiro Graph-compatível: os modelos são os da Cloud API, servidos por uma
  // rota própria (host/token do parceiro).
  datafy: "graph",
};

/** `null` quando este canal não trabalha com definições aprovadas. */
export function fonteDeTemplates(provider: string | null | undefined): FonteDeTemplates | null {
  if (!provider) return null;
  return FONTE[provider as ProviderDeMensagem] ?? null;
}

/** A rota que serve as definições desta fonte. */
export function rotaDeTemplates(fonte: FonteDeTemplates): string {
  if (fonte === "parceiro") return "/api/v1/channels/partner/templates";
  if (fonte === "graph") return "/api/v1/channels/graph-partner/templates";
  return "/api/v1/channels/templates";
}

/**
 * A TELA onde quem opera cria e edita as definições desta fonte (Conexões, aba
 * do canal, sub-aba de modelos). A campanha aponta para cá em vez de criar
 * modelo no meio do formulário: a plataforma leva de minutos a horas para
 * aprovar, e um formulário de campanha não é lugar de esperar.
 */
export function telaDeModelos(fonte: FonteDeTemplates): string {
  return `/app/connections?aba=${fonte}&sub=templates`;
}
