#!/usr/bin/env python3
#python3 csv_to_json.py recipients.csv -o recipients.json --pretty
import csv
import json
import argparse
import sys
from pathlib import Path


def csv_to_recipients(csv_path: Path, delimiter: str = ";") -> dict:
    recipients = []

    with csv_path.open("r", encoding="utf-8", newline="") as f:
        reader = csv.reader(f, delimiter=delimiter)
        for line_no, row in enumerate(reader, start=1):
            # Leere Zeilen ignorieren
            if not row or all(not cell.strip() for cell in row):
                continue

            if len(row) < 2:
                raise ValueError(
                    f"Zeile {line_no}: Erwartet 'email{delimiter}username', bekommen: {row}"
                )

            email = row[0].strip()
            username = row[1].strip()

            if not email or not username:
                raise ValueError(
                    f"Zeile {line_no}: Email oder Username leer: {row}"
                )

            recipients.append({"email": email, "username": username})

    return {"recipients": recipients}


def main():
    parser = argparse.ArgumentParser(
        description="Konvertiert eine ';'-separierte CSV (email;username pro Zeile) in ein JSON-Objekt."
    )
    parser.add_argument("csv_file", help="Pfad zur Input-CSV")
    parser.add_argument(
        "-o", "--output",
        help="Pfad zur Output-JSON (wenn nicht gesetzt: stdout)",
        default=None
    )
    parser.add_argument(
        "-d", "--delimiter",
        help="Trennzeichen in der CSV (Standard: ';')",
        default=";"
    )
    parser.add_argument(
        "--pretty",
        help="JSON hübsch formatieren",
        action="store_true"
    )

    args = parser.parse_args()

    csv_path = Path(args.csv_file)
    if not csv_path.exists():
        print(f"Datei nicht gefunden: {csv_path}", file=sys.stderr)
        sys.exit(1)

    data = csv_to_recipients(csv_path, delimiter=args.delimiter)

    json_kwargs = {"ensure_ascii": False}
    if args.pretty:
        json_kwargs.update({"indent": 2})

    out_str = json.dumps(data, **json_kwargs)

    if args.output:
        out_path = Path(args.output)
        out_path.write_text(out_str, encoding="utf-8")
    else:
        print(out_str)


if __name__ == "__main__":
    main()