/**
 * O que as telas e as rotas do centro de aprendizado compartilham.
 *
 * Três níveis, e só três: seção, artigo e trilha. O endereço público é o
 * caminho — help.ktalogu.com.br/<seção>/<artigo> — então slug aqui não é
 * enfeite, é contrato com links que já foram enviados.
 */

export const CAMPOS_DA_SECAO =
  "id,slug,title,description,icon,color,position,active,created_at,updated_at";

export const CAMPOS_DO_ARTIGO =
  "id,section_id,slug,title,subtitle,body_html,cover_image_url,level,keywords,status,position,needs_review,published_at,created_at,updated_at";

export const CAMPOS_DA_TRILHA = "id,slug,title,description,position,active,created_at,updated_at";

export const NIVEIS = ["comecando", "usando", "avancado"] as const;
export type Nivel = (typeof NIVEIS)[number];

export const ROTULO_DO_NIVEL: Record<Nivel, string> = {
  comecando: "Começando",
  usando: "Usando",
  avancado: "Avançado",
};

export type Secao = {
  id: string;
  slug: string;
  title: string;
  description: string | null;
  icon: string;
  color: string;
  position: number;
  active: boolean;
  created_at: string;
  updated_at: string;
};

export type Artigo = {
  id: string;
  section_id: string;
  slug: string;
  title: string;
  subtitle: string | null;
  body_html: string;
  cover_image_url: string | null;
  level: Nivel;
  keywords: string[];
  status: "draft" | "published";
  position: number;
  needs_review: boolean;
  published_at: string | null;
  created_at: string;
  updated_at: string;
};

export type Trilha = {
  id: string;
  slug: string;
  title: string;
  description: string | null;
  position: number;
  active: boolean;
};

export function texto(valor: unknown) {
  return typeof valor === "string" ? valor.trim() : "";
}

/** Endereço que a gente aceita gravar: só http e https, nunca `javascript:`. */
export function endereco(valor: unknown) {
  const bruto = texto(valor);
  if (!bruto) return null;
  try {
    const url = new URL(bruto);
    return url.protocol === "http:" || url.protocol === "https:" ? bruto : null;
  } catch {
    return null;
  }
}

export function nivel(valor: unknown): Nivel {
  const bruto = texto(valor).toLowerCase();
  return (NIVEIS as readonly string[]).includes(bruto) ? (bruto as Nivel) : "comecando";
}

export function situacao(valor: unknown) {
  return texto(valor).toLowerCase() === "published" ? "published" : "draft";
}

/**
 * O termo de busca reduzido ao que importa para agrupar.
 *
 * Sem acento, minúsculo e sem espaço sobrando. "Nota Fiscal", "nota fiscal" e
 * "  NOTA  FISCAL " viram a mesma linha no painel de buscas sem resposta — que
 * é o ponto: sem isso, a mesma dúvida apareceria três vezes com contagem 1.
 */
export function normalizarTermo(entrada: unknown) {
  return texto(entrada)
    .toLowerCase()
    .normalize("NFD")
    /* Escapado, e não o caractere combinante escrito direto: assim a regra
       sobrevive a qualquer editor que resolva "arrumar" a codificação. */
    .replace(/[\u0300-\u036f]/g, "")
    .replace(/\s+/g, " ")
    .trim();
}

/** As palavras que levam até o artigo, sem repetição e sem vazio. */
export function limparPalavras(valor: unknown): string[] {
  const cru = Array.isArray(valor) ? valor : texto(valor).split(",");
  const vistas = new Set<string>();
  for (const item of cru) {
    const limpo = normalizarTermo(item);
    if (limpo && limpo.length <= 60) vistas.add(limpo);
    if (vistas.size >= 24) break;
  }
  return [...vistas];
}

/**
 * O desenho de cada seção.
 *
 * Biblioteca da casa: são caminhos de SVG escritos aqui, não ícones de
 * terceiro. O centro de aprendizado usa os mesmos das telas do sistema, para
 * quem chega reconhecer o módulo pelo desenho antes de ler o nome.
 */
export const DESENHOS: Record<string, string> = {
  livro:
    "M4 5.6h6.2A2.4 2.4 0 0 1 12.6 8v11a1.8 1.8 0 0 0-1.8-1.8H4V5.6ZM20 5.6h-6.2A2.4 2.4 0 0 0 11.4 8v11a1.8 1.8 0 0 1 1.8-1.8H20V5.6Z",
  orcamento: "M4 6h16M4 12h10M4 18h13",
  cliente: "M12 11.6a3.8 3.8 0 1 0 0-7.6 3.8 3.8 0 0 0 0 7.6ZM4.6 20a7.4 7.4 0 0 1 14.8 0",
  produto: "M4.6 8.2 12 4.4l7.4 3.8v7.6L12 19.6l-7.4-3.8V8.2ZM4.6 8.2 12 12l7.4-3.8M12 12v7.6M8.3 6.3l7.4 3.8",
  pedido: "M3.4 4.6h17.2v14.8H3.4zM3.4 9.4h17.2M8 14h5",
  pdv: "M4 20V9.6l8-5.2 8 5.2V20M9 13h6v7H9z",
  preco: "M3.6 17.4 9 12l3.4 3.4L20.4 7M15.6 7h4.8v4.8",
  producao: "M3.6 5h6.4v6.4H3.6zM14 5h6.4v6.4H14zM3.6 14.6h6.4V19H3.6zM14 14.6h6.4V19H14z",
  estoque: "M4 8.4 12 4l8 4.4v7.2L12 20l-8-4.4V8.4ZM4 8.4 12 13l8-4.6M12 13v7",
  fornecedor: "M5.4 6h13.2l-1.3 12.2a2 2 0 0 1-2 1.8H8.7a2 2 0 0 1-2-1.8L5.4 6ZM9 6a3 3 0 0 1 6 0",
  loja: "M4 10.4 5.6 5.4h12.8L20 10.4M4 10.4h16V18a1.6 1.6 0 0 1-1.6 1.6H5.6A1.6 1.6 0 0 1 4 18v-7.6ZM9.6 14h4.8",
  financeiro: "M12 3.6v16.8M8 7.4h6.4a2.6 2.6 0 0 1 0 5.2H9.6a2.6 2.6 0 0 0 0 5.2H16",
  relatorio: "M4 18.4 8.6 7.2l4 6.4 3-4.2 4.4 9",
  agenda: "M3.6 6.4h16.8V20H3.6zM3.6 10.6h16.8M8 3.6v4M16 3.6v4",
  chat: "M4 5.6h16v10.2H10.6L6 19.4v-3.6H4V5.6Z",
  config:
    "M12 15.2a3.2 3.2 0 1 0 0-6.4 3.2 3.2 0 0 0 0 6.4ZM19.6 12a7.7 7.7 0 0 0-.1-1.2l2-1.5-1.9-3.3-2.4 1a7.6 7.6 0 0 0-2-1.2l-.4-2.6h-3.8l-.4 2.6a7.6 7.6 0 0 0-2 1.2l-2.4-1L2.5 9.3l2 1.5A7.7 7.7 0 0 0 4.4 12c0 .4 0 .8.1 1.2l-2 1.5 1.9 3.3 2.4-1c.6.5 1.3.9 2 1.2l.4 2.6h3.8l.4-2.6c.7-.3 1.4-.7 2-1.2l2.4 1 1.9-3.3-2-1.5c.1-.4.1-.8.1-1.2Z",
};

export const NOMES_DOS_DESENHOS = Object.keys(DESENHOS);

/** As cores que uma seção pode ter. Todas saturadas: nada de pastel. */
export const CORES_DA_SECAO = [
  "#5f31d6",
  "#45209f",
  "#2f9bf0",
  "#15c5c5",
  "#14c78d",
  "#f79c2d",
  "#f0526e",
  "#16112b",
];

/**
 * O endereço onde o centro de aprendizado mora.
 *
 * Mesma ideia do `baseDosBoletins`: aparece em várias telas e num link que a
 * pessoa copia para colar no botão do popup. Em desenvolvimento aponta para a
 * loja local, que é o app que serve a página.
 */
export function baseDoHelp() {
  const doAmbiente = String(process.env.NEXT_PUBLIC_HELP_BASE_URL || "").trim();
  if (doAmbiente) return doAmbiente.replace(/\/+$/, "");
  if (process.env.NODE_ENV === "production") return "https://help.ktalogu.com.br";
  return "http://localhost:3001/aprender";
}

/** O endereço público de um artigo: <base>/<seção>/<artigo>. */
export function enderecoDoArtigo(secao: string, artigo: string) {
  return `${baseDoHelp()}/${secao}/${artigo}`;
}
