# -*- coding: utf-8 -*-
"""
Created on Sat Jul  6 15:18:52 2024

@author: Stéphane Pasquet
"""

# -*- coding: utf-8 -*-
"""
Created on Sat Jul  6 15:18:52 2024

@author: Stéphane Pasquet
"""

# -*- coding: utf-8 -*-
"""
Created on Sat Jul  6 15:18:52 2024

@author: Stéphane Pasquet
"""

import requests
import folium
import numpy as np
from shapely.geometry import Polygon
from shapely.ops import unary_union
from geovoronoi import voronoi_regions_from_coords

def get_post_offices_overpass(city_name):
    query = f"""
    [out:json];
    area["name"="{city_name}"]->.searchArea;
    node["amenity"="post_office"](area.searchArea);
    out body;
    """
    url = "http://overpass-api.de/api/interpreter"
    response = requests.post(url, data={'data': query})
    data = response.json()
    post_offices = [(element['tags'].get('name', 'Post Office'), element['lat'], element['lon'])
                    for element in data['elements']]
    return post_offices

def create_map(city_name="Bordeaux"):
    post_offices = get_post_offices_overpass(city_name)

    # Créer une carte centrée sur Bordeaux
    map_bordeaux = folium.Map(location=[44.8378, -0.5792], zoom_start=13)

    # Ajouter les bureaux de poste à la carte
    for name, lat, lng in post_offices:
        folium.Marker(location=[lat, lng], popup=name).add_to(map_bordeaux)
        
    # Convertir les coordonnées des bureaux de poste en objets Point
    coords = np.array([(lng, lat) for name, lat, lng in post_offices])

    # Définir une zone de délimitation (par exemple, les limites de Bordeaux)
    # Utiliser un polygone explicite pour Bordeaux
    boundary_coords = [(-0.8, 45.1), (0.02, 45.1), (0.02, 44.6), (-0.8, 44.6), (-0.8, 45.1)]
    boundary_polygon = Polygon(boundary_coords)

    # Imprimer les coordonnées et le polygone de délimitation pour le débogage
    #print("Coords:", coords)
    #print("Boundary Polygon:", boundary_polygon)

    # Calculer les régions de Voronoi à partir des coordonnées
    try:
        region_polys, region_pts = voronoi_regions_from_coords(coords, boundary_polygon)
    except RuntimeError as e:
        print(f"Erreur lors de la génération des régions de Voronoi: {e}")
        return

    # Ajouter les régions de Voronoi à la carte folium
    for region in region_polys.values():
        folium.Polygon(locations=[(lat, lng) for lng, lat in region.exterior.coords]).add_to(map_bordeaux)

    # Sauvegarder la carte dans un fichier HTML
    map_bordeaux.save('map_bordeaux.html')
    
    return None

if __name__ == '__main__':
    create_map()
