#!/usr/bin/env python3

import os
import sys
import envtpl
from mflog import get_logger
from mfplugin.manager import PluginsManager
from mfserv.plugins import HOT_SWAP_PREFIX

MFMODULE_RUNTIME_HOME = os.environ["MFMODULE_RUNTIME_HOME"]
MFSERV_PLUGINS_HOME = os.path.join(MFMODULE_RUNTIME_HOME,
                                   "var", "plugins")
MFSERV_PLUGINS_HOTSWAP_HOME = os.path.join(MFMODULE_RUNTIME_HOME,
                                           "tmp", "plugins.hotswap")
MFMODULE = os.environ['MFMODULE']


LOGGER = get_logger("__make_nginx_conf")
manager = PluginsManager(MFSERV_PLUGINS_HOME)
hs_manager = PluginsManager(MFSERV_PLUGINS_HOTSWAP_HOME)


def get_conf(plugin, hot_swap_plugin=False):
    plugin.reload()
    logger = LOGGER.bind(plugin_name=plugin.name)
    if plugin.configuration.disable_nginx_conf:
        logger.warning("disabled plugin => ignoring")
        return None
    apps_to_add = []
    for app in plugin.configuration.apps:
        logger = logger.bind(app=app.name)
        if hot_swap_plugin:
            app.hot_swap_prefix = HOT_SWAP_PREFIX
            app.hot_swap_home = MFSERV_PLUGINS_HOTSWAP_HOME
        if app.name == "main" or len(plugin.configuration.apps) == 1:
            new_app = app.duplicate()
            new_app.prefix = "/%s" % plugin.name
            new_app.alias = "yes"
            apps_to_add.append(new_app)
        for extra_route in app.prefix_based_routing_extra_routes.split(';'):
            if extra_route.strip() == "":
                continue
            new_app = app.duplicate()
            new_app.prefix = extra_route.strip()
            new_app.alias = "yes"
            apps_to_add.append(new_app)
    for app in apps_to_add:
        plugin.configuration.add_app(app)
    return plugin


plugin_confs = []
lua_package_paths = []
if len(sys.argv) == 2:
    p = manager.make_plugin(sys.argv[1])
    plugins = [p]
else:
    plugins = list(manager.plugins.values()) + \
        list(hs_manager.plugins.values())
for plugin in plugins:
    try:
        plugin.load_full()
    except Exception as e:
        LOGGER.warning("invalid plugin: %s (%s) => ignoring it ; details: %s" %
                       (plugin.name, plugin.home, e))
        continue
    hotswap = plugin in hs_manager.plugins.values()
    with plugin.plugin_env_context():
        p = get_conf(plugin, hot_swap_plugin=hotswap)
    if p is None:
        continue
    if p.configuration.lua_package_path != "":
        lua_package_paths = lua_package_paths + \
            [p.configuration.lua_package_path]
    plugin_confs.append(p)
lua_package_paths = [
    "%s/lib/?.lua" % os.environ['MFSERV_HOME'],
    MFSERV_PLUGINS_HOTSWAP_HOME + "/?.lua",
    MFSERV_PLUGINS_HOME + "/?.lua"
] + lua_package_paths

nginx_conf_file = os.path.join(os.environ['MFMODULE_HOME'], 'config',
                               'nginx.conf')

with open(nginx_conf_file, "r") as f:
    mfmodule_env = sorted(
        [x for x in os.environ.keys()
         if x.startswith(MFMODULE + "_") or x.startswith("MFMODULE_")]
    )
    extra_variables = {
        "PLUGINS": plugin_confs,
        "LUA_PACKAGE_PATH": ";".join(lua_package_paths) + ";;",
        "MFMODULE_ENVIRONMENT": mfmodule_env
    }
    content = envtpl.render_string(
        f.read(), extra_variables=extra_variables,
        keep_multi_blank_lines=False,
        extra_search_paths=[os.path.join(os.environ['MFMODULE_HOME'],
                                         'config')]
    )

print(content)
