import { convert } from "html-to-text";

import type { CampaignBlock } from "../types.js";

export function renderBuilderHtml(blocks: CampaignBlock[]) {
  const html = `<!doctype html><html><body style="margin:0;background:#f8fafc;font-family:Arial,sans-serif;"><main style="max-width:640px;margin:0 auto;background:#ffffff;">${blocks
    .sort((a, b) => a.order - b.order)
    .map((block) => renderBlock(block))
    .join("")}</main></body></html>`;

  return {
    html,
    text: convert(html, {
      selectors: [{ selector: "img", format: "skip" }],
      wordwrap: 120,
    }),
  };
}

function renderBlock(block: CampaignBlock) {
  switch (block.type) {
    case "hero":
      return `<section style="padding:32px 24px;background:#0f172a;color:#ffffff;"><h1 style="margin:0 0 12px;font-size:32px;">${String(block.config.heading ?? "Your next campaign")}</h1><p style="margin:0;line-height:1.6;">${String(block.config.body ?? "")}</p></section>`;
    case "text":
      return `<section style="padding:24px;"><h2 style="margin-top:0;">${String(block.config.heading ?? "")}</h2><p style="margin:0;line-height:1.7;">${String(block.config.body ?? "")}</p></section>`;
    case "image":
      return `<section style="padding:24px;text-align:center;"><img src="${String(block.config.src ?? "")}" alt="${String(block.config.alt ?? "")}" style="max-width:100%;border-radius:16px;" /></section>`;
    case "button":
      return `<section style="padding:24px;text-align:center;"><a href="${String(block.config.href ?? "#")}" style="display:inline-block;background:#0f766e;color:#ffffff;padding:14px 28px;border-radius:999px;text-decoration:none;font-weight:600;">${String(block.config.label ?? "Learn more")}</a></section>`;
    case "divider":
      return `<hr style="border:none;border-top:1px solid #e2e8f0;margin:16px 24px;" />`;
    case "spacer":
      return `<div style="height:${Number(block.config.height ?? 24)}px;"></div>`;
    case "social":
      return `<section style="padding:24px;text-align:center;color:#475569;">${String(block.config.text ?? "Follow us on social media.")}</section>`;
    case "footer":
      return `<footer style="padding:24px;color:#64748b;font-size:12px;line-height:1.6;">${String(block.config.body ?? "")}</footer>`;
    case "header_logo": {
      const alignment = block.config.alignment === "left" ? "left" : "center";
      const logoWidth = Number(block.config.logoWidth ?? 160);
      const logoSrc = String(block.config.logoSrc ?? "").trim();
      const logoAlt = String(block.config.logoAlt ?? "Logo");
      return logoSrc
        ? `<section style="padding:16px 24px;text-align:${alignment};"><img src="${logoSrc}" alt="${logoAlt}" style="max-width:${logoWidth}px;height:auto;" /></section>`
        : `<section style="padding:16px 24px;text-align:${alignment};"><div style="font-size:18px;font-weight:700;color:#0f172a;font-family:sans-serif;">${logoAlt}</div></section>`;
    }
    case "columns": {
      const cols = Array.isArray(block.config.columns) ? block.config.columns as Array<Record<string, string>> : [];
      const colWidth = cols.length === 3 ? "33.33%" : "50%";
      const tds = cols.map((col) =>
        `<td style="width:${colWidth};padding:12px 16px;vertical-align:top;text-align:center;"><div style="font-size:28px;line-height:1;">${String(col.iconEmoji ?? "")}</div><div style="margin-top:10px;font-weight:600;font-size:15px;color:#0f172a;font-family:sans-serif;">${String(col.heading ?? "")}</div><div style="margin-top:6px;font-size:14px;line-height:1.55;color:#475569;font-family:sans-serif;">${String(col.body ?? "")}</div></td>`
      ).join("");
      return `<section style="padding:24px 16px;"><table width="100%" cellpadding="0" cellspacing="0" role="presentation" style="border-collapse:collapse;"><tr>${tds}</tr></table></section>`;
    }
    case "quote":
      return `<section style="padding:24px;"><div style="border-left:4px solid #ea580c;padding:16px 20px;background:#fffbf5;border-radius:0 8px 8px 0;"><p style="margin:0;font-style:italic;font-size:16px;line-height:1.65;color:#1e293b;font-family:Georgia,serif;">"${String(block.config.quote ?? "")}"</p><div style="margin-top:12px;font-size:14px;color:#64748b;font-family:sans-serif;"><strong style="color:#334155;">${String(block.config.author ?? "")}</strong>${block.config.role ? `, ${String(block.config.role)}` : ""}</div></div></section>`;
    case "video": {
      const thumbSrc = String(block.config.thumbnailSrc ?? "");
      const videoUrl = String(block.config.videoUrl ?? "#");
      const alt = String(block.config.alt ?? "Video");
      const caption = String(block.config.caption ?? "");
      return `<section style="padding:24px;text-align:center;"><a href="${videoUrl}" style="display:inline-block;text-decoration:none;"><img src="${thumbSrc}" alt="${alt}" style="max-width:100%;border-radius:12px;" /></a>${caption ? `<p style="margin:10px 0 0;font-size:13px;color:#64748b;font-family:sans-serif;">${caption}</p>` : ""}</section>`;
    }
    case "countdown": {
      const endDate = new Date(String(block.config.endDate ?? ""));
      const now = new Date();
      const diff = Math.max(0, endDate.getTime() - now.getTime());
      if (diff <= 0) {
        return `<section style="padding:24px;text-align:center;font-size:16px;color:#64748b;font-family:sans-serif;">${String(block.config.expiredText ?? "This offer has expired.")}</section>`;
      }
      const days = Math.floor(diff / 86400000);
      const hours = Math.floor((diff % 86400000) / 3600000);
      const minutes = Math.floor((diff % 3600000) / 60000);
      return `<section style="padding:24px;text-align:center;background:#fffbf5;"><div style="font-size:13px;font-weight:600;text-transform:uppercase;letter-spacing:0.1em;color:#9a3412;font-family:sans-serif;">${String(block.config.label ?? "")}</div><div style="margin-top:12px;font-size:36px;font-weight:700;color:#0f172a;font-family:sans-serif;">${days}d ${hours}h ${minutes}m</div></section>`;
    }
    case "list": {
      const items = Array.isArray(block.config.items) ? block.config.items as string[] : [];
      const style = String(block.config.style ?? "bullet");
      const heading = String(block.config.heading ?? "");
      const listRows = items.map((item, i) => {
        const marker = style === "checkmark" ? "✓" : style === "numbered" ? `${i + 1}.` : "•";
        return `<tr><td style="padding:6px 0;vertical-align:top;width:28px;color:${style === "checkmark" ? "#16a34a" : "#64748b"};font-weight:700;font-size:15px;font-family:sans-serif;">${marker}</td><td style="padding:6px 0;font-size:15px;line-height:1.55;color:#334155;font-family:sans-serif;">${String(item)}</td></tr>`;
      }).join("");
      return `<section style="padding:24px;">${heading ? `<h3 style="margin:0 0 14px;font-size:18px;font-weight:600;color:#0f172a;font-family:sans-serif;">${heading}</h3>` : ""}<table cellpadding="0" cellspacing="0" role="presentation" style="border-collapse:collapse;">${listRows}</table></section>`;
    }
    default:
      return "";
  }
}
