/**
 * MJML template rendering — system-communications-notifications.
 *
 * Looks up the MJML template by (templateKey, locale), compiles it to HTML,
 * interpolates `vars`, and sets `<html lang>` + `<body dir>` from `locale`.
 *
 * Locale resolution:
 *   he / he-IL → dir="rtl" lang="he" font-family: 'Heebo', Arial, sans-serif
 *   en / en-US → dir="ltr" lang="en"
 */

import { prepareInterpolationValue } from './escape'

type Locale = 'he-IL' | 'en-US'

interface RenderOptions {
  templateKey: string
  vars: Record<string, string>
  locale: Locale
}

interface RenderedEmail {
  html: string
  text: string
}

/**
 * Inline MJML-like template registry.
 *
 * Each entry returns an HTML string (MJML pre-compiled for Workers
 * compatibility — full MJML compilation requires Node; for Workers we ship
 * pre-compiled templates stored as strings and do variable interpolation).
 */
const TEMPLATES: Record<string, Record<string, string>> = {
  'invoice-sent': {
    he: `<!DOCTYPE html><html lang="he"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>{{subject}}</title></head><body dir="rtl" lang="he" style="font-family:'Heebo',Arial,sans-serif;margin:0;padding:0;background:#f5f5f5;"><div role="table" style="width:100%;max-width:600px;margin:0 auto;background:#ffffff;"><div role="row"><div role="cell" style="padding:40px 24px;text-align:right;"><h1 style="font-size:24px;color:#1a1a1a;margin:0 0 16px;">{{title}}</h1><p style="font-size:16px;color:#444;line-height:1.6;margin:0 0 24px;">{{body}}</p>{{actionButtons}}<p style="font-size:13px;color:#888;margin:32px 0 0;">Zync.is</p></div></div></div></body></html>`,
    en: `<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>{{subject}}</title></head><body dir="ltr" lang="en" style="font-family:'IBM Plex Sans',Arial,sans-serif;margin:0;padding:0;background:#f5f5f5;"><div role="table" style="width:100%;max-width:600px;margin:0 auto;background:#ffffff;"><div role="row"><div role="cell" style="padding:40px 24px;"><h1 style="font-size:24px;color:#1a1a1a;margin:0 0 16px;">{{title}}</h1><p style="font-size:16px;color:#444;line-height:1.6;margin:0 0 24px;">{{body}}</p>{{actionButtons}}<p style="font-size:13px;color:#888;margin:32px 0 0;">Zync.is</p></div></div></div></body></html>`,
  },
  verification: {
    he: `<!DOCTYPE html><html lang="he"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>{{subject}}</title></head><body dir="rtl" lang="he" style="font-family:'Heebo',Arial,sans-serif;margin:0;padding:0;background:#f5f5f5;"><div role="table" style="width:100%;max-width:600px;margin:0 auto;background:#ffffff;"><div role="row"><div role="cell" style="padding:40px 24px;text-align:right;"><h1 style="font-size:24px;color:#1a1a1a;margin:0 0 16px;">{{title}}</h1><p style="font-size:16px;color:#444;line-height:1.6;margin:0 0 24px;">{{body}}</p><a href="{{verificationUrl}}" style="display:inline-block;padding:12px 24px;background:#6b21a8;color:#fff;text-decoration:none;border-radius:4px;font-size:16px;">{{ctaLabel}}</a><p style="font-size:13px;color:#888;margin:32px 0 0;">Zync.is</p></div></div></div></body></html>`,
    en: `<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>{{subject}}</title></head><body dir="ltr" lang="en" style="font-family:'IBM Plex Sans',Arial,sans-serif;margin:0;padding:0;background:#f5f5f5;"><div role="table" style="width:100%;max-width:600px;margin:0 auto;background:#ffffff;"><div role="row"><div role="cell" style="padding:40px 24px;"><h1 style="font-size:24px;color:#1a1a1a;margin:0 0 16px;">{{title}}</h1><p style="font-size:16px;color:#444;line-height:1.6;margin:0 0 24px;">{{body}}</p><a href="{{verificationUrl}}" style="display:inline-block;padding:12px 24px;background:#6b21a8;color:#fff;text-decoration:none;border-radius:4px;font-size:16px;">{{ctaLabel}}</a><p style="font-size:13px;color:#888;margin:32px 0 0;">Zync.is</p></div></div></div></body></html>`,
  },
  invitation: {
    he: `<!DOCTYPE html><html lang="he"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>{{subject}}</title></head><body dir="rtl" lang="he" style="font-family:'Heebo',Arial,sans-serif;margin:0;padding:0;background:#f5f5f5;"><div role="table" style="width:100%;max-width:600px;margin:0 auto;background:#ffffff;"><div role="row"><div role="cell" style="padding:40px 24px;text-align:right;"><h1 style="font-size:24px;color:#1a1a1a;margin:0 0 16px;">{{title}}</h1><p style="font-size:16px;color:#444;line-height:1.6;margin:0 0 24px;">{{body}}</p><a href="{{inviteUrl}}" style="display:inline-block;padding:12px 24px;background:#6b21a8;color:#fff;text-decoration:none;border-radius:4px;font-size:16px;">{{ctaLabel}}</a><p style="font-size:13px;color:#888;margin:32px 0 0;">Zync.is</p></div></div></div></body></html>`,
    en: `<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>{{subject}}</title></head><body dir="ltr" lang="en" style="font-family:'IBM Plex Sans',Arial,sans-serif;margin:0;padding:0;background:#f5f5f5;"><div role="table" style="width:100%;max-width:600px;margin:0 auto;background:#ffffff;"><div role="row"><div role="cell" style="padding:40px 24px;"><h1 style="font-size:24px;color:#1a1a1a;margin:0 0 16px;">{{title}}</h1><p style="font-size:16px;color:#444;line-height:1.6;margin:0 0 24px;">{{body}}</p><a href="{{inviteUrl}}" style="display:inline-block;padding:12px 24px;background:#6b21a8;color:#fff;text-decoration:none;border-radius:4px;font-size:16px;">{{ctaLabel}}</a><p style="font-size:13px;color:#888;margin:32px 0 0;">Zync.is</p></div></div></div></body></html>`,
  },
  'password-reset': {
    he: `<!DOCTYPE html><html lang="he"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>{{subject}}</title></head><body dir="rtl" lang="he" style="font-family:'Heebo',Arial,sans-serif;margin:0;padding:0;background:#f5f5f5;"><div role="table" style="width:100%;max-width:600px;margin:0 auto;background:#ffffff;"><div role="row"><div role="cell" style="padding:40px 24px;text-align:right;"><h1 style="font-size:24px;color:#1a1a1a;margin:0 0 16px;">{{title}}</h1><p style="font-size:16px;color:#444;line-height:1.6;margin:0 0 24px;">{{body}}</p><a href="{{resetUrl}}" style="display:inline-block;padding:12px 24px;background:#6b21a8;color:#fff;text-decoration:none;border-radius:4px;font-size:16px;">{{ctaLabel}}</a><p style="font-size:13px;color:#888;margin:16px 0 0;">{{expiryNote}}</p><p style="font-size:13px;color:#888;margin:32px 0 0;">Zync.is</p></div></div></div></body></html>`,
    en: `<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>{{subject}}</title></head><body dir="ltr" lang="en" style="font-family:'IBM Plex Sans',Arial,sans-serif;margin:0;padding:0;background:#f5f5f5;"><div role="table" style="width:100%;max-width:600px;margin:0 auto;background:#ffffff;"><div role="row"><div role="cell" style="padding:40px 24px;"><h1 style="font-size:24px;color:#1a1a1a;margin:0 0 16px;">{{title}}</h1><p style="font-size:16px;color:#444;line-height:1.6;margin:0 0 24px;">{{body}}</p><a href="{{resetUrl}}" style="display:inline-block;padding:12px 24px;background:#6b21a8;color:#fff;text-decoration:none;border-radius:4px;font-size:16px;">{{ctaLabel}}</a><p style="font-size:13px;color:#888;margin:16px 0 0;">{{expiryNote}}</p><p style="font-size:13px;color:#888;margin:32px 0 0;">Zync.is</p></div></div></div></body></html>`,
  },
  /** Invoice payment reminder: vars = { subject, title, body, invoiceRef, amount, currency } */
  'invoice_reminder': {
    he: `<!DOCTYPE html><html lang="he"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>{{subject}}</title></head><body dir="rtl" lang="he" style="font-family:'Heebo',Arial,sans-serif;margin:0;padding:0;background:#f5f5f5;"><div role="table" style="width:100%;max-width:600px;margin:0 auto;background:#ffffff;"><div role="row"><div role="cell" style="padding:40px 24px;text-align:right;"><h1 style="font-size:24px;color:#1a1a1a;margin:0 0 16px;">{{title}}</h1><p style="font-size:16px;color:#444;line-height:1.6;margin:0 0 24px;">{{body}}</p><p style="font-size:13px;color:#888;margin:32px 0 0;">Zync.is</p></div></div></div></body></html>`,
    en: `<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>{{subject}}</title></head><body dir="ltr" lang="en" style="font-family:'IBM Plex Sans',Arial,sans-serif;margin:0;padding:0;background:#f5f5f5;"><div role="table" style="width:100%;max-width:600px;margin:0 auto;background:#ffffff;"><div role="row"><div role="cell" style="padding:40px 24px;"><h1 style="font-size:24px;color:#1a1a1a;margin:0 0 16px;">{{title}}</h1><p style="font-size:16px;color:#444;line-height:1.6;margin:0 0 24px;">{{body}}</p><p style="font-size:13px;color:#888;margin:32px 0 0;">Zync.is</p></div></div></div></body></html>`,
  },
  /** Support ticket staff reply: vars = { subject, customerName, ticketSubject, replyBody, ticketRef } */
  'ticket_reply': {
    he: `<!DOCTYPE html><html lang="he"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>{{subject}}</title></head><body dir="rtl" lang="he" style="font-family:'Heebo',Arial,sans-serif;margin:0;padding:0;background:#f5f5f5;"><div role="table" style="width:100%;max-width:600px;margin:0 auto;background:#ffffff;"><div role="row"><div role="cell" style="padding:40px 24px;text-align:right;"><h1 style="font-size:24px;color:#1a1a1a;margin:0 0 16px;">תגובה לפניית התמיכה שלך</h1><p style="font-size:16px;color:#444;line-height:1.6;margin:0 0 8px;">שלום {{customerName}},</p><p style="font-size:14px;color:#666;line-height:1.5;margin:0 0 24px;">פנייה {{ticketRef}} · {{ticketSubject}}</p><p style="font-size:16px;color:#444;line-height:1.6;margin:0 0 24px;white-space:pre-wrap;">{{replyBody}}</p><p style="font-size:13px;color:#888;margin:32px 0 0;">Zync.is</p></div></div></div></body></html>`,
    en: `<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>{{subject}}</title></head><body dir="ltr" lang="en" style="font-family:'IBM Plex Sans',Arial,sans-serif;margin:0;padding:0;background:#f5f5f5;"><div role="table" style="width:100%;max-width:600px;margin:0 auto;background:#ffffff;"><div role="row"><div role="cell" style="padding:40px 24px;"><h1 style="font-size:24px;color:#1a1a1a;margin:0 0 16px;">Reply to your support request</h1><p style="font-size:16px;color:#444;line-height:1.6;margin:0 0 8px;">Hello {{customerName}},</p><p style="font-size:14px;color:#666;line-height:1.5;margin:0 0 24px;">Ticket {{ticketRef}} · {{ticketSubject}}</p><p style="font-size:16px;color:#444;line-height:1.6;margin:0 0 24px;white-space:pre-wrap;">{{replyBody}}</p><p style="font-size:13px;color:#888;margin:32px 0 0;">Zync.is</p></div></div></div></body></html>`,
  },
  /**
   * Payment link email: vars = { subject, title, body, payment_link }
   * payment_link is rendered as both a CTA button href and interpolated into body text.
   */
  'payment_link': {
    he: `<!DOCTYPE html><html lang="he"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>{{subject}}</title></head><body dir="rtl" lang="he" style="font-family:'Heebo',Arial,sans-serif;margin:0;padding:0;background:#f5f5f5;"><div role="table" style="width:100%;max-width:600px;margin:0 auto;background:#ffffff;"><div role="row"><div role="cell" style="padding:40px 24px;text-align:right;"><h1 style="font-size:24px;color:#1a1a1a;margin:0 0 16px;">{{title}}</h1><p style="font-size:16px;color:#444;line-height:1.6;margin:0 0 24px;">{{body}}</p><a href="{{payment_link}}" style="display:inline-block;padding:12px 24px;background:#6b21a8;color:#fff;text-decoration:none;border-radius:4px;font-size:16px;">שלם עכשיו</a><p style="font-size:13px;color:#888;margin:32px 0 0;">Zync.is</p></div></div></div></body></html>`,
    en: `<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>{{subject}}</title></head><body dir="ltr" lang="en" style="font-family:'IBM Plex Sans',Arial,sans-serif;margin:0;padding:0;background:#f5f5f5;"><div role="table" style="width:100%;max-width:600px;margin:0 auto;background:#ffffff;"><div role="row"><div role="cell" style="padding:40px 24px;"><h1 style="font-size:24px;color:#1a1a1a;margin:0 0 16px;">{{title}}</h1><p style="font-size:16px;color:#444;line-height:1.6;margin:0 0 24px;">{{body}}</p><a href="{{payment_link}}" style="display:inline-block;padding:12px 24px;background:#6b21a8;color:#fff;text-decoration:none;border-radius:4px;font-size:16px;">Pay Now</a><p style="font-size:13px;color:#888;margin:32px 0 0;">Zync.is</p></div></div></div></body></html>`,
  },
  /** Payment receipt after invoice paid / receipt issued: vars include actionButtons + invoiceNumber */
  invoice_paid_receipt: {
    he: `<!DOCTYPE html><html lang="he"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>{{subject}}</title></head><body dir="rtl" lang="he" style="font-family:'Heebo',Arial,sans-serif;margin:0;padding:0;background:#f5f5f5;"><div role="table" style="width:100%;max-width:600px;margin:0 auto;background:#ffffff;"><div role="row"><div role="cell" style="padding:40px 24px;text-align:right;"><h1 style="font-size:24px;color:#1a1a1a;margin:0 0 16px;">{{title}}</h1><p style="font-size:16px;color:#444;line-height:1.6;margin:0 0 24px;">{{body}}</p>{{actionButtons}}<p style="font-size:13px;color:#888;margin:32px 0 0;">Zync.is</p></div></div></div></body></html>`,
    en: `<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>{{subject}}</title></head><body dir="ltr" lang="en" style="font-family:'IBM Plex Sans',Arial,sans-serif;margin:0;padding:0;background:#f5f5f5;"><div role="table" style="width:100%;max-width:600px;margin:0 auto;background:#ffffff;"><div role="row"><div role="cell" style="padding:40px 24px;"><h1 style="font-size:24px;color:#1a1a1a;margin:0 0 16px;">{{title}}</h1><p style="font-size:16px;color:#444;line-height:1.6;margin:0 0 24px;">{{body}}</p>{{actionButtons}}<p style="font-size:13px;color:#888;margin:32px 0 0;">Zync.is</p></div></div></div></body></html>`,
  },
  /** Timer magic-link: vars = { title, body, link, ctaLabel, expiryNote } */
  'timer-magic-link': {
    he: `<!DOCTYPE html><html lang="he"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>{{subject}}</title></head><body dir="rtl" lang="he" style="font-family:'Heebo',Arial,sans-serif;margin:0;padding:0;background:#f5f5f5;"><div role="table" style="width:100%;max-width:600px;margin:0 auto;background:#ffffff;"><div role="row"><div role="cell" style="padding:40px 24px;text-align:right;"><h1 style="font-size:24px;color:#1a1a1a;margin:0 0 16px;">{{title}}</h1><p style="font-size:16px;color:#444;line-height:1.6;margin:0 0 24px;">{{body}}</p><a href="{{link}}" style="display:inline-block;padding:12px 24px;background:#6b21a8;color:#fff;text-decoration:none;border-radius:4px;font-size:16px;">{{ctaLabel}}</a><p style="font-size:13px;color:#888;margin:16px 0 0;">{{expiryNote}}</p><p style="font-size:13px;color:#888;margin:32px 0 0;">Zync.is</p></div></div></div></body></html>`,
    en: `<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>{{subject}}</title></head><body dir="ltr" lang="en" style="font-family:'IBM Plex Sans',Arial,sans-serif;margin:0;padding:0;background:#f5f5f5;"><div role="table" style="width:100%;max-width:600px;margin:0 auto;background:#ffffff;"><div role="row"><div role="cell" style="padding:40px 24px;"><h1 style="font-size:24px;color:#1a1a1a;margin:0 0 16px;">{{title}}</h1><p style="font-size:16px;color:#444;line-height:1.6;margin:0 0 24px;">{{body}}</p><a href="{{link}}" style="display:inline-block;padding:12px 24px;background:#6b21a8;color:#fff;text-decoration:none;border-radius:4px;font-size:16px;">{{ctaLabel}}</a><p style="font-size:13px;color:#888;margin:16px 0 0;">{{expiryNote}}</p><p style="font-size:13px;color:#888;margin:32px 0 0;">Zync.is</p></div></div></div></body></html>`,
  },
  subscription_cancelled: {
    he: `<!DOCTYPE html><html lang="he"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>{{subject}}</title></head><body dir="rtl" lang="he" style="font-family:'Heebo',Arial,sans-serif;margin:0;padding:0;background:#f5f5f5;"><div role="table" style="width:100%;max-width:600px;margin:0 auto;background:#ffffff;"><div role="row"><div role="cell" style="padding:40px 24px;text-align:right;"><h1 style="font-size:24px;color:#1a1a1a;margin:0 0 16px;">{{title}}</h1><p style="font-size:16px;color:#444;line-height:1.6;margin:0 0 16px;">{{body}}</p><p style="font-size:14px;color:#666;line-height:1.5;margin:0 0 8px;">תאריך הביטול: {{cancellationDate}}</p><p style="font-size:14px;color:#666;line-height:1.5;margin:0 0 24px;">סיום גישה: {{periodEnd}}</p><a href="{{reactivateUrl}}" style="display:inline-block;padding:12px 24px;background:#6b21a8;color:#fff;text-decoration:none;border-radius:4px;font-size:16px;">הפעל מחדש</a><p style="font-size:13px;color:#888;margin:32px 0 0;">Zync.is</p></div></div></div></body></html>`,
    en: `<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>{{subject}}</title></head><body dir="ltr" lang="en" style="font-family:'IBM Plex Sans',Arial,sans-serif;margin:0;padding:0;background:#f5f5f5;"><div role="table" style="width:100%;max-width:600px;margin:0 auto;background:#ffffff;"><div role="row"><div role="cell" style="padding:40px 24px;"><h1 style="font-size:24px;color:#1a1a1a;margin:0 0 16px;">{{title}}</h1><p style="font-size:16px;color:#444;line-height:1.6;margin:0 0 16px;">{{body}}</p><p style="font-size:14px;color:#666;line-height:1.5;margin:0 0 8px;">Cancellation date: {{cancellationDate}}</p><p style="font-size:14px;color:#666;line-height:1.5;margin:0 0 24px;">Access ends: {{periodEnd}}</p><a href="{{reactivateUrl}}" style="display:inline-block;padding:12px 24px;background:#6b21a8;color:#fff;text-decoration:none;border-radius:4px;font-size:16px;">Reactivate</a><p style="font-size:13px;color:#888;margin:32px 0 0;">Zync.is</p></div></div></div></body></html>`,
  },
}

/** Resolve locale to canonical base tag (he or en). */
function resolveLocaleTag(locale: Locale): 'he' | 'en' {
  if (locale === 'he-IL') return 'he'
  return 'en'
}

/** Interpolate `{{key}}` placeholders from `vars` (escaped by default for HTML context). */
function interpolate(template: string, vars: Record<string, string>): string {
  return template.replace(/\{\{(\w+)\}\}/g, (_, key: string) => {
    const raw = vars[key] ?? ''
    return prepareInterpolationValue(key, raw)
  })
}

/** Build a plain-text fallback from the vars. */
function buildPlainText(vars: Record<string, string>): string {
  const parts: string[] = []
  if (vars['title']) parts.push(vars['title'])
  if (vars['body']) parts.push(vars['body'])
  if (vars['verificationUrl']) parts.push(vars['verificationUrl'])
  if (vars['inviteUrl']) parts.push(vars['inviteUrl'])
  if (vars['resetUrl']) parts.push(vars['resetUrl'])
  if (vars['link']) parts.push(vars['link'])
  if (vars['reactivateUrl']) parts.push(vars['reactivateUrl'])
  if (vars['replyBody']) {
    const header = [vars['customerName'], vars['ticketRef'], vars['ticketSubject']]
      .filter(Boolean)
      .join(' · ')
    parts.push(header ? `${header}\n\n${vars['replyBody']}` : vars['replyBody'])
  }
  return parts.join('\n\n')
}

/**
 * Render an email template to HTML + plain-text.
 * Sets html lang + body dir from locale independently of the template key.
 */
export function renderEmailTemplate(opts: RenderOptions): RenderedEmail {
  const { templateKey, vars, locale } = opts
  const tag = resolveLocaleTag(locale)
  const templateGroup = TEMPLATES[templateKey]
  if (!templateGroup) {
    throw new Error(`Unknown email templateKey: ${templateKey}`)
  }
  const raw = templateGroup[tag] ?? templateGroup['en']
  if (!raw) {
    throw new Error(`No template found for key=${templateKey} locale=${tag}`)
  }

  const html = interpolate(raw, vars)
  const text = buildPlainText(vars)
  return { html, text }
}
