#!/usr/bin/env python

import distutils.spawn
import imp
import os
import sys
import tempfile

# retrieved from bin/ansible-playbook
local_module_path = os.path.abspath(
    os.path.join(os.path.dirname(__file__), '..', 'lib')
)
sys.path.append(local_module_path)

from ansible import runner
from ansible import errors
from ansible.utils import plugins
from ansible.callbacks import display

from ansibledebugger import action_plugin_wrapper
from ansibledebugger import utils


def main(args):
    """ wrap existing action plugins, then run ansible-playbook """
    dummy_runner = runner.Runner(host_list=[])
    action_loader = plugins.action_loader
    action_plugins = list(action_loader.all(dummy_runner))

    wrapper_plugin_dir = tempfile.mkdtemp()

    for action_plugin in action_plugins:
        module = sys.modules[action_plugin.__module__]
        utils.replace_plugin(module, action_plugin_wrapper, wrapper_plugin_dir)

    action_loader.add_directory(wrapper_plugin_dir)

    ansibleplaybook_path = distutils.spawn.find_executable("ansible-playbook")
    if not ansibleplaybook_path:
        raise errors.AnsibleError("Failed to find 'ansible-playbook' script in PATH")
    ansibleplaybook = imp.load_source('ansibledebugger', ansibleplaybook_path)
    return ansibleplaybook.main(args)

if __name__ == "__main__":
    display(" ", log_only=True)
    display(" ".join(sys.argv), log_only=True)
    display(" ", log_only=True)
    try:
        sys.exit(main(sys.argv[1:]))
    except errors.AnsibleError, e:
        display("ERROR: %s" % e, color='red', stderr=True)
        sys.exit(1)
    except KeyboardInterrupt, ke:
        display("ERROR: interrupted", color='red', stderr=True)
        sys.exit(1)
