from serpapi import GoogleSearch
import datetime
import pandas as pd
import unicodedata
import os

api_key = "e62b6b8d126f5ffea30490592908fde7308ff5e4bf9c64738eb5cea9055a2fcc"
# Base de datos de aeropuertos:
ruta_csv = "C:/Users/julio/OneDrive/Documentos/Trabajo/IdeasFrscas/Vuelos/Datos/informacion_aeropuertos.csv"

def normalizar_texto(texto):
    if not isinstance(texto, str):
        return ""
    return ''.join(
        c for c in unicodedata.normalize('NFD', texto.lower())
        if unicodedata.category(c) != 'Mn'
    )

def obtener_codigos_iata_desde_csv(ciudad, ruta_csv):
    """
    Busca aeropuertos cuyo municipio o nombre contenga parcialmente la ciudad (ignorando acentos).
    Devuelve una lista de diccionarios con nombre e IATA code.
    """
    df = pd.read_csv(ruta_csv)
    ciudad_norm = normalizar_texto(ciudad)

    def coincide(row):
        municipio = normalizar_texto(row.get("municipality", ""))
        nombre = normalizar_texto(row.get("name", ""))
        return ciudad_norm in municipio or ciudad_norm in nombre

    resultados = df[df.apply(coincide, axis=1)]

    aeropuertos = []
    for _, row in resultados.iterrows():
        iata = row.get('iata_code')
        if pd.notna(iata) and isinstance(iata, str) and len(iata) == 3:
            aeropuertos.append({
                'nombre': row['name'],
                'codigo': iata
            })

    return aeropuertos

# CLASES DE VIAJE
clases_dict = {
    1: "economy",
    2: "premium_economy",
    3: "business",
    4: "first"
}
def vuelos_a_ciudad_batch(ciudad_destino, fecha_llegada, api_key, ruta_csv):
    # Lista de aeropuertos de salida más comunes en EE.UU. y México hacia Mazatlán
    aeropuertos_origen = ["MEX","NLU","TIJ","MTY","CJS","CUU","LAX","PHX","DFW","IAH",
                          "MSP","SFO","YYC","YEG","YLW","YUL","YQR","YYZ","YVR","YWG"]

    aeropuertos = obtener_codigos_iata_desde_csv(ciudad_destino, ruta_csv)
    if not aeropuertos:
        raise ValueError(f"No se encontraron aeropuertos con IATA en: {ciudad_destino}")

    print(f"\n Aeropuertos encontrados en {ciudad_destino}:")
    for i, a in enumerate(aeropuertos):
        print(f"{i+1}. {a['nombre']} ({a['codigo']})")

    seleccion = input("\nSelecciona aeropuerto(s) por número (ej. 1 o 1,3 o 'todos'): ").strip().lower()

    if seleccion in ["todos", ""]:
        codigos_seleccionados = [a["codigo"] for a in aeropuertos]
    else:
        try:
            indices = [int(i.strip()) - 1 for i in seleccion.split(",")]
            codigos_seleccionados = [aeropuertos[i]["codigo"] for i in indices if 0 <= i < len(aeropuertos)]
        except Exception as e:
            raise ValueError("Entrada inválida. Debes ingresar números separados por comas o 'todos'.") from e

    if not codigos_seleccionados:
        raise ValueError("No seleccionaste ningún aeropuerto válido.")

    vuelos_lista = []
    for arrival_id in codigos_seleccionados:
        for departure_id in aeropuertos_origen:
            for clase in range(1, 5):
                clase_str = clases_dict[clase]
                print(f"\n {departure_id} ➜ {arrival_id} | Clase: {clase_str} | Fecha: {fecha_llegada}")

                params = {
                    "engine": "google_flights",
                    "hl": "es",
                    "gl": "mx",
                    "type": "2",
                    "departure_id": departure_id,
                    "arrival_id": arrival_id,
                    "outbound_date": fecha_llegada,
                    "travel_class": clase,
                    "adults": 1,
                    "currency": "USD",
                    "show_hidden": True,
                    "deep_search": True,
                    "sort_by": "2",
                    "api_key": api_key
                }

                try:
                    search = GoogleSearch(params)
                    results = search.get_dict()

                    if "other_flights" not in results:
                        print("No se encontraron más vuelos para esta combinación.")
                        continue

                    for vuelo in results["other_flights"]:
                        segmentos = vuelo.get("flights", [])
                        for seg in segmentos:
                            vuelos_lista.append({
                                "Aerolínea": seg.get("airline", "No disponible"),
                                "Número de vuelo": seg.get("flight_number", "No disponible"),
                                "Clase": clase_str,
                                "Duración": seg.get("duration", "No disponible"),
                                "Salida": seg.get("departure_airport", {}).get("time", "No disponible"),
                                "Llegada": seg.get("arrival_airport", {}).get("time", "No disponible"),
                                "Origen": seg.get("departure_airport", {}).get("name", "No disponible"),
                                "Destino": seg.get("arrival_airport", {}).get("name", "No disponible"),
                                "Código llegada": arrival_id,
                                "Código salida": departure_id,
                                "Precio estimado": vuelo.get("price", "No disponible"),
                                "Duración total": vuelo.get("total_duration", "No disponible"),
                                "Fecha consulta": datetime.datetime.today().strftime("%Y-%m-%d")
                            })

                except Exception as e:
                    print(f"⚠️ Error al consultar vuelos: {e}")

    df_vuelos = pd.DataFrame(vuelos_lista)

    if not df_vuelos.empty:
        nombre_archivo = f"datos/Vuelos a {ciudad_destino} todas clases {fecha_llegada}.csv"
        df_vuelos.to_csv(nombre_archivo, index=False, encoding='utf-8-sig')
        print(f"\n✅ Archivo guardado: {nombre_archivo}")
    else:
        print("\n❌ No se encontraron vuelos en ninguna clase para esta ciudad y fecha.")
    return df_vuelos
