#!/usr/bin/env python
# -*- coding: utf-8 -*-

import argparse
import sys
import signal

__version__ = '0.13'

from andeboxlib.actions.ansibletest import AnsibleTestError, AnsibleTestAction
from andeboxlib.actions.ignorefile import IgnoreLinesAction
from andeboxlib.actions.runtime import RuntimeAction


class AndeBox:
    actions = {}
    parser = None

    def add_actions(self, *actions):
        self.actions.update({ac.name: ac() for ac in actions})

    def build_argparser(self):
        self.parser = argparse.ArgumentParser(prog="andebox", description="Ansible Collection Developer's Box")
        self.parser.add_argument("--version", action="version", version="%(prog)s {0}".format(__version__))
        self.parser.add_argument("--collection", "-c",
                                 help="fully qualified collection name (not necessary if a proper galaxy.yml file is available)")
        subparser = self.parser.add_subparsers(dest="action", required=True)

        for action in self.actions.values():
            action.make_parser(subparser)

    def run(self):
        self.build_argparser()
        args = self.parser.parse_args()
        action = self.actions[args.action]
        action.run(args)


def main():
    box = AndeBox()
    box.add_actions(AnsibleTestAction, IgnoreLinesAction, RuntimeAction)
    box.run()


if __name__ == '__main__':
    try:
        signal.signal(signal.SIGPIPE, signal.SIG_DFL)
        main()
    except KeyboardInterrupt:
        sys.exit(2)
    except BrokenPipeError:
        pass
    except AnsibleTestError as e:
        print(str(e), file=sys.stderr)
        sys.exit(1)
