# -*- coding: utf-8 -*-
"""Geokodiranje destinacija (Nominatim/OSM) -> places.json.
Rezultati izvan očekivanog okvira područja se odbacuju; za nejasne lokalitete
postoje ručne koordinate (izvor 'manual') koje OBAVEZNO vizualno potvrditi u previewu.
places.json se smije ručno korigirati — build_rute.py čita njega, ne ovaj script.
"""
import json, time, urllib.request, urllib.parse, os

UA = {"User-Agent": "BikeCross-digitizer/1.0 (info@weblink.hr)"}
BBOX = {"lat": (45.95, 46.45), "lon": (16.70, 17.45)}  # Prekodravlje + HU pogranično

# key -> (upit, država, napomena) — redoslijed upita: prvi koji pogodi unutar BBOX
PLACES = {
    "jeskovo":      (["Ješkovo, Gola", "jezero Ješkovo"], "hr", "jezero kod Gole — polazište većine ruta"),
    "gola":         (["Gola, Koprivničko-križevačka"], "hr", ""),
    "otocka":       (["Otočka, Gola", "Otočka, Croatia"], "hr", ""),
    "zdala":        (["Ždala"], "hr", ""),
    "cambina":      (["Čambina"], "hr", "jezero/rukavac uz granicu kod Ždale"),
    "repas":        (["Repaš"], "hr", ""),
    "gotalovo":     (["Gotalovo"], "hr", ""),
    "novacka":      (["Novačka"], "hr", ""),
    "soderica":     (["Šoderica", "jezero Šoderica"], "hr", "jezero kod Botova"),
    "molve":        (["Molve"], "hr", "južno od Drave"),
    "gornja-suma":  (["Gornja šuma, Repaš", "Gornja Šuma, Molve"], "hr", "lokalitet u repaškoj šumi — POTVRDITI"),
    "cingi-lingi":  (["Cingi-lingi čarda", "Cingi Lingi"], "hr", "izletište — POTVRDITI"),
    "berzence":     (["Berzence"], "hu", ""),
    "csurgo":       (["Csurgó"], "hu", ""),
    "gyekenyes":    (["Gyékényes"], "hu", ""),
    "zakany":       (["Zákány"], "hu", ""),
    "zakanyfalu":   (["Zákányfalu"], "hu", ""),
    "ortilos":      (["Őrtilos"], "hu", ""),
    "np-duna-drava": ([], "hu", "ušće Mure u Dravu kod Őrtilosa — TOČKU POTVRĐUJE GRAD"),
}

# ručne koordinate kad geokoder ne nađe / za prirodne lokalitete (lat, lon)
MANUAL = {
    "np-duna-drava": (46.2965, 16.8846),   # područje ušća Mure i Drave (Őrtilos/Legrad) — POTVRDITI
}

def geocode(q, cc):
    url = "https://nominatim.openstreetmap.org/search?" + urllib.parse.urlencode(
        {"q": q, "format": "json", "limit": 3, "countrycodes": cc})
    req = urllib.request.Request(url, headers=UA)
    with urllib.request.urlopen(req, timeout=15) as r:
        return json.loads(r.read().decode())

def in_bbox(lat, lon):
    return BBOX["lat"][0] <= lat <= BBOX["lat"][1] and BBOX["lon"][0] <= lon <= BBOX["lon"][1]

out = {}
for key, (queries, cc, note) in PLACES.items():
    hit = None
    for q in queries:
        try:
            for cand in geocode(q, cc):
                lat, lon = float(cand["lat"]), float(cand["lon"])
                if in_bbox(lat, lon):
                    hit = {"lat": round(lat, 6), "lon": round(lon, 6),
                           "izvor": "nominatim", "upit": q,
                           "osm": cand.get("display_name", "")[:90]}
                    break
        except Exception as e:
            print(f"  ! {key} '{q}': {e}")
        time.sleep(1.1)
        if hit:
            break
    if not hit and key in MANUAL:
        lat, lon = MANUAL[key]
        hit = {"lat": lat, "lon": lon, "izvor": "manual", "upit": "-", "osm": "ručno upisano"}
    if not hit:
        hit = {"lat": None, "lon": None, "izvor": "NIJE PRONAĐENO", "upit": "-", "osm": ""}
    if note:
        hit["napomena"] = note
    out[key] = hit
    print(f"{key:14s} {hit['izvor']:12s} {hit['lat']}, {hit['lon']}  {hit.get('osm','')[:70]}")

path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "places.json")
with open(path, "w", encoding="utf-8") as f:
    json.dump(out, f, ensure_ascii=False, indent=2)
print("\nOK ->", path)
