# Copyright: Ankitects Pty Ltd and contributors
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html

# pylint: disable=unbalanced-tuple-unpacking

import json
import sys
from typing import Literal, TypedDict

sys.path.append("pylib/anki/_vendor")

import stringcase

strings_json, outfile = sys.argv[1:]
with open(strings_json, encoding="utf8") as f:
    modules = json.load(f)


class Variable(TypedDict):
    name: str
    kind: Literal["Any", "Int", "String", "Float"]


def legacy_enum() -> str:
    out = ["class LegacyTranslationEnum:"]
    for module in modules:
        for translation in module["translations"]:
            key = stringcase.constcase(translation["key"])
            value = f'({module["index"]}, {translation["index"]})'
            out.append(f"    {key} = {value}")

    return "\n".join(out) + "\n"


def methods() -> str:
    out = [
        "class GeneratedTranslations:",
        "    def _translate(self, module: int, translation: int, args: Dict) -> str:",
        "        raise Exception('not implemented')",
    ]
    for module in modules:
        for translation in module["translations"]:
            key = translation["key"].replace("-", "_")
            arg_types = get_arg_types(translation["variables"])
            args = get_args(translation["variables"])
            doc = translation["text"]
            out.append(
                f"""
    def {key}(self, {arg_types}) -> str:
        r''' {doc} '''
        return self._translate({module["index"]}, {translation["index"]}, {{{args}}})
"""
            )

    return "\n".join(out) + "\n"


def get_arg_types(args: list[Variable]) -> str:

    return ", ".join(
        [f"{stringcase.snakecase(arg['name'])}: {arg_kind(arg)}" for arg in args]
    )


def arg_kind(arg: Variable) -> str:
    if arg["kind"] == "Int":
        return "int"
    elif arg["kind"] == "Any":
        return "FluentVariable"
    elif arg["kind"] == "Float":
        return "float"
    else:
        return "str"


def get_args(args: list[Variable]) -> str:
    return ", ".join(
        [f'"{arg["name"]}": {stringcase.snakecase(arg["name"])}' for arg in args]
    )


out = ""

out += legacy_enum()
out += methods()


with open(outfile, "w", encoding="utf8") as f:
    f.write(
        '''# Copyright: Ankitects Pty Ltd and contributors
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
# pylint: skip-file

from __future__ import annotations

"""
This file is automatically generated from the *.ftl files.
"""

import enum
from typing import Dict, Union

FluentVariable = Union[str, int, float]

'''
        + out
    )
