/**
 * Cumas/Kompass-Direktlink-Generator (Adapter-internal)
 *
 * Generates magic-login URLs into Kompass shop domains, encoded with the
 * Cumas user-ID. Cumas-specific — not part of the generic Plugin contract.
 * Exposed to the worker via `cumasAdapter.resolveLoginLink()`; other CRM
 * adapters simply omit this capability and the worker drops the
 * `{{LOGIN_LINK}}` placeholder.
 *
 * URL-Format:
 *   https://<shopDomain>/willkommen?kid=<encoded>[&type=business]
 *
 * Pool-Routing:
 *   - poolType='private'  (default) → Shop-Backend lookt in `address_pools`
 *   - poolType='business' (&type=business) → Shop-Backend lookt in `business_places`
 *
 * Sicherheit: Das ist Obfuskation, kein Crypto. Die echten Schutz-Layer sind
 * (1) Mail-Verteilung selbst (nur der Mailbox-Empfänger sieht den Link),
 * (2) Kompass-API-JWT-Auth im Shop-Backend.
 */

/**
 * 100-Zeichen-ASCII-Key, identisch zu JS/Python/PHP-Referenz-Implementierungen
 * im Shop-Backend. Änderung hier = sofortige Inkompatibilität mit dem Decoder
 * im Shop. NIEMALS rotieren ohne koordinierten Deploy auf beiden Seiten.
 */
export const KOMPASS_ENCODE_KEY =
  'jjg8CBmUPHaU4Q6MQVsgkftNEXpwdvHcrWh3kPdpCD4hQGq5G2wmghtJb6DbeEPLnvwgBikJQjNJU8DbWWfJEbxJXQyWrhiFvZm3';

/**
 * Encoded eine numerische Cumas-User-ID in den `kid`-Token (vor URL-Encoding).
 *
 * Algorithmus: pro Char `code = userId.charCodeAt(i) + KEY.charCodeAt(i % KEY.length)`,
 * resultierende Codes als Latin-1-String → Base64.
 *
 * KRITISCH (Stolperfalle 1): Latin-1-Encoding, NICHT UTF-8.
 * Die Char-Code-Addition produziert Werte 144-179 (Ziffern '0'-'9' = 48-57,
 * Key-Chars = 50-122, Summe also bis ~179) — das sind Latin-1-Zeichen oberhalb
 * von 127. Mit UTF-8 würden diese als 2-Byte-Sequenzen kodiert und Base64
 * würde einen anderen Output produzieren als die JS-`btoa()`-Referenz.
 *
 * Test-Vektoren (aus Spec):
 *   kompassEncode('123168') === 'm5yaaXl6'
 *   kompassEncode('180480') === 'm6KXbHty'
 */
export function kompassEncode(userId: string): string {
  const codes: number[] = [];
  for (let i = 0; i < userId.length; i++) {
    codes.push(userId.charCodeAt(i) + KOMPASS_ENCODE_KEY.charCodeAt(i % KOMPASS_ENCODE_KEY.length));
  }
  // Uint8Array → Base64. Buffer interpretiert die Bytes als Latin-1, was hier
  // korrekt ist, weil unsere Codes alle <= 255 sind (max. 122+57 = 179).
  return Buffer.from(Uint8Array.from(codes)).toString('base64');
}

/**
 * Baut den finalen Login-Direktlink für einen Empfänger.
 *
 * @param shopDomain — z.B. 'https://www.versicherungsspartarif.de' (mit oder
 *   ohne Schema, mit oder ohne trailing-Slash; Funktion normalisiert).
 * @param userId — Cumas-User-ID (numerisch oder string).
 * @param poolType — 'private' (default, → address_pools) oder 'business'
 *   (→ business_places). Default ist 'private', WEIL ein fehlender `type`-Param
 *   im Shop-Backend als private interpretiert wird.
 * @param recipientId — MailForge-Recipient-ID. Wenn gesetzt, wird `&mf_rcp=…`
 *   angehängt, damit der Shop nach erfolgreichem Login das Email-Attribution-
 *   Cookie setzen kann (Magic-Link-Login zählt dann als Conversion).
 *
 * Rückgabe: leerer String, wenn `shopDomain` oder `userId` leer/undefined sind
 * — das verhindert kaputte Halb-URLs in Mails. Der Caller sollte in dem Fall
 * loggen oder entscheiden, ob er den Tag im Body strippen will.
 *
 * KRITISCH (Stolperfalle 2): Der Base64-Output kann `+`, `/`, `=` enthalten.
 * Ohne `encodeURIComponent` würde `+` im Query-String als Leerzeichen
 * interpretiert → 400 "Link ungültig" beim Decoder.
 *
 * KRITISCH (Stolperfalle 3): Default ist 'private'. Geschäftskunden-IDs OHNE
 * `&type=business` führen zu 404 "Customer not found" — der Caller MUSS den
 * korrekten poolType pro Empfänger mitführen (kommt bei MailForge aus
 * `recipients.poolType`, das wiederum aus `AudienceRecipient.source` bzw.
 * dem CSV-Toggle abgeleitet wird).
 */
export function buildLoginLink(
  shopDomain: string | null | undefined,
  userId: string | number | null | undefined,
  poolType: 'private' | 'business' = 'private',
  recipientId?: string | null,
): string {
  if (!shopDomain) return '';
  if (userId === null || userId === undefined || userId === '') return '';

  const kid = kompassEncode(String(userId));
  const suffix = poolType === 'business' ? '&type=business' : '';
  const attribution = recipientId ? `&mf_rcp=${encodeURIComponent(recipientId)}` : '';

  // Schema-Normalisierung: Bare-Domain ('versicherungsspartarif.de') → https://
  const base = /^https?:\/\//i.test(shopDomain) ? shopDomain : `https://${shopDomain}`;
  // Trailing-Slashes strippen, damit '/willkommen' sauber angefügt wird
  const normalized = base.replace(/\/+$/, '');

  return `${normalized}/willkommen?kid=${encodeURIComponent(kid)}${suffix}${attribution}`;
}
