import { mkdir, writeFile } from "node:fs/promises";
import path from "node:path";

/*
  E-mail da loja para o cliente dela, pelo Resend — a mesma peça de
  apps/public/src/lib/email-da-loja.ts, trazida para o painel porque é a fila
  do painel que manda a entrega dos produtos digitais (lib/digitais/servidor/
  fila.ts). Mudou lá, muda aqui.

  Quem manda é a Ktalogu (o domínio verificado no Resend é o nosso), mas quem
  aparece é a loja: o nome dela no remetente, a logo e a cor no topo, e a
  resposta do cliente indo para o e-mail da loja.

  Liga com RESEND_API_KEY e EMAIL_REMETENTE no ambiente. Para testar no
  computador, EMAIL_DA_LOJA_PASTA_DE_TESTE grava o e-mail numa pasta em vez de
  mandar (fora de produção apenas).
*/

function texto(valor: unknown) {
  return String(valor ?? "").trim();
}

function pastaDeTeste() {
  if (process.env.NODE_ENV === "production") return "";
  return texto(process.env.EMAIL_DA_LOJA_PASTA_DE_TESTE);
}

export function emailDaLojaConfigurado() {
  if (pastaDeTeste()) return true;
  return Boolean(texto(process.env.RESEND_API_KEY) && texto(process.env.EMAIL_REMETENTE));
}

/* "Ktalogu <no-reply@mail.ktalogu.com.br>" -> "no-reply@mail.ktalogu.com.br" */
function enderecoDoRemetente() {
  const bruto = texto(process.env.EMAIL_REMETENTE);
  const entreSinais = bruto.match(/<([^>]+)>/);
  return texto(entreSinais ? entreSinais[1] : bruto);
}

/* Nome de remetente seguro: sem aspas, barra invertida, sinais de endereço
   nem quebra de linha. Ele vai entre aspas no "De:", para vírgula, ponto e
   dois-pontos no nome da loja não quebrarem o endereço. */
function nomeDeRemetente(nome: string) {
  return texto(nome).replace(/["<>\\\r\n]/g, "").slice(0, 60) || "Loja";
}

function escapar(valor: string) {
  return valor.replace(/[&<>"']/g, (c) => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" })[c] as string);
}

function corSegura(cor?: string | null) {
  const valor = texto(cor);
  return /^#[0-9a-fA-F]{6}$/.test(valor) ? valor : "#4425A7";
}

export type ConteudoDoEmailDaLoja = {
  loja: { nome: string; logo?: string | null; cor?: string | null };
  /** Linha curta que o Gmail mostra depois do assunto. */
  resumo: string;
  titulo: string;
  paragrafos: string[];
  botao?: { texto: string; link: string };
  /** Recado pequeno no fim (ex.: "se não foi você, ignore"). */
  observacao?: string;
};

/*
  Tabelas e estilo em linha: é o que Gmail, Outlook e o Mail do celular
  respeitam. Logo só quando é endereço http(s) (e-mail não mostra outro tipo).
*/
export function montarEmailDaLoja(dados: ConteudoDoEmailDaLoja) {
  const cor = corSegura(dados.loja.cor);
  const nome = escapar(texto(dados.loja.nome) || "Loja");
  const logo = texto(dados.loja.logo);
  const topo = /^https?:\/\//i.test(logo)
    ? `<img src="${escapar(logo)}" alt="${nome}" height="48" style="display:block;max-height:48px;max-width:220px;border:0;margin:0 auto;" />`
    : `<div style="font-size:20px;font-weight:700;color:#ffffff;text-align:center;">${nome}</div>`;
  const paragrafos = dados.paragrafos
    .map((p) => `<p style="margin:0 0 14px;font-size:15px;line-height:1.6;color:#1C1830;">${escapar(p)}</p>`)
    .join("");
  const botao = dados.botao
    ? `<table role="presentation" cellpadding="0" cellspacing="0" style="margin:22px 0 8px;"><tr><td style="border-radius:10px;background:${cor};">
         <a href="${escapar(dados.botao.link)}" style="display:inline-block;padding:13px 22px;font-size:15px;font-weight:700;color:#ffffff;text-decoration:none;border-radius:10px;">${escapar(dados.botao.texto)}</a>
       </td></tr></table>
       <p style="margin:6px 0 0;font-size:12px;line-height:1.5;color:#5F5A73;">Se o botão não abrir, copie este endereço no navegador:<br /><span style="word-break:break-all;">${escapar(dados.botao.link)}</span></p>`
    : "";
  const observacao = dados.observacao
    ? `<p style="margin:18px 0 0;font-size:13px;line-height:1.55;color:#5F5A73;">${escapar(dados.observacao)}</p>`
    : "";

  const html = `<!doctype html><html lang="pt-BR"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width,initial-scale=1" /><title>${escapar(dados.titulo)}</title></head>
<body style="margin:0;padding:0;background:#F4F3F8;font-family:'Segoe UI',Roboto,Helvetica,Arial,sans-serif;">
<span style="display:none;max-height:0;overflow:hidden;opacity:0;">${escapar(dados.resumo)}</span>
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="background:#F4F3F8;padding:24px 12px;"><tr><td align="center">
  <table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="max-width:560px;background:#ffffff;border-radius:16px;overflow:hidden;">
    <tr><td style="background:${cor};padding:22px 24px;">${topo}</td></tr>
    <tr><td style="padding:28px 26px 26px;">
      <h1 style="margin:0 0 16px;font-size:21px;line-height:1.3;color:#1C1830;">${escapar(dados.titulo)}</h1>
      ${paragrafos}${botao}${observacao}
    </td></tr>
  </table>
  <p style="margin:14px 0 0;font-size:11px;color:#8A8599;">Enviado pela Ktalogu em nome de ${nome}.</p>
</td></tr></table>
</body></html>`;

  const linhas = [
    texto(dados.loja.nome),
    "",
    dados.titulo,
    "",
    ...dados.paragrafos,
    ...(dados.botao ? ["", `${dados.botao.texto}: ${dados.botao.link}`] : []),
    ...(dados.observacao ? ["", dados.observacao] : []),
    "",
    `Enviado pela Ktalogu em nome de ${texto(dados.loja.nome)}.`,
  ];

  return { html, texto: linhas.join("\n") };
}

export async function enviarEmailDaLoja(params: {
  para: string;
  assunto: string;
  html: string;
  texto: string;
  nomeDaLoja: string;
  responderPara?: string | null;
}): Promise<{ ok: true } | { ok: false; erro: string }> {
  const para = texto(params.para);
  if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(para)) return { ok: false, erro: "E-mail do destinatário inválido." };

  const pasta = pastaDeTeste();
  if (pasta) {
    await mkdir(pasta, { recursive: true });
    const base = path.join(pasta, `${Date.now()}-${para.replace(/[^a-z0-9@._-]/gi, "_")}`);
    await writeFile(`${base}.html`, params.html, "utf8");
    await writeFile(
      `${base}.txt`,
      [`Para: ${para}`, `De: ${nomeDeRemetente(params.nomeDaLoja)}`, `Assunto: ${params.assunto}`, "", params.texto].join("\n"),
      "utf8"
    );
    return { ok: true };
  }

  const chave = texto(process.env.RESEND_API_KEY);
  const endereco = enderecoDoRemetente();
  if (!chave || !endereco) return { ok: false, erro: "E-mail não configurado (RESEND_API_KEY / EMAIL_REMETENTE)." };

  const responder = texto(params.responderPara);
  try {
    const resposta = await fetch("https://api.resend.com/emails", {
      method: "POST",
      headers: { Authorization: `Bearer ${chave}`, "Content-Type": "application/json" },
      body: JSON.stringify({
        from: `"${nomeDeRemetente(params.nomeDaLoja)}" <${endereco}>`,
        to: [para],
        subject: params.assunto,
        html: params.html,
        text: params.texto,
        ...(/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(responder) ? { reply_to: responder } : {}),
      }),
    });
    if (resposta.ok) return { ok: true };
    const corpo = await resposta.text().catch(() => "");
    return { ok: false, erro: `Resend HTTP ${resposta.status}: ${corpo.slice(0, 300)}` };
  } catch (erro) {
    return { ok: false, erro: erro instanceof Error ? erro.message : String(erro) };
  }
}
