/**
 * Liest Name, Adresse, Telefon und E-Mail aus einer vCard (.vcf) - deckt
 * vCard 3.0/4.0 so weit ab, wie ein typischer Werkstatt-Kontakt aus dem
 * Adressbuch (iOS/Android/Outlook) sie befüllt. Kein vollständiger Parser,
 * nur die vier Felder, die das Autohaus-Formular (Werkstatt() in
 * Service.tsx) kennt. Deckungsgleich mit vcardParsen() im Panel
 * (audi-dashboard-app.js).
 */

export interface VcardFelder {
  name: string | null
  adresse: string | null
  tel: string | null
  mail: string | null
}

/** Entfernt vCard-Escapes (\n, \,, \;, \\) aus einem Feldwert. */
function entwerten(s: string): string {
  return s.replace(/\\n/gi, "\n").replace(/\\,/g, ",").replace(/\\;/g, ";").replace(/\\\\/g, "\\")
}

export function vcardParsen(text: string): VcardFelder {
  // Gefaltete Zeilen (Fortsetzung mit führendem Leerzeichen/Tab, RFC 6350
  // §3.2) vor dem zeilenweisen Parsen entfalten.
  const entfaltet = text.replace(/\r\n/g, "\n").replace(/\n[ \t]/g, "")
  const zeilen = entfaltet
    .split("\n")
    .map((z) => z.trim())
    .filter(Boolean)

  let name: string | null = null
  let org: string | null = null
  let tel: string | null = null
  let mail: string | null = null
  let adresse: string | null = null

  for (const zeile of zeilen) {
    const doppelpunkt = zeile.indexOf(":")
    if (doppelpunkt < 0) continue
    const eigenschaft = zeile.slice(0, doppelpunkt).split(";")[0]!.toUpperCase()
    const wert = zeile.slice(doppelpunkt + 1)

    if (eigenschaft === "FN" && !name) {
      name = entwerten(wert)
    } else if (eigenschaft === "ORG" && !org) {
      org = entwerten(wert.split(";")[0]!)
    } else if (eigenschaft === "TEL" && !tel) {
      tel = entwerten(wert)
    } else if (eigenschaft === "EMAIL" && !mail) {
      mail = entwerten(wert)
    } else if (eigenschaft === "ADR" && !adresse) {
      // PO-Box(0), Zusatz(1), Straße(2), Ort(3), Region(4), PLZ(5), Land(6) -
      // zu einer lesbaren Ein-Zeilen-Adresse zusammengefasst, weil das
      // Formularfeld nur eine Zeile kennt.
      const teile = wert.split(";").map(entwerten)
      const strasse = [teile[1], teile[2]].filter(Boolean).join(" ")
      const ort = [teile[5], teile[3]].filter(Boolean).join(" ")
      adresse = [strasse, ort, teile[6]].filter(Boolean).join(", ") || null
    }
  }

  if (!name && !org && !tel && !mail && !adresse) {
    throw new Error("Keine lesbaren Kontaktfelder gefunden - ist das eine .vcf-Datei?")
  }
  return { name: name ?? org, adresse, tel, mail }
}
