#!/usr/bin/env python3
"""
iban_csv_converter.py - Konvertiert eine CSV mit Kontodaten in eine CSV mit IBAN.

Erwartetes Eingabeformat (Semikolon-getrennt, 12 Felder):
"DE";"00001";"  763910001835904   0021447250";;;76391000;1835904;;;;;

Feld 6: Bankleitzahl (BLZ)
Feld 7: Kontonummer

Ausgabedatei enthaelt dieselbe Struktur plus eine zusaetzliche Spalte fuer die IBAN.

Nutzung:
    python iban_csv_converter.py eingabe.csv ausgabe.csv

    # Beispiel mit deinem virtuellen Umfeld:
    /home/alin/iban_tool/venv/bin/python /home/alin/iban_tool/iban_csv_converter.py daten.csv daten_m_iban.csv
"""
import argparse
import csv
import sys
from schwifty import IBAN


def generate_iban(kontonummer: str, bankleitzahl: str) -> str:
    """Erzeugt eine deutsche IBAN aus Kontonummer und Bankleitzahl."""
    try:
        bankleitzahl = str(int(bankleitzahl))  # fuehrende Nullen entfernen
    except ValueError:
        pass

    iban_obj = IBAN.generate("DE", bank_code=bankleitzahl, account_code=kontonummer)
    return str(iban_obj)  # ohne Leerzeichen, z.B. DE56760614820004594967


def main():
    parser = argparse.ArgumentParser(
        description="Konvertiert eine CSV mit Kontodaten (BLZ im 6. Feld) in eine CSV mit IBAN."
    )
    parser.add_argument(
        "eingabe_datei", type=str,
        help="Pfad zur Eingabedatei (CSV mit Semikolon-Separator)"
    )
    parser.add_argument(
        "ausgabe_datei", type=str,
        help="Pfad zur Ausgabedatei (CSV mit zusaetzlicher IBAN-Spalte)"
    )
    args = parser.parse_args()

    # Lese die Eingabedatei
    with open(args.eingabe_datei, mode="r", encoding="iso-8859-1", newline="") as infile:
        reader = csv.reader(infile, delimiter=";", quotechar='"')
        rows = list(reader)

    output_rows = []
    for row in rows:
        if len(row) < 7:
            print(f"Warnung: Zeile hat weniger als 7 Felder, wird uebersprungen: {row}", file=sys.stderr)
            continue

        bankleitzahl = row[5]  # 6. Feld (Index 5)
        kontonummer = row[6]   # 7. Feld (Index 6)

        try:
            iban = generate_iban(kontonummer.strip(), bankleitzahl.strip())
        except Exception as e:
            print(f"Fehler bei BLZ {bankleitzahl}, Konto {kontonummer}: {e}", file=sys.stderr)
            iban = ""

        # Erstelle die neue Zeile: Original-Felder + IBAN am Ende
        # Behalte das Format bei, fuege IBAN als letzte Spalte hinzu
        new_row = list(row)
        # Stelle sicher, dass die Zeile genau 12 Felder hat (oder fuege Leerfelder hinzu)
        while len(new_row) < 12:
            new_row.append("")
        # Setze IBAN in das 9. Feld (Index 8) wie im Beispiel ("DE56760614820004594967")
        # Falls das Feld bereits existiert, ueberschreibe es
        if len(new_row) > 8:
            new_row[8] = iban
        else:
            new_row.append(iban)
        output_rows.append(new_row)

    # Schreibe die Ausgabedatei
    with open(args.ausgabe_datei, mode="w", encoding="iso-8859-1", newline="") as outfile:
        writer = csv.writer(outfile, delimiter=";", quotechar='"', quoting=csv.QUOTE_ALL)
        writer.writerows(output_rows)

    print(f"Erfolgreich verarbeitet: {len(output_rows)} Zeilen.")
    print(f"Ergebnis gespeichert in: {args.ausgabe_datei}")


if __name__ == "__main__":
    try:
        main()
    except Exception as e:
        print(f"\\nFEHLER: {e}", file=sys.stderr)
        print("\\n details:", file=sys.stderr)
        import traceback
        traceback.print_exc()
    finally:
        # Fenster offen halten, damit der Benutzer den Fehler oder die Bestaetigung lesen kann
        input("\\n--- Fertig (Enter zum Schließen) ---")
