/*
 * O domínio próprio explicado para gente: quais registros criar, onde, e o
 * que falta. Sem banco e sem "@/" (o teste roda no `node --test` puro).
 *
 * O Natan pediu que o passo a passo cite pelo nome os dois lugares onde as
 * gráficas costumam ter o domínio: a Cloudflare e o Registro.br.
 */

export type RegistroDeDns = { type: string; host: string; value: string; host_label?: string; required?: boolean };

const SEGUNDO_NIVEL_BR = new Set([
  "com.br",
  "net.br",
  "org.br",
  "gov.br",
  "edu.br",
  "emp.br",
  "ind.br",
  "jus.br",
  "leg.br",
  "mil.br",
  "nom.br",
  "tur.br",
  "wiki.br",
]);

/** O domínio comprado (a "zona"): loja.minhagrafica.com.br → minhagrafica.com.br. */
export function dominioComprado(dominio: string) {
  const partes = String(dominio || "").toLowerCase().replace(/\.$/, "").split(".").filter(Boolean);
  const final = partes.slice(-2).join(".");
  const tamanho = SEGUNDO_NIVEL_BR.has(final) ? 3 : 2;
  return partes.slice(-tamanho).join(".");
}

/** O que se escreve no campo "Nome" de um painel de DNS: o pedaço antes do domínio comprado, ou "@" na raiz. */
export function nomeNoPainel(host: string, zona: string) {
  const limpo = String(host || "").toLowerCase().replace(/\.$/, "");
  if (limpo === zona) return "@";
  return limpo.endsWith(`.${zona}`) ? limpo.slice(0, -(zona.length + 1)) : limpo;
}

export type RegistroExplicado = {
  tipo: string;
  nome: string;
  nome_completo: string;
  valor: string;
  para_que_serve: string;
};

export function explicarRegistros(dominio: string, registros: RegistroDeDns[]): RegistroExplicado[] {
  const zona = dominioComprado(dominio);
  return registros.map((registro) => {
    const tipo = String(registro.type || "").toUpperCase();
    return {
      tipo,
      nome: nomeNoPainel(registro.host, zona),
      nome_completo: registro.host,
      valor: registro.value,
      para_que_serve:
        tipo === "CNAME"
          ? "Aponta o endereço para a sua loja na Ktalogu."
          : /_acme-challenge|_pki-validation/i.test(registro.host)
            ? "Libera o cadeado de segurança (https) do endereço."
            : "Prova que o domínio é seu.",
    };
  });
}

/**
 * O passo a passo nos dois painéis. `raiz` = o endereço é o domínio comprado
 * inteiro (minhagrafica.com.br), sem nada antes.
 */
export function passoAPasso(dominio: string, registros: RegistroExplicado[], raiz: boolean) {
  const zona = dominioComprado(dominio);
  const lista = registros.map((r, i) => `${i + 1}) Tipo ${r.tipo} · Nome ${r.nome === "@" ? "@ (o próprio domínio)" : r.nome} · Valor ${r.valor}`).join("; ");
  const cloudflare = [
    `Entre em dash.cloudflare.com e clique no domínio ${zona}.`,
    "No menu da esquerda, abra DNS e depois Registros. Clique em \"Adicionar registro\".",
    `Crie cada registro assim: ${lista || "(nenhum registro pendente)"}.`,
    "No registro CNAME, deixe a nuvem cinza (\"Somente DNS\"), não a laranja. TTL pode ficar em Automático.",
    "Salve cada um. Depois peça para conferir o domínio (verificar_dominio).",
  ];
  const registroBr = [
    `Entre em registro.br com a sua conta e clique no domínio ${zona}.`,
    "Na área de DNS, clique em \"Configurar zona DNS\" (ou \"Editar zona\"). Se aparecer que o domínio usa servidores de outra empresa, os registros precisam ser criados lá, e não no Registro.br.",
    `Clique em "Nova entrada" para cada registro: ${lista || "(nenhum registro pendente)"}. No campo Nome vai só o pedaço antes de ${zona}; para o próprio domínio, deixe o Nome em branco.`,
    "Clique em \"Salvar alterações\". A mudança pode levar de alguns minutos a algumas horas para valer.",
  ];
  const atencao = raiz
    ? [
        `${dominio} é o domínio inteiro, sem nada antes (o que se chama de "raiz"). Nem todo painel aceita apontar a raiz com CNAME:`,
        "• Na Cloudflare funciona normalmente.",
        `• No Registro.br não funciona. Nesse caso, o melhor é usar um endereço com algo antes, como loja.${zona}, ou passar o DNS do domínio para a Cloudflare (é gratuito).`,
      ].join("\n")
    : null;
  return { cloudflare, registro_br: registroBr, ...(atencao ? { atencao_dominio_raiz: atencao } : {}) };
}

/** O que a situação do domínio quer dizer, em português de gente. */
export function situacaoDoDominio(d: {
  domain?: string | null;
  verified?: boolean | null;
  cf_hostname_status?: string | null;
  cf_ssl_status?: string | null;
}) {
  if (!d.domain) return "A loja não tem domínio próprio. Ela abre pelo link da Ktalogu.";
  if (d.verified) return `Funcionando: a loja abre em https://${d.domain}.`;
  const endereco = String(d.cf_hostname_status || "");
  const cadeado = String(d.cf_ssl_status || "");
  if (endereco && endereco !== "active") {
    return "Aguardando o DNS: os registros ainda não foram encontrados (ou não foram criados). Confira se estão iguais aos da lista e espere a propagação, que pode levar algumas horas.";
  }
  if (endereco === "active" && cadeado && cadeado !== "active") {
    return "O endereço já aponta para a loja; falta só o cadeado de segurança (https) ficar pronto. Costuma levar alguns minutos depois que o DNS propaga.";
  }
  return "Aguardando a conferência do DNS.";
}
