# scripts/Eliminar_duplicados_geográficos.py
import pandas as pd
from geopy.distance import geodesic
import folium

def eliminar_duplicados_geograficos(df, nombre_col='nom_estab', lat_col='latitud', lon_col='longitud', umbral_metros=5):
    df_limpio = pd.DataFrame()
    agrupado = df.groupby(nombre_col)

    for nombre, grupo in agrupado:
        grupo = grupo.copy().reset_index(drop=True)
        marcados = set()
        grupo_final = []

        for i, row in grupo.iterrows():
            if i in marcados:
                continue
            punto_i = (row[lat_col], row[lon_col])
            grupo_similar = [i]
            for j in range(i+1, len(grupo)):
                if j in marcados:
                    continue
                punto_j = (grupo.loc[j, lat_col], grupo.loc[j, lon_col])
                distancia = geodesic(punto_i, punto_j).meters
                if distancia < umbral_metros:
                    marcados.add(j)
            grupo_final.append(row)

        df_limpio = pd.concat([df_limpio, pd.DataFrame(grupo_final)], ignore_index=True)

    return df_limpio

def mapa_por_categoria(df, categoria, centro, radio=500):
    # Filtrar por categoría
    df_filtrado = df[df["nombre_act"] == categoria].copy()
    
    # Ordenar por distancia
    df_filtrado.sort_values(by="distancia_m", inplace=True)

    # Crear mapa
    mapa = folium.Map(location=centro, zoom_start=17)

    # Añadir punto central (Cabanna)
    folium.Marker(
        location=centro,
        tooltip="Cabanna Tijuana",
        icon=folium.Icon(color="red", icon="cutlery", prefix="fa")
    ).add_to(mapa)

    # Añadir círculo de 500m
    folium.Circle(
        location=centro,
        radius=radio,
        color='blue',
        fill=True,
        fill_opacity=0.1
    ).add_to(mapa)

    # Añadir comercios filtrados
    for _, row in df_filtrado.iterrows():
        folium.Marker(
            location=[row["latitud"], row["longitud"]],
            tooltip=f"{row['nom_estab']} ({round(row['distancia_m'],1)} m)",
            icon=folium.Icon(color="gray", icon="briefcase", prefix="fa")
        ).add_to(mapa)

    return mapa, df_filtrado.reset_index(drop=True)