# scripts/google_places_utils.py


import math
import time
import pandas as pd
import googlemaps
from dotenv import load_dotenv
import os
import sys
# Carga de variables de entorno
load_dotenv()
api_key = os.getenv("API_KEY_GOOGLE")

# Importar comercios y categorías desde otro script
sys.path.append('../scripts')
from tipos_comercios import comercios, categorias_establecimientos


def calcular_distancia_haversine(lat1, lon1, lat2, lon2):
    """Calcula la distancia en kilómetros entre dos coordenadas (lat/lon)."""
    R = 6371  # Radio terrestre en km
    phi1 = math.radians(lat1)
    phi2 = math.radians(lat2)
    delta_phi = math.radians(lat2 - lat1)
    delta_lambda = math.radians(lon2 - lon1)

    a = math.sin(delta_phi / 2) ** 2 + math.cos(phi1) * math.cos(phi2) * math.sin(delta_lambda / 2) ** 2
    c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))

    return R * c


def obtener_categoria(comercio):
    """Devuelve la categoría principal del comercio usando el diccionario."""
    for categoria, lista_comercios in categorias_establecimientos.items():
        if comercio in lista_comercios:
            return categoria
    return "Sin categoría"


def obtener_establecimientos_localidad(coordenadas, radius_km=2):
    """
    Busca establecimientos alrededor de unas coordenadas, usando todos los tipos de comercios definidos.
    Devuelve un DataFrame con la información y clasificación.

    Args:
        coordenadas (tuple): (lat, lon)
        radius_km (float): Radio en kilómetros

    Returns:
        pd.DataFrame
    """
    gmaps = googlemaps.Client(key=api_key)
    resultados_totales = []

    for comercio in comercios:
        try:
            resultados = gmaps.places(query=comercio, location=coordenadas, radius=radius_km * 1000)
        except Exception as e:
            print(f"Error con {comercio}: {e}")
            continue

        establecimientos_localidad = []

        while resultados:
            for idx, lugar in enumerate(resultados.get('results', [])):
                nombre = lugar.get('name')
                direccion = lugar.get('formatted_address')
                lat = lugar.get('geometry', {}).get('location', {}).get('lat')
                lng = lugar.get('geometry', {}).get('location', {}).get('lng')

                if not lat or not lng:
                    continue

                distancia = calcular_distancia_haversine(coordenadas[0], coordenadas[1], lat, lng)
                if distancia <= radius_km:
                    categoria = obtener_categoria(comercio)
                    liga = f"https://www.google.com/maps?q={lat},{lng}"

                    establecimientos_localidad.append([
                        idx + 1, nombre, comercio, categoria, direccion, lat, lng, liga
                    ])

            next_page_token = resultados.get('next_page_token')
            if next_page_token:
                time.sleep(2)
                resultados = gmaps.places(query=comercio, location=coordenadas, radius=radius_km * 1000, page_token=next_page_token)
            else:
                break

        resultados_totales.extend(establecimientos_localidad)

    return pd.DataFrame(resultados_totales, columns=[
        "ID", "Nombre de establecimiento", "Comercio", "Categoría", "Domicilio",
        "latitud", "longitud", "Liga de Google Maps"
    ])
