#!/usr/bin/env python

import argparse
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 __version__
from ansibledebugger.action_plugin_wrapper import ActionPluginWrapper
from ansibledebugger.runner_wrapper import RunnerWrapper
from ansibledebugger import utils


def main(args):
    """Wrap some funcs so that a debugger is invoked, then run ansible-playbook"""
    parser = argparse.ArgumentParser(epilog='Options available for ansible-playbook command are also available.')
    parser.add_argument('--version', action='version', version='%(prog)s ' + __version__)
    parser.add_argument('--breakpoint', action='append', default=[], help='invoke the debugger before running the task matching this name', metavar='TASK_NAME')
    known_args, unknown_args = parser.parse_known_args(args)
    breakpoint = known_args.breakpoint

    if len(args) == 0:
        parser.print_help(file=sys.stderr)
        return 1

    dummy_runner = runner.Runner(host_list=[])
    action_loader = plugins.action_loader
    action_plugins = list(action_loader.all(dummy_runner))
    action_plugin_wrapper = ActionPluginWrapper()

    for action_plugin in action_plugins:
        action_plugin_wrapper.wrap(action_plugin.__class__)

    runner_wrapper = RunnerWrapper(action_plugin_wrapper, breakpoint)
    runner_wrapper.wrap(runner.Runner)

    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(unknown_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)
