#!/usr/bin/env python3
# Геокодирование всех кластеров + сводка
import json, time, urllib.request, urllib.parse

def reverse_geocode(lat, lon):
    url = ("https://nominatim.openstreetmap.org/reverse?" +
           urllib.parse.urlencode({"lat": lat, "lon": lon, "format": "jsonv2", "zoom": 14, "accept-language": "ru"}))
    req = urllib.request.Request(url, headers={"User-Agent": "DobrotniyDom-photo-sort/1.0"})
    try:
        with urllib.request.urlopen(req, timeout=30) as r:
            d = json.loads(r.read().decode())
        return d.get("display_name", "")
    except Exception as e:
        return f"ERR {e}"

# пересоздаём кластеры из кэша
import math
def haversine(lat1, lon1, lat2, lon2):
    R = 6371000
    p1, p2 = math.radians(lat1), math.radians(lat2)
    dp = math.radians(lat2 - lat1)
    dl = math.radians(lon2 - lon1)
    a = math.sin(dp/2)**2 + math.cos(p1)*math.cos(p2)*math.sin(dl/2)**2
    return R * 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))

cache = json.load(open("/root/site/video/gps_cache2.json", encoding="utf-8"))
points = []
for key, val in cache.items():
    gps = val.get("gps")
    if gps:
        points.append((key, gps[0], gps[1]))

clusters = []
for key, lat, lon in points:
    placed = False
    for c in clusters:
        if haversine(lat, lon, c["lat"], c["lon"]) <= 150:
            c["keys"].append(key)
            n = len(c["keys"])
            c["lat"] = (c["lat"] * (n-1) + lat) / n
            c["lon"] = (c["lon"] * (n-1) + lon) / n
            placed = True
            break
    if not placed:
        clusters.append({"keys": [key], "lat": lat, "lon": lon})

clusters.sort(key=lambda c: -len(c["keys"]))
print(f"Кластеров: {len(clusters)}\n")
out = []
for i, c in enumerate(clusters, 1):
    addr = reverse_geocode(c["lat"], c["lon"]) if abs(c["lat"]) > 1 else "координаты 0,0 (дрон без GPS)"
    out.append({"cluster": i, "count": len(c["keys"]), "lat": round(c["lat"], 5), "lon": round(c["lon"], 5), "addr": addr, "keys": c["keys"]})
    print(f"Кластер {i}: {len(c['keys'])} фото | {addr}")
    time.sleep(1.2)

json.dump(out, open("/root/site/video/clusters_geocoded.json", "w", encoding="utf-8"), ensure_ascii=False, indent=1)
print("\nСохранено в clusters_geocoded.json")
