#!/usr/bin/env python3
"""
Excel zu SQL Konverter für Nodes (Neues Format)
Konvertiert nodes.xlsx in SQL INSERT Statements
"""

import pandas as pd
import sys
from pathlib import Path

def parse_boolean_value(value):
    """
    Konvertiert verschiedene Boolean-Darstellungen zu Python boolean
    """
    if pd.isna(value):
        return False
    
    str_value = str(value).lower().strip()
    return str_value in ['true', 'yes', '1', 'ja', 'wahr']

def escape_sql_string(value):
    """
    Escaped SQL-Strings für sichere Einfügung
    """
    if pd.isna(value):
        return 'NULL'
    
    # Konvertiere zu String und escape single quotes
    str_value = str(value).replace("'", "''")
    return f"'{str_value}'"

def convert_nodes_to_sql(nodes_file, output_file):
    """
    Hauptfunktion: Konvertiert nodes.xlsx zu SQL INSERT Statements
    """
    
    try:
        # Lade nodes.xlsx
        nodes_df = pd.read_excel(nodes_file, sheet_name='Nodes')
        print(f"Erfolgreich {len(nodes_df)} Nodes geladen")
        
        # Zeige gefundene Spalten zur Überprüfung
        print(f"Gefundene Spalten: {nodes_df.columns.tolist()}")
        
    except Exception as e:
        print(f"Fehler beim Laden der nodes.xlsx: {e}")
        sys.exit(1)
    
    # Öffne Output-Datei
    try:
        with open(output_file, 'w', encoding='utf-8') as f:
            f.write("-- Generated SQL INSERT statements for nodes\n")
            f.write("-- Generated from nodes.xlsx (new format)\n\n")
            
            # Iteriere über alle Zeilen
            for index, row in nodes_df.iterrows():
                node_id = index + 1  # 1-basiert
                
                # Extrahiere Daten aus dem neuen Format
                external_mapping_id = str(row['Mapping ID']).strip() if pd.notna(row['Mapping ID']) else None
                name = str(row['Name']).strip() if pd.notna(row['Name']) else None
                address = str(row['Address']).strip() if pd.notna(row['Address']) else None
                
                # ISO-Code direkt aus der Spalte
                iso_code = str(row['Country (ISO 3166-1)']).strip() if pd.notna(row['Country (ISO 3166-1)']) else None
                
                # Latitude und Longitude (bereits getrennt)
                geo_lat = None
                geo_lng = None
                if pd.notna(row['Latitude']) and pd.notna(row['Longitude']):
                    try:
                        geo_lat = round(float(row['Latitude']), 4)
                        geo_lng = round(float(row['Longitude']), 4)
                    except ValueError:
                        print(f"Warnung: Ungültige Geo-Koordinaten in Zeile {node_id}")
                
                # Node-Typen aus separaten Spalten
                is_source = parse_boolean_value(row['Source'])
                is_intermediate = parse_boolean_value(row['Intermediate'])
                is_destination = parse_boolean_value(row['Destination'])
                
                # Predecessor required (neue Spaltenbezeichnung)
                predecessor_required = parse_boolean_value(row['Predecessors mandatory'])
                
                # Validierung: Mindestens ein Node-Typ sollte gesetzt sein
                if not (is_source or is_intermediate or is_destination):
                    print(f"Warnung: Zeile {node_id} ({name}) hat keinen Node-Typ gesetzt")
                
                # Debug-Ausgabe für Überprüfung
                print(f"Node {node_id}: {name}")
                print(f"  - Source: {is_source}, Intermediate: {is_intermediate}, Destination: {is_destination}")
                print(f"  - ISO Code: {iso_code}, Predecessor required: {predecessor_required}")
                
                # Schreibe SQL INSERT Statement
                f.write(f"-- Node {node_id}: {name or 'Unknown'}\n")
                f.write("INSERT INTO node (\n")
                f.write("    id,\n")
                f.write("    country_id,\n")
                f.write("    name,\n")
                f.write("    address,\n")
                f.write("    external_mapping_id,\n")
                f.write("    predecessor_required,\n")
                f.write("    is_destination,\n")
                f.write("    is_source,\n")
                f.write("    is_intermediate,\n")
                f.write("    geo_lat,\n")
                f.write("    geo_lng\n")
                f.write(") VALUES (\n")
                f.write(f"             {node_id},\n")
                f.write(f"             (SELECT id FROM country WHERE iso_code = '{iso_code}'),\n")
                f.write(f"             {escape_sql_string(name)},\n")
                f.write(f"             {escape_sql_string(address)},\n")
                f.write(f"             {escape_sql_string(external_mapping_id)},\n")
                f.write(f"             {'true' if predecessor_required else 'false'},\n")
                f.write(f"             {'true' if is_destination else 'false'},\n")
                f.write(f"             {'true' if is_source else 'false'},\n")
                f.write(f"             {'true' if is_intermediate else 'false'},\n")
                f.write(f"             {geo_lat if geo_lat is not None else 'NULL'},\n")
                f.write(f"             {geo_lng if geo_lng is not None else 'NULL'}\n")
                f.write("         );\n\n")
        
        print(f"\nSQL-Datei erfolgreich erstellt: {output_file}")
        print(f"Insgesamt {len(nodes_df)} INSERT Statements generiert")
        
    except Exception as e:
        print(f"Fehler beim Schreiben der SQL-Datei: {e}")
        sys.exit(1)

def main():
    """
    Hauptprogramm
    """
    if len(sys.argv) < 2:
        print("Verwendung: python 03-excel_export__node_sql_extract.py <excel_datei> [ausgabe_datei]")
        print("")
        print("Beispiele:")
        print("  python 03-excel_export__node_sql_extract.py nodes.xlsx output.sql")
        print("  python 03-excel_export__node_sql_extract.py nodes.xlsx")
        return
    
    # Kommandozeilenargumente verarbeiten
    if len(sys.argv) > 1:
        nodes_file = sys.argv[1]
    if len(sys.argv) > 2:
        output_file = sys.argv[2]
    
    # Prüfe, ob Datei existiert
    if not Path(nodes_file).exists():
        print(f"Fehler: {nodes_file} nicht gefunden!")
        print(f"Verwendung: {sys.argv[0]} [input.xlsx] [output.sql]")
        sys.exit(1)
    
    print(f"Konvertiere {nodes_file} zu SQL...")
    print(f"Output-Datei: {output_file}")
    print("-" * 50)
    
    # Führe Konvertierung aus
    convert_nodes_to_sql(nodes_file, output_file)
    
    print("-" * 50)
    print("Konvertierung erfolgreich abgeschlossen!")

if __name__ == "__main__":
    main()