import * as cheerio from "cheerio";

import { env } from "@/config/env";
import { htmlToPlainText } from "./html-to-plain-text";

const APP_BASE_URL = env.appBaseUrl ?? "http://localhost:3000";

interface BuiltEmailContent {
  html: string;
  text: string;
  headers: Record<string, string>;
}

/**
 * Usa Cheerio para injetar um link de descadastro no rodapé do e-mail (quando ainda não existe),
 * opcionalmente um pixel de rastreamento de abertura, derivar a versão em texto puro do HTML
 * final e montar os cabeçalhos List-Unsubscribe / List-Unsubscribe-Post exigidos por provedores
 * de e-mail para reduzir a chance de spam.
 *
 * `trackingToken`, quando informado, deve ser o `CampaignLog.id` do envio — é o único identificador
 * que já existe antes do envio (criado por `upsertPending`) e serve como token opaco o suficiente
 * para o pixel (mesmo padrão já adotado pelo link de descadastro acima, que usa `contactId` cru).
 *
 * Só passe `trackingToken` para envios que NÃO usam o SES: o SES já injeta seu próprio pixel de
 * abertura automaticamente quando o Configuration Set tem `EventType.OPEN` habilitado (ver
 * `ses-infra-bootstrapper-impl.ts`), e os eventos chegam via webhook SNS. Injetar um segundo pixel
 * nesse caso duplicaria a contagem de aberturas. Para envios via SMTP (Nodemailer) não existe
 * nenhum tracking nativo, então esse pixel é a única forma de saber se o contato abriu o e-mail.
 *
 * LIMITAÇÃO CONHECIDA: pixels de abertura (o nosso e o nativo do SES) não são 100% confiáveis.
 * O Apple Mail Privacy Protection e o proxy de imagens do Gmail pré-carregam todas as imagens de
 * um e-mail — inclusive o pixel — no servidor do provedor, mesmo que o destinatário nunca tenha
 * aberto a mensagem. Isso gera falsos positivos de "aberto". É o comportamento padrão de mercado
 * (a mesma limitação existe em qualquer ESB/CRM que usa pixel de rastreamento), então tratamos
 * "aberto" como uma métrica de engajamento estimada, não como confirmação de leitura humana.
 */
export function buildEmailContent(
  html: string,
  contactId: string,
  trackingToken?: string
): BuiltEmailContent {
  const unsubscribeUrl = `${APP_BASE_URL}/unsubscribe/${contactId}`;
  const $ = cheerio.load(html);

  // HTML importado/colado pelo usuário pode já trazer um pixel de outro envio (ou colado por
  // engano); remove antes de injetar o nosso para não duplicar a contagem de aberturas.
  $('img[src*="/api/track/open/"]').remove();

  if ($('a[href*="/unsubscribe/"]').length === 0) {
    $("body").append(
      `<div style="margin-top:24px;font-size:12px;color:#888;text-align:center;">` +
        `<a href="${unsubscribeUrl}" style="color:#888;">Descadastrar-se desta lista</a>` +
        `</div>`
    );
  }

  if (trackingToken) {
    $("body").append(
      `<img src="${APP_BASE_URL}/api/track/open/${trackingToken}.gif" width="1" height="1" alt="" ` +
        `style="display:none;max-width:0;max-height:0;overflow:hidden;" />`
    );
  }

  const text = htmlToPlainText($.html());

  return {
    html: $.html(),
    text,
    headers: {
      "List-Unsubscribe": `<${unsubscribeUrl}>`,
      "List-Unsubscribe-Post": "List-Unsubscribe=One-Click",
    },
  };
}
