#!/usr/bin/env python3
# icao -- look up airport ICAO or IATA codes via Wikidata
import argparse
from pprint import pprint
import requests

parser = argparse.ArgumentParser()
parser.add_argument("query", nargs="+", help="City name or ICAO code")
args = parser.parse_args()

ua = requests.Session()
ua.headers["User-Agent"] = "Mozilla/4.0 ~/bin/icao (gh://grawity)"
header = []
results = []
err = False

for query in args.query:
    # https://www.wikidata.org/wiki/Wikidata:SPARQL_query_service
    # https://query.wikidata.org/sparql?query={SPARQL}
    # https://stackoverflow.com/questions/30501124/or-in-a-sparql-query
    # https://pypi.org/project/sparql-client/
    sparql = """
    SELECT DISTINCT ?item ?itemLabel ?iata ?icao
    WHERE
    {
        ?item wdt:P31 wd:Q1248784;
              wdt:P238 ?iata;
              wdt:P239 ?icao.

        { ?item ?label "%(query)s"@en. }
        UNION
        { ?item wdt:P238|wdt:P239 "%(query)s". }

        SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
    }
    """ % {"query": query}
    resp = ua.get("https://query.wikidata.org/sparql",
                  params={"query": sparql},
                  headers={"Accept": "application/sparql-results+json"})
    resp.raise_for_status()
    data = resp.json()
    for result in data["results"]["bindings"]:
        # Flatten for display
        result = {k: v["value"] for k, v in result.items()}
        pprint(result)
