#!/usr/bin/env python3

import os
import envtpl
from mflog import get_logger
from mfplugin.manager import PluginsManager

MFMODULE_HOME = os.environ["MFMODULE_HOME"]
LOGGER = get_logger("_make_circus_conf")


def get_current_step_queue(plugin_name, step_name):
    return "step.%s.%s" % (plugin_name, step_name)


def get_conf(plugin):
    plugin.reload()
    steps_to_add = []
    for step in plugin.configuration.steps:
        if step.retry_total > 0:
            reinject_step = step.duplicate(step.name + "_reinject")
            reinject_step.set_watched_directories("{MFDATA_CURRENT_STEP_DIR}")
            reinject_step.set_numprocesses(1)
            reinject_step.set_max_age(0)
            failure_move = ""
            if step.failure_policy == "move":
                failure_move = "--failure-policy-move-dest-dir=%s" % \
                    step.failure_policy_move_dest_dir
            reinject_step.set_cmd_and_args(
                f"reinject_step "
                f"--dest-dir={plugin.name}/{step.name} "
                f"--retry-min-wait={step.retry_min_wait} "
                f"--retry-max-wait={step.retry_max_wait} "
                f"--retry-total={step.retry_total} "
                f"--retry-backoff={step.retry_backoff} "
                f"--failure-policy={step.failure_policy} {failure_move}"
                "{STANDARD_STEP_ARGUMENTS}")
            steps_to_add.append(reinject_step)
            step.set_failure_policy("move")
            step.set_failure_policy_move_dest_dir(
                "%s/%s" % (plugin.name, step.name + "_reinject"))
    for step in steps_to_add:
        plugin.configuration.add_step(step)
    return plugin


plugin_confs = []
manager = PluginsManager()
for plugin in manager.plugins.values():
    try:
        plugin.load_full()
    except Exception as e:
        LOGGER.warning("invalid plugin: %s (%s) => ignoring it ; details: %s" %
                       (plugin.name, plugin.home, e))
        continue
    with plugin.plugin_env_context():
        p = get_conf(plugin)
    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)
