import { readFile } from "node:fs/promises";
import path from "node:path";

import { prisma } from "@/lib/prisma";

export type SenderSignature = {
  displayName: string;
  jobTitle: string;
  phone: string;
  company: string;
  address: string;
  website: string;
  logo: "ENVIE_2E" | "ENVIE_MAGASINS" | "NONE";
};

export type GraphAttachment = {
  name: string;
  contentType: string;
  contentBytes: string;
  isInline?: boolean;
  contentId?: string;
};

function escapeHtml(value: string) {
  return value
    .replaceAll("&", "&amp;")
    .replaceAll("<", "&lt;")
    .replaceAll(">", "&gt;")
    .replaceAll('"', "&quot;")
    .replaceAll("'", "&#039;");
}

export async function loadSenderSignature(
  userId: number,
): Promise<SenderSignature | null> {
  const user = await prisma.auth_users.findUnique({
    where: { id: userId },
    select: {
      signature_enabled: true,
      signature_display_name: true,
      signature_job_title: true,
      signature_phone: true,
      signature_company: true,
      signature_address: true,
      signature_website: true,
      signature_logo: true,
    },
  });

  if (!user?.signature_enabled || !user.signature_display_name?.trim()) {
    return null;
  }

  const logo = ["ENVIE_2E", "ENVIE_MAGASINS", "NONE"].includes(
    user.signature_logo,
  )
    ? (user.signature_logo as SenderSignature["logo"])
    : "ENVIE_2E";

  return {
    displayName: user.signature_display_name.trim(),
    jobTitle: user.signature_job_title?.trim() ?? "",
    phone: user.signature_phone?.trim() ?? "",
    company: user.signature_company?.trim() ?? "",
    address: user.signature_address?.trim() ?? "",
    website: user.signature_website?.trim() ?? "",
    logo,
  };
}

function signatureHtml(signature: SenderSignature, withLogo: boolean) {
  const contactLines = [
    `<strong style="color:#1d5d9b;font-size:18px">${escapeHtml(signature.displayName)}</strong>`,
    signature.jobTitle ? escapeHtml(signature.jobTitle) : "",
    signature.phone
      ? `<a href="tel:${escapeHtml(signature.phone.replace(/\s+/g, ""))}" style="color:#1d5d9b;text-decoration:none">${escapeHtml(signature.phone)}</a>`
      : "",
  ].filter(Boolean);
  const companyLines = [
    signature.company ? escapeHtml(signature.company) : "",
    signature.address ? escapeHtml(signature.address) : "",
    signature.website
      ? `<a href="${escapeHtml(signature.website)}" style="color:#1d5d9b;font-weight:bold">${escapeHtml(signature.website.replace(/^https?:\/\//i, "").replace(/\/$/, ""))}</a>`
      : "",
  ].filter(Boolean);

  return `<div style="margin-top:24px;color:#1d5d9b"><div style="margin-bottom:14px">Cordialement,</div><div>${contactLines.join("<br>")}</div>${withLogo ? '<div style="margin:16px 0 8px"><img src="cid:rh-connect-signature-logo" alt="Logo Envie" width="220" style="display:block;width:220px;height:auto;border:0"></div>' : ""}${companyLines.length ? `<div>${companyLines.join("<br>")}</div>` : ""}</div>`;
}

export function buildMailHtml(
  bodyText: string,
  signature: SenderSignature | null,
  withLogo: boolean,
) {
  const noReplyNotice =
    '<div style="margin-top:24px;padding:12px 14px;border-left:4px solid #64748b;background:#f1f5f9;color:#475569;font-size:12px;line-height:1.5"><strong>Message automatique :</strong> ce message a été envoyé depuis RH Connect. Merci de ne pas répondre à cet e-mail. Pour toute question, contactez votre responsable ou le service RH.</div>';
  const body = escapeHtml(bodyText).replace(/\r?\n/g, "<br>");
  return `<div style="font-family:Arial,sans-serif;font-size:14px;line-height:1.5;color:#172033">${body}${noReplyNotice}${signature ? signatureHtml(signature, withLogo) : ""}</div>`;
}

export async function loadSignatureLogo(
  signature: SenderSignature | null,
): Promise<GraphAttachment | null> {
  if (!signature || signature.logo === "NONE") return null;

  const fileName =
    signature.logo === "ENVIE_MAGASINS"
      ? "logo-envie-magasins.jpg"
      : "logo-envie-2e.jpg";
  const filePath = path.join(
    process.cwd(),
    "public",
    "procedure-assets",
    fileName,
  );
  const content = await readFile(filePath).catch((error) => {
    console.warn("[mail] Logo de signature introuvable", error);
    return null;
  });

  return content
    ? {
        name: fileName,
        contentType: "image/jpeg",
        contentBytes: content.toString("base64"),
        isInline: true,
        contentId: "rh-connect-signature-logo",
      }
    : null;
}
