#!/usr/bin/env python3
"""
iban.py - Generiert deutsche IBAN und BIC aus Kontonummer und Bankleitzahl.

Nutzung:
    venv/bin/python iban.py --konto 123456789 --blz 10020520
    venv/bin/python iban.py --konto 123456789 --blz 10020520 --json
    venv/bin/python iban.py  # startet interaktiven Eingabemodus
"""
import argparse
import json
import sys
from schwifty import IBAN, BIC
from schwifty.exceptions import InvalidBankCode


def generate_iban(kontonummer: str, bankleitzahl: str) -> dict:
    """Erzeugt IBAN und versucht BIC. Gibt ein Dictionary mit Ergebnissen zurueck."""
    try:
        bankleitzahl = str(int(bankleitzahl))  # fuehrende Nullen entfernen
    except ValueError:
        pass

    iban_obj = IBAN.generate("DE", bank_code=bankleitzahl, account_code=kontonummer)
    result = {
        "iban": iban_obj.formatted,
        "iban_raw": str(iban_obj),
        "bic": None,
        "bank_name": None,
        "bank_short_name": None,
        "bankleitzahl": bankleitzahl,
        "kontonummer": kontonummer,
        "laendercode": "DE",
        "valid": True,
        "error": None,
    }

    try:
        bic_obj = BIC.from_bank_code("DE", bankleitzahl)
        result["bic"] = str(bic_obj)
        if bic_obj.bank_names:
            result["bank_name"] = bic_obj.bank_names[0]
        if bic_obj.bank_short_names:
            result["bank_short_name"] = bic_obj.bank_short_names[0]
    except InvalidBankCode:
        result["error"] = f"BIC fuer Bankleitzahl {bankleitzahl} nicht gefunden."

    return result


def main():
    parser = argparse.ArgumentParser(
        description="Generiert deutsche IBAN aus Kontonummer und Bankleitzahl."
    )
    parser.add_argument(
 "--konto", "--kontonummer", dest="konto", type=str,
        help="Deutsche Kontonummer (mit oder ohne fuehrende Nullen)"
    )
    parser.add_argument(
 "--blz", "--bankleitzahl", dest="blz", type=str,
        help="Bankleitzahl (BLZ)"
    )
    parser.add_argument(
        "--json", dest="as_json", action="store_true",
        help="Ergebnis als JSON ausgeben"
    )
    args = parser.parse_args()

    # Interaktiver Modus, wenn keine Argumente uebergeben wurden
    if not args.konto or not args.blz:
        if args.konto or args.blz:
            print("Fehler: Bitte beide Werte (Kontonummer und Bankleitzahl) angeben.",
                  file=sys.stderr)
            sys.exit(1)
        print("=== IBAN Generator ===")
        kontonummer = input("Kontonummer: ").strip()
        bankleitzahl = input("Bankleitzahl (BLZ): ").strip()
        print("======================")
    else:
        kontonummer = args.konto
        bankleitzahl = args.blz

    result = generate_iban(kontonummer, bankleitzahl)

    if args.as_json:
        print(json.dumps(result, ensure_ascii=False, indent=2))
    else:
        print(f"IBAN:       {result['iban']}")
        print(f"BIC:        {result['bic'] or '(nicht gefunden)'}")
        print(f"Bank:       {result['bank_name'] or '(unbekannt)'}")
        if result['error']:
            print(f"Hinweis:    {result['error']}")

    # Verhindert, dass das Konsolenfenster unter Windows sofort geschlossen wird
    try:
        input("\n[Enter] zum Schließen...")
    except EOFError:
        pass


if __name__ == "__main__":
    main()
