import { describe, expect, it } from "vitest"

import { vcardParsen } from "./vcard"

describe("vcardParsen", () => {
  it("liest FN, TEL, EMAIL und eine zusammengesetzte ADR", () => {
    const vcard = [
      "BEGIN:VCARD",
      "VERSION:3.0",
      "FN:Autohaus Mustermann",
      "TEL;TYPE=WORK,VOICE:+49 123 4567890",
      "EMAIL;TYPE=INTERNET:info@example.com",
      "ADR;TYPE=WORK:;;Musterstraße 1;Musterstadt;;12345;Deutschland",
      "END:VCARD",
    ].join("\r\n")

    expect(vcardParsen(vcard)).toEqual({
      name: "Autohaus Mustermann",
      adresse: "Musterstraße 1, 12345 Musterstadt, Deutschland",
      tel: "+49 123 4567890",
      mail: "info@example.com",
    })
  })

  it("fällt ohne FN auf ORG zurück", () => {
    const vcard = ["BEGIN:VCARD", "VERSION:3.0", "ORG:Autohaus GmbH", "END:VCARD"].join("\n")
    expect(vcardParsen(vcard).name).toBe("Autohaus GmbH")
  })

  it("entfaltet gefaltete Zeilen vor dem Parsen", () => {
    // CRLF + genau ein WSP-Zeichen werden beim Entfalten vollständig entfernt
    // (RFC 6350 §3.2) - hier mitten im Wort "Mustermann" gefaltet, damit ein
    // falsches Verhalten (WSP durch ein Leerzeichen statt durch nichts
    // ersetzt) den Test sichtbar brechen würde.
    const vcard = ["BEGIN:VCARD", "VERSION:3.0", "FN:Autohaus Muster\n mann", "END:VCARD"].join(
      "\n",
    )
    expect(vcardParsen(vcard).name).toBe("Autohaus Mustermann")
  })

  it("entfernt vCard-Escapezeichen aus Feldwerten", () => {
    const vcard = ["BEGIN:VCARD", "VERSION:3.0", "FN:Mueller\\, Schmidt und Partner"].join("\n")
    expect(vcardParsen(vcard).name).toBe("Mueller, Schmidt und Partner")
  })

  it("nimmt jeweils nur die erste Zeile bei mehrfachen TEL/EMAIL/ADR", () => {
    const vcard = [
      "BEGIN:VCARD",
      "VERSION:3.0",
      "TEL;TYPE=WORK:+49 111",
      "TEL;TYPE=CELL:+49 222",
      "EMAIL:erste@example.com",
      "EMAIL:zweite@example.com",
      "END:VCARD",
    ].join("\n")
    const f = vcardParsen(vcard)
    expect(f.tel).toBe("+49 111")
    expect(f.mail).toBe("erste@example.com")
  })

  it("wirft einen Fehler ohne jedes lesbare Feld", () => {
    const vcard = ["BEGIN:VCARD", "VERSION:3.0", "END:VCARD"].join("\n")
    expect(() => vcardParsen(vcard)).toThrow()
  })

  it("wirft einen Fehler bei völlig fremdem Dateiinhalt", () => {
    expect(() => vcardParsen("Das ist keine vCard.")).toThrow()
  })
})
