import os
from Utils import __version__
from jinja2 import Template
import yaml
import json

from worlds.AutoWorld import AutoWorldRegister

target_folder = os.path.join("WebHostLib", "static", "generated")


def create():
    for game_name, world in AutoWorldRegister.world_types.items():
        res = Template(open(os.path.join("WebHostLib", "templates", "options.yaml")).read()).render(
            options=world.options, __version__=__version__, game=game_name, yaml_dump=yaml.dump
        )

        with open(os.path.join(target_folder, game_name + ".yaml"), "w") as f:
            f.write(res)

        # Generate JSON files for player-settings pages
        player_settings = {
            "baseOptions": {
                "description": "Generated by https://archipelago.gg/",
                "name": "Player",
            },
        }

        game_options = {}
        for option_name, option in world.options.items():
            if option.options:
                this_option = {
                    "type": "select",
                    "friendlyName": option.friendly_name if hasattr(option, "friendly_name") else option_name,
                    "description": option.__doc__ if option.__doc__ else "Please document me!",
                    "defaultValue": None,
                    "options": []
                }

                for sub_option_name, sub_option_id in option.options.items():
                    this_option["options"].append({
                        "name": sub_option_name,
                        "value": sub_option_name,
                    })

                    if sub_option_id == option.default:
                        this_option["defaultValue"] = sub_option_name

                game_options[option_name] = this_option

            elif hasattr(option, "range_start") and hasattr(option, "range_end"):
                game_options[option_name] = {
                    "type": "range",
                    "friendlyName": option.friendly_name if hasattr(option, "friendly_name") else option_name,
                    "description": option.__doc__ if option.__doc__ else "Please document me!",
                    "defaultValue": option.default if hasattr(option, "default") else option.range_start,
                    "min": option.range_start,
                    "max": option.range_end,
                }

        player_settings["gameOptions"] = game_options

        with open(os.path.join(target_folder, game_name + ".json"), "w") as f:
            f.write(json.dumps(player_settings, indent=2, separators=(',', ': ')))
