/**
 * Open/Click-Tracking-Injektion für Email-HTML.
 *
 * - Open-Pixel: 1×1-img-Tag direkt vor `</body>` mit per-recipient/per-variant URL
 * - Click-Wrapper: alle `<a href>` werden durch den Tracking-Redirect-Endpoint geleitet
 *
 * Reihenfolge im Worker: `applyUtmToHtml(html)` → `applyTracking(html, ctx)` → send.
 * Das Tracking wickelt die UTM-angereicherte URL als `to`-Param ein, so dass nach dem 302
 * der finale Klick auf der Ziel-URL inkl. UTM landet (Google Analytics liest sie).
 */

export interface TrackingContext {
  campaignId: string;
  variantId: string | null;
  recipientId: string | null;
  /** Basis-URL des Mailforge-Servers — z.B. https://mailforge.example.de */
  baseUrl: string;
}

/** True wenn die URL eine echte Web-URL ist die durch den Click-Wrapper gewrappt werden soll. */
function isWrappableHref(url: string): boolean {
  const u = url.trim().toLowerCase();
  if (!u) return false;
  if (u.startsWith('mailto:') || u.startsWith('tel:') || u.startsWith('sms:')) return false;
  if (u.startsWith('#')) return false; // Page-Anchor
  if (u.includes('/api/track/click')) return false; // Schon gewrappt → idempotent
  if (u.includes('/unsubscribe') || u.includes('list-unsubscribe') || u.includes('?unsub')) return false;
  return u.startsWith('http://') || u.startsWith('https://');
}

/** Baut den Click-Tracking-Redirect-URL um eine bestehende Ziel-URL. */
function wrapClickUrl(targetUrl: string, ctx: TrackingContext): string {
  const params = new URLSearchParams();
  params.set('to', targetUrl);
  params.set('c', ctx.campaignId);
  if (ctx.variantId) params.set('v', ctx.variantId);
  if (ctx.recipientId) params.set('r', ctx.recipientId);
  return `${ctx.baseUrl}/api/track/click?${params.toString()}`;
}

/** Baut die Open-Pixel-URL. */
function buildOpenPixelUrl(ctx: TrackingContext): string {
  const params = new URLSearchParams();
  params.set('c', ctx.campaignId);
  if (ctx.variantId) params.set('v', ctx.variantId);
  if (ctx.recipientId) params.set('r', ctx.recipientId);
  return `${ctx.baseUrl}/api/track/open?${params.toString()}`;
}

/**
 * Reichert HTML mit Open-Pixel + Click-Wrapping an.
 * Idempotent: doppelte Anwendung erzeugt keine Doppel-Pixel und keine doppelt gewrappten Links.
 */
export function applyTracking(html: string, ctx: TrackingContext): string {
  if (!ctx.campaignId) return html;

  // 1. Click-Wrapping aller `<a href>` (außer Skip-Liste)
  let modified = html.replace(/href=(["'])([^"']+)\1/gi, (_match, quote: string, url: string) => {
    if (!isWrappableHref(url)) return `href=${quote}${url}${quote}`;
    return `href=${quote}${wrapClickUrl(url, ctx)}${quote}`;
  });

  // 2. Open-Pixel injizieren (wenn nicht schon vorhanden)
  if (!modified.includes('data-mf-open-pixel')) {
    const pixelUrl = buildOpenPixelUrl(ctx);
    const pixelTag = `<img src="${pixelUrl}" width="1" height="1" alt="" data-mf-open-pixel="1" style="display:block;width:1px;height:1px;border:0;outline:none" />`;
    if (modified.includes('</body>')) {
      modified = modified.replace('</body>', `${pixelTag}</body>`);
    } else {
      modified = modified + pixelTag;
    }
  }

  return modified;
}
