#!/usr/bin/env python3

import argparse
import json
from pathlib import Path


ALLOWED_TAGS = {
    "amenity",
    "brand",
    "capacity",
    "energy_source",
    "name",
    "network",
    "operator",
    "renewable_energy",
    "socket:chademo",
    "socket:type2",
    "socket:type2_combo",
    "source:energy",
}


def main() -> int:
    parser = argparse.ArgumentParser()
    parser.add_argument("--input", type=Path, required=True)
    parser.add_argument("--output", type=Path, required=True)
    args = parser.parse_args()

    source = json.loads(args.input.read_text(encoding="utf-8"))
    minimized = {
        "version": source.get("version"),
        "generator": "Volnavi minimized OpenStreetMap snapshot",
        "osm3s": source.get("osm3s", {}),
        "volnaviUsage": {
            "accessCost": "free_of_charge",
            "licenseClass": "open_license",
            "licenseName": "Open Database License (ODbL) 1.0",
            "paidCommercialLicensePurchased": False,
        },
        "elements": [],
    }
    for element in source.get("elements", []):
        output = {
            "type": element["type"],
            "id": element["id"],
        }
        if "lat" in element and "lon" in element:
            output["lat"] = element["lat"]
            output["lon"] = element["lon"]
        elif "center" in element:
            output["center"] = {
                "lat": element["center"]["lat"],
                "lon": element["center"]["lon"],
            }
        tags = {
            key: value
            for key, value in (element.get("tags") or {}).items()
            if key in ALLOWED_TAGS
        }
        if tags:
            output["tags"] = tags
        minimized["elements"].append(output)

    args.output.parent.mkdir(parents=True, exist_ok=True)
    args.output.write_text(
        json.dumps(
            minimized,
            ensure_ascii=False,
            sort_keys=True,
            separators=(",", ":"),
        )
        + "\n",
        encoding="utf-8",
    )
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
