const invalidUnicodePatterns = [
  { label: "un carácter de sustitución Unicode", pattern: /\uFFFD/u },
  { label: "una codificación UTF-8 dañada", pattern: /\u00c3[\u0080-\u00bf]/u },
  { label: "una codificación UTF-8 dañada", pattern: /\u00c2[\u0080-\u00bf]/u },
] as const;

export function assertValidEmailUnicode(value: string, field: string): void {
  for (const check of invalidUnicodePatterns) {
    if (check.pattern.test(value)) {
      throw new Error(`El campo ${field} contiene ${check.label}.`);
    }
  }
}

/**
 * Entidades ASCII para evitar que un visor de correo mal configurado muestre
 * tildes o eñes como mojibake. El mensaje sigue declarando UTF-8.
 */
export function prepareEmailForTransport(subject: string, html: string): { subject: string; html: string } {
  assertValidEmailUnicode(subject, "asunto");
  assertValidEmailUnicode(html, "HTML");
  return {
    subject: subject.normalize("NFC"),
    html: html.normalize("NFC").replace(/[^\u0000-\u007f]/gu, (character) => `&#${character.codePointAt(0)};`),
  };
}
