import json
import os
import sys
from geopy.geocoders import Nominatim
from geopy.extra.rate_limiter import RateLimiter

# Directorio donde reside este script (para resolver rutas relativas)
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))

# Inicializar la API de geocodificación
geolocator = Nominatim(user_agent="mi_aplicacion_cp_update")
# Usamos un RateLimiter para no saturar la API gratuita (1 petición por segundo)
geocode = RateLimiter(geolocator.geocode, min_delay_seconds=1)


def obtener_codigo_postal(direccion, poblacion, pais):
    """Consulta Nominatim para obtener el código postal de una dirección."""
    query = f"{direccion}, {poblacion}, {pais}"
    try:
        location = geocode(query, addressdetails=True)
        if location and 'address' in location.raw:
            return location.raw['address'].get('postcode')
    except Exception as e:
        print(f"  [ERROR] procesando '{query}': {e}")
    return None


def procesar_json():
    archivo_entrada = os.path.join(SCRIPT_DIR, 'destinos.json')
    archivo_salida = os.path.join(SCRIPT_DIR, 'destinos_actualizados.json')

    # Verificar que el archivo de entrada existe
    if not os.path.isfile(archivo_entrada):
        print(f"[ERROR] No se encontró el archivo: {archivo_entrada}")
        print("  Coloca el archivo 'destinos.json' en la misma carpeta que este script.")
        sys.exit(1)

    print("Cargando datos...")
    try:
        with open(archivo_entrada, 'r', encoding='utf-8') as f:
            datos = json.load(f)
    except json.JSONDecodeError as e:
        print(f"[ERROR] El archivo JSON no es válido: {e}")
        sys.exit(1)

    if not isinstance(datos, list):
        print("[ERROR] Se esperaba una lista de registros en el JSON.")
        sys.exit(1)

    total = len(datos)
    actualizados = 0
    no_encontrados = 0
    omitidos = 0

    for i, item in enumerate(datos, start=1):
        # Filtramos los que no tienen CP válido
        cp_actual = item.get('cp')
        if cp_actual is None or str(cp_actual).strip() in ('', '00000', '0'):
            direccion = (item.get('direccion') or '').strip()
            poblacion = (item.get('poblacion') or '').strip()
            pais = (item.get('pais') or 'ESPAÑA').strip()
            
            # Solo buscamos si hay dirección y población
            if poblacion and direccion:
                id_item = item.get('id', f'#{i}')
                print(f"[{i}/{total}] Buscando CP para ID {id_item}: {direccion} | {poblacion}...")
                cp_encontrado = obtener_codigo_postal(direccion, poblacion, pais)

                if cp_encontrado:
                    item['cp'] = str(cp_encontrado)
                    print(f"  -> CP Encontrado: {cp_encontrado}")
                    actualizados += 1
                else:
                    print("  -> CP No encontrado.")
                    no_encontrados += 1
            else:
                omitidos += 1
        # Si ya tiene CP válido, no hacemos nada

    print()
    print("=" * 45)
    print(f"  Total registros:    {total}")
    print(f"  CPs actualizados:   {actualizados}")
    print(f"  CPs no encontrados: {no_encontrados}")
    print(f"  Omitidos (sin dir): {omitidos}")
    print("=" * 45)

    print(f"\nGuardando datos en '{archivo_salida}'...")
    with open(archivo_salida, 'w', encoding='utf-8') as f:
        json.dump(datos, f, ensure_ascii=False, indent=4)
    print("¡Proceso terminado!")


if __name__ == "__main__":
    procesar_json()