# pyright: reportUnboundVariable=false

import glob
import importlib
import os
import site
import sys
import typing

from .basic_game import BasicGame
from .basic_game_ini import BasicIniGame

site.addsitedir(os.path.join(os.path.dirname(__file__), "lib"))


BasicGame.setup()


def createPlugins():
    # List of game class from python:
    game_plugins: typing.List[BasicGame] = []

    # We are going to list all game plugins:
    curpath = os.path.abspath(os.path.dirname(__file__))

    # List all the .ini files:
    for file in glob.glob(os.path.join(curpath, "games", "*.ini")):
        game_plugins.append(BasicIniGame(file))

    # List all the python plugins:
    for file in glob.glob(os.path.join(curpath, "games", "*.py")):
        module_p = os.path.relpath(file, os.path.join(curpath, "games"))
        if module_p == "__init__.py":
            continue

        # Import the module:
        try:
            module = importlib.import_module(".games." + module_p[:-3], __package__)
        except ImportError as e:
            print("Failed to import module {}: {}".format(module_p, e), file=sys.stderr)
        except Exception as e:
            print("Failed to import module {}: {}".format(module_p, e), file=sys.stderr)

        # Lookup game plugins:
        for name in dir(module):
            if hasattr(module, name):
                obj = getattr(module, name)
                if (
                    isinstance(obj, type)
                    and issubclass(obj, BasicGame)
                    and obj is not BasicGame
                ):
                    try:
                        game_plugins.append(obj())
                    except Exception as e:
                        print(
                            "Failed to instantiate {}: {}".format(name, e),
                            file=sys.stderr,
                        )

    return game_plugins
