#!/usr/bin/env python3

import argparse
import json
import os
import sys
from pathlib import Path

try:
    import pandas as pd
except ImportError:
    print(
        'Fehler: pandas fehlt. Installieren Sie pandas und openpyxl mit "python -m pip install pandas openpyxl".',
        file=sys.stderr,
    )
    sys.exit(1)


def required_value(name, value):
    """Bricht mit einer verständlichen Meldung ab, wenn ein Pflichtwert fehlt."""
    if not value or not value.strip():
        raise ValueError(f"Der Wert {name} fehlt.")
    return value.strip()


def main():
    parser = argparse.ArgumentParser(description="Konvertiert eine JSON-Schichtliste in eine Excel-Datei.")
    parser.add_argument("--input")
    parser.add_argument("--output")
    arguments = parser.parse_args()

    # Werte aus der Kommandozeile überschreiben die gleichnamigen Umgebungsvariablen.
    input_path = required_value("PLANERIO_JSON_INPUT bzw. --input", arguments.input or os.getenv("PLANERIO_JSON_INPUT"))
    output_path = arguments.output or os.getenv("PLANERIO_EXCEL_OUTPUT", "schichten.xlsx")

    try:
        records = json.loads(Path(input_path).read_text(encoding="utf-8"))
    except (OSError, json.JSONDecodeError) as error:
        raise RuntimeError(f"Die Datei {input_path} konnte nicht als JSON gelesen werden.") from error

    if not isinstance(records, list) or not records or not all(isinstance(record, dict) for record in records):
        raise ValueError("Die JSON-Datei muss mindestens ein Objekt in einer Liste enthalten.")

    # pandas übernimmt die JSON-Feldnamen als Spaltenüberschriften der Excel-Datei.
    data_frame = pd.DataFrame(records)
    data_frame.to_excel(output_path, sheet_name="Schichten", index=False, engine="openpyxl")
    print(f"Excel-Datei wurde unter {output_path} erstellt.")


if __name__ == "__main__":
    try:
        main()
    except (OSError, RuntimeError, ValueError) as error:
        print(f"Fehler: {error}", file=sys.stderr)
        sys.exit(1)
