#!/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_HOME = os.environ["MFMODULE_HOME"]


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


def get_conf(plugin, hot_swap_plugin=False):
    plugin.reload()
    for app in plugin.configuration.apps:
        if hot_swap_plugin:
            app.hot_swap_prefix = HOT_SWAP_PREFIX
            app.hot_swap_home = MFSERV_PLUGINS_HOTSWAP_HOME
    return plugin


plugin_confs = []
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
    plugin_confs.append(p)

circus_ini_file = os.path.join(os.environ['MFMODULE_HOME'], 'config',
                               'circus.ini')

with open(circus_ini_file, "r") as f:
    extra_variables = {
        "PLUGINS": plugin_confs
    }
    content = envtpl.render_string(f.read(),
                                   extra_variables=extra_variables,
                                   keep_multi_blank_lines=False)

print(content)
