#!/usr/bin/env python3
"""Geocode company addresses from company_info.json using Nominatim (OpenStreetMap)."""

import json
import time
import urllib.request
import urllib.parse
import sys

INPUT_FILE = "forms/company_info.json"
OUTPUT_FILE = "forms/company_info_geocoded.json"
USER_AGENT = "InternshipCSE-Geocoder/1.0 (educational project)"


def geocode_nominatim(address: str) -> tuple[float, float] | None:
    """Geocode an address using Nominatim. Returns (lat, lng) or None."""
    params = urllib.parse.urlencode({
        "q": address,
        "format": "json",
        "limit": 1,
        "countrycodes": "vn",
    })
    url = f"https://nominatim.openstreetmap.org/search?{params}"

    req = urllib.request.Request(url, headers={"User-Agent": USER_AGENT})
    try:
        with urllib.request.urlopen(req, timeout=10) as resp:
            data = json.loads(resp.read().decode())
            if data:
                return float(data[0]["lat"]), float(data[0]["lon"])
    except Exception as e:
        print(f"  Error: {e}", file=sys.stderr)
    return None


def main():
    with open(INPUT_FILE, "r", encoding="utf-8") as f:
        companies = json.load(f)

    total = len(companies)
    results = []

    for i, company in enumerate(companies, 1):
        name = company.get("shortname", "?")
        address = company.get("location", "")
        print(f"[{i}/{total}] {name}: {address}")

        coords = geocode_nominatim(address)
        if coords:
            lat, lng = coords
            print(f"  -> ({lat:.6f}, {lng:.6f})")
        else:
            lat, lng = None, None
            print(f"  -> NOT FOUND")

        entry = {**company, "latitude": lat, "longitude": lng}
        results.append(entry)

        # Nominatim rate limit: 1 request/second
        if i < total:
            time.sleep(1.1)

    with open(OUTPUT_FILE, "w", encoding="utf-8") as f:
        json.dump(results, f, ensure_ascii=False, indent=2)

    found = sum(1 for r in results if r["latitude"] is not None)
    print(f"\nDone: {found}/{total} geocoded -> {OUTPUT_FILE}")


if __name__ == "__main__":
    main()
