#!/usr/bin/python3

import argparse
import json
from pathlib import Path

import toml


def get_default_value(
    app_name: str, name: str, question: dict, raise_if_no_default: bool = True
) -> str:
    base_default_value_per_arg_type = {
        ("domain", "domain"): "domain.tld",
        ("path", "path"): "/" + app_name,
        ("user", "admin"): "package_checker",
        ("group", "init_main_permission"): "visitors",
        ("group", "init_admin_permission"): "admins",
        ("password", "password"): "MySuperComplexPassword",
    }

    type_and_name = (question["type"], name)

    if value := base_default_value_per_arg_type.get(type_and_name):
        return value

    if value := question.get("default"):
        if isinstance(value, bool):
            # Convert bool to "0", "1"
            value = str(int(value))
        return value

    if question["type"] == "boolean":
        return "1"

    if question["type"] == "password":
        return "SomeSuperStrongPassword1234"

    if choices := question.get("choices"):
        return list(choices)[0]

    if raise_if_no_default:
        raise RuntimeError("No default value could be computed for arg " + name)
    return ""


def get_default_values_for_questions(
    manifest: dict, raise_if_no_default=True
) -> dict[str, str]:
    app_name = manifest["id"]
    questions = manifest["install"]

    args = {
        name: get_default_value(app_name, name, question, raise_if_no_default)
        for name, question in questions.items()
    }
    return args


def main() -> None:
    parser = argparse.ArgumentParser()
    parser.add_argument("manifest_path", type=Path, help="Path to the app directory")
    args = parser.parse_args()

    if args.manifest_path.name.endswith(".json"):
        manifest = json.load(args.manifest_path.open())
    else:
        manifest = toml.load(args.manifest_path.open())

    query_string = "&".join(
        [
            f"{name}={value}"
            for name, value in get_default_values_for_questions(manifest).items()
        ]
    )
    print(query_string)


if __name__ == "__main__":
    main()