import { prisma } from "@/lib/prisma";
import { escapeHtml, mailShell, sendToolaroMail } from "@/lib/mail";
import { sha256 } from "@/lib/security";

export function renderNewsletterHtml(contentText: string, unsubscribeUrl: string, preheader?: string | null) {
  const paragraphs = contentText
    .split(/\n{2,}/)
    .map((part) => part.trim())
    .filter(Boolean)
    .map((part) => `<p>${escapeHtml(part).replace(/\n/g, "<br>")}</p>`)
    .join("\n");

  return mailShell(
    "Toolaro Newsletter",
    `${preheader ? `<p style="color:#64748b;font-size:14px;">${escapeHtml(preheader)}</p>` : ""}
     ${paragraphs}
     <hr style="border:0;border-top:1px solid #e2e8f0;margin:28px 0;">
     <p style="font-size:12px;color:#64748b;">Du erhältst diese E-Mail, weil du den Toolaro Newsletter bestätigt hast.
     <a href="${unsubscribeUrl}">Newsletter abmelden</a></p>`
  );
}

export function unsubscribeUrl(email: string) {
  const base = (process.env.NEXT_PUBLIC_SITE_URL ?? "https://toolaro.org").replace(/\/$/, "");
  const token = sha256(`newsletter-unsubscribe:${email}:${process.env.AUTH_SECRET ?? process.env.ADMIN_SECRET ?? "toolaro-local"}`);
  return `${base}/api/newsletter/unsubscribe?email=${encodeURIComponent(email)}&token=${encodeURIComponent(token)}`;
}

export function verifyUnsubscribeToken(email: string, token: string) {
  return token === sha256(`newsletter-unsubscribe:${email}:${process.env.AUTH_SECRET ?? process.env.ADMIN_SECRET ?? "toolaro-local"}`);
}

export async function getActiveNewsletterRecipients() {
  const entries = await prisma.newsletterSubscription.findMany({
    where: { status: "active" },
    orderBy: { createdAt: "desc" },
    select: { email: true },
  });
  return Array.from(new Set(entries.map((entry) => entry.email.toLowerCase())));
}

export async function sendNewsletterTest({
  to,
  subject,
  preheader,
  contentText,
}: {
  to: string;
  subject: string;
  preheader?: string | null;
  contentText: string;
}) {
  const url = unsubscribeUrl(to);
  await sendToolaroMail({
    to,
    subject: `[Test] ${subject}`,
    html: renderNewsletterHtml(contentText, url, preheader),
    text: `${preheader ? `${preheader}\n\n` : ""}${contentText}\n\nNewsletter abmelden: ${url}`,
  });
}

export async function sendNewsletterCampaign(campaignId: string) {
  const campaign = await prisma.newsletterCampaign.findUnique({ where: { id: campaignId } });
  if (!campaign) throw new Error("Newsletter-Kampagne nicht gefunden.");
  if (campaign.status === "sent") return { sent: 0 };

  const recipients = await getActiveNewsletterRecipients();
  let sent = 0;
  for (const email of recipients) {
    const url = unsubscribeUrl(email);
    await sendToolaroMail({
      to: email,
      subject: campaign.subject,
      html: renderNewsletterHtml(campaign.contentText, url, campaign.preheader),
      text: `${campaign.preheader ? `${campaign.preheader}\n\n` : ""}${campaign.contentText}\n\nNewsletter abmelden: ${url}`,
    });
    sent += 1;
  }

  await prisma.newsletterCampaign.update({
    where: { id: campaign.id },
    data: {
      status: "sent",
      sentAt: new Date(),
      recipientCount: sent,
      lastError: null,
    },
  });

  return { sent };
}

export function normalizeNewsletterInput(body: {
  subject?: string;
  preheader?: string;
  contentText?: string;
  scheduledAt?: string;
  testEmail?: string;
}) {
  const subject = String(body.subject ?? "").trim().slice(0, 180);
  const preheader = String(body.preheader ?? "").trim().slice(0, 220);
  const contentText = String(body.contentText ?? "").trim().slice(0, 20000);
  const testEmail = String(body.testEmail ?? "").trim().toLowerCase().slice(0, 180);
  const scheduledAtRaw = String(body.scheduledAt ?? "").trim();
  const scheduledAt = scheduledAtRaw ? new Date(scheduledAtRaw) : null;
  return { subject, preheader, contentText, testEmail, scheduledAt };
}
