#!/usr/bin/env python3
"""
Excel zu SQL Konverter für Container Rates
Konvertiert Excel-Datei mit Container-Raten in SQL INSERT-Statements
"""

import pandas as pd
import sys
from pathlib import Path

def load_excel_data(file_path):
    """
    Lädt die Excel-Datei und gibt die Daten als DataFrame zurück
    """
    try:
        df = pd.read_excel(file_path)
        print(f"✓ Excel-Datei geladen: {len(df)} Zeilen")
        return df
    except Exception as e:
        print(f"✗ Fehler beim Laden der Excel-Datei: {e}")
        sys.exit(1)

def group_and_process_data(df):
    """
    Gruppiert die Daten nach From, To, Type und extrahiert die verschiedenen Raten
    """
    # Nach From, To, Type gruppieren
    grouped = df.groupby(['From', 'To', 'Type'])
    
    sql_statements = []
    
    for (from_port, to_port, transport_type), group in grouped:
        # Initialisiere Werte
        rate_teu = 'NULL'
        rate_feu = 'NULL' 
        rate_hc = 'NULL'
        lead_time = 'NULL'
        
        # Lead time aus der ersten Zeile nehmen (sollte in allen Zeilen gleich sein)
        if not group.empty:
            lead_time = group.iloc[0]['lead_time']
        
        # Raten nach container_type extrahieren
        for _, row in group.iterrows():
            container_type = row['container_type']
            rate = row['rate']
            
            if container_type == "20'":
                rate_teu = f"{float(rate):.2f}"
            elif container_type == "40'":
                rate_feu = f"{float(rate):.2f}"
            elif container_type == "40'HC":
                rate_hc = f"{float(rate):.2f}"
        
        # SQL INSERT Statement erstellen
        sql_statement = f"""INSERT INTO container_rate (
    from_node_id,
    to_node_id,
    container_rate_type,
    rate_teu,
    rate_feu,
    rate_hc,
    lead_time,
    validity_period_id
) VALUES (
             (SELECT id FROM node WHERE external_mapping_id = '{from_port}'),
             (SELECT id FROM node WHERE external_mapping_id = '{to_port}'),
             '{transport_type}',
             {rate_teu},
             {rate_feu},
             {rate_hc},
             {lead_time},
             @validity_period_id
         );"""
        
        sql_statements.append(sql_statement)
    
    return sql_statements

def write_sql_file(sql_statements, output_file):
    """
    Schreibt die SQL-Statements in eine Datei
    """
    try:
        with open(output_file, 'w', encoding='utf-8') as f:
            # Header schreiben
            f.write("-- Container Rate INSERT Statements\n")
            f.write("-- Generiert aus Excel-Datei\n\n")
            
            # SQL Statements schreiben
            for statement in sql_statements:
                f.write(statement)
                f.write("\n\n")
        
        print(f"✓ SQL-Datei erstellt: {output_file}")
        print(f"✓ {len(sql_statements)} INSERT-Statements generiert")
        
    except Exception as e:
        print(f"✗ Fehler beim Schreiben der SQL-Datei: {e}")
        sys.exit(1)

def main():
    """
    Hauptfunktion
    """
    # Dateipfade
    excel_file = "container_rates.xlsx"
    sql_file = "08-data-containerrate.sql"
    
    # Prüfen ob Excel-Datei existiert
    if not Path(excel_file).exists():
        print(f"✗ Excel-Datei nicht gefunden: {excel_file}")
        print("Bitte stellen Sie sicher, dass die Datei im aktuellen Verzeichnis liegt.")
        sys.exit(1)
    
    print("Container Rates Excel zu SQL Konverter")
    print("=" * 40)
    
    # 1. Excel-Datei laden
    df = load_excel_data(excel_file)
    
    # 2. Datenstruktur anzeigen
    print(f"Spalten: {list(df.columns)}")
    print(f"Eindeutige From-Werte: {df['From'].nunique()}")
    print(f"Eindeutige To-Werte: {df['To'].nunique()}")
    print(f"Eindeutige Type-Werte: {df['Type'].unique()}")
    print(f"Container Types: {df['container_type'].unique()}")
    
    # 3. Daten gruppieren und SQL-Statements erstellen
    print("\n⚙️  Verarbeite Daten...")
    sql_statements = group_and_process_data(df)
    
    # 4. SQL-Datei schreiben
    write_sql_file(sql_statements, sql_file)
    
    print(f"\n✅ Fertig! SQL-Datei wurde erstellt: {sql_file}")

if __name__ == "__main__":
    main()
