#!/usr/bin/env python3
import sys
import httpx
import asyncio
import time


api_token = None
languages = {}
app_translations = {}
docs_translations = {}


async def api(path):
    url = f"https://hosted.weblate.org{path}"

    async with httpx.AsyncClient() as client:
        r = await client.get(
            url, headers={"Authorization": f"Token {api_token}"}, timeout=30.0
        )

    if r.status_code == 200:
        print(f"GET {url}")
        return r.json()
    else:
        print(f"GET {url} | error {r.status_code}")
        return None


async def get_app_translation(lang_code):
    global app_translations
    obj = await api(f"/api/translations/onionshare/translations/{lang_code}/")
    if obj:
        app_translations[lang_code] = obj["translated_percent"]


async def get_docs_translation(component, lang_code):
    global docs_translations
    obj = await api(f"/api/translations/onionshare/{component}/{lang_code}/")
    if obj:
        if component not in docs_translations:
            docs_translations[component] = {}
        docs_translations[component][lang_code] = obj["translated_percent"]


async def app_percent_output(percent_min, percent_max=101):
    out = []
    for lang_code in languages:
        if (
            app_translations[lang_code] >= percent_min
            and app_translations[lang_code] < percent_max
        ):
            out.append(
                f"{languages[lang_code]} ({lang_code}), {app_translations[lang_code]}%"
            )

    out.sort()

    print(f"App translations >= {percent_min}%")
    print("=======================")
    print("\n".join(out))

    print("")


async def docs_percent_output(percent_min, exclude=[]):
    out = []
    for lang_code in languages:
        include_language = True
        percentages = []

        for component in docs_translations:
            if lang_code not in docs_translations[component]:
                include_language = False
                break

            percentages.append(docs_translations[component][lang_code])

            if docs_translations[component][lang_code] < percent_min:
                include_language = False
                break

        if include_language:
            percentages = [f"{p}%" for p in percentages]
            percentages = ", ".join(percentages)
            out.append(f"{languages[lang_code]} ({lang_code}), {percentages}")

    excluded = []
    for s in out:
        if s not in exclude:
            excluded.append(s)

    excluded.sort()

    print(f"Docs translations >= {percent_min}%")
    print("========================")
    print("\n".join(excluded))

    print("")
    return excluded


async def main():
    global api_token, languages, app_translations, docs_translations

    if len(sys.argv) != 2:
        print(f"Usage: {sys.argv[0]} API_KEY")
        print(
            "You can find your personal API key at: https://hosted.weblate.org/accounts/profile/#api"
        )
        return

    api_token = sys.argv[1]

    # Get the list of languages in the OnionShare project
    res = await api("/api/projects/onionshare/languages/")
    for obj in res:
        languages[obj["code"]] = obj["language"]

    # Get the app translations for each language
    await asyncio.gather(*[get_app_translation(lang_code) for lang_code in languages])

    # Get the documentation translations for each component for each language
    for component in [
        "doc-advanced",
        "doc-develop",
        "doc-features",
        "doc-help",
        "doc-index",
        "doc-install",
        "doc-security",
        "doc-sphinx",
        "doc-tor",
    ]:
        docs_futures = []
        for lang_code in languages:
            docs_futures.append(get_docs_translation(component, lang_code))

        await asyncio.gather(*docs_futures)

    print("")

    await app_percent_output(100)
    await app_percent_output(90, 100)
    await app_percent_output(80, 90)

    out100 = await docs_percent_output(100)
    out90 = await docs_percent_output(90, out100)
    await docs_percent_output(80, out100 + out90)


if __name__ == "__main__":
    asyncio.run(main())