/**
 * Termine als Kalenderdatei. Portiert aus `ics()` im alten Panel.
 *
 * Erzeugt eine .ics-Datei im Browser, ohne Server — sie landet als Download
 * bzw. auf dem iPhone direkt im Kalender. Mit Erinnerung zwei Tage vorher.
 */

function zeilenUmbruch(text: string): string {
  return text.replace(/\\/g, "\\\\").replace(/;/g, "\\;").replace(/,/g, "\\,").replace(/\n/g, "\\n")
}

function alsIcsDatum(isoTag: string): string {
  return isoTag.replace(/-/g, "")
}

export function kalenderDatei(titel: string, isoTag: string, beschreibung = ""): string {
  const stempel = new Date().toISOString().replace(/[-:]/g, "").split(".")[0] + "Z"
  const start = alsIcsDatum(isoTag)
  const ende = alsIcsDatum(
    new Date(new Date(isoTag).getTime() + 86_400_000).toISOString().slice(0, 10),
  )

  return [
    "BEGIN:VCALENDAR",
    "VERSION:2.0",
    "PRODID:-//DataMetric360//DE",
    "CALSCALE:GREGORIAN",
    "BEGIN:VEVENT",
    `UID:dm360-${start}-${Math.abs(hash(titel))}@datametric360`,
    `DTSTAMP:${stempel}`,
    `DTSTART;VALUE=DATE:${start}`,
    `DTEND;VALUE=DATE:${ende}`,
    `SUMMARY:${zeilenUmbruch(titel)}`,
    beschreibung ? `DESCRIPTION:${zeilenUmbruch(beschreibung)}` : "",
    "BEGIN:VALARM",
    "TRIGGER:-P2D",
    "ACTION:DISPLAY",
    `DESCRIPTION:${zeilenUmbruch(titel)}`,
    "END:VALARM",
    "END:VEVENT",
    "END:VCALENDAR",
  ]
    .filter(Boolean)
    .join("\r\n")
}

function hash(text: string): number {
  let wert = 0
  for (let i = 0; i < text.length; i++) wert = (wert * 31 + text.charCodeAt(i)) | 0
  return wert
}

export function kalenderDateiLaden(titel: string, isoTag: string, beschreibung = ""): void {
  const inhalt = kalenderDatei(titel, isoTag, beschreibung)
  const blob = new Blob([inhalt], { type: "text/calendar;charset=utf-8" })
  const url = URL.createObjectURL(blob)
  const verweis = document.createElement("a")
  verweis.href = url
  verweis.download = `${titel.replace(/[^\wäöüÄÖÜß-]+/g, "-").toLowerCase()}.ics`
  document.body.appendChild(verweis)
  verweis.click()
  verweis.remove()
  URL.revokeObjectURL(url)
}
