#!/usr/bin/env python
# -*- coding: utf-8 -*-
# (c) 2021-2022, Alexei Znamensky <russoz@gmail.com>
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)

__version__ = '0.31'

import argparse
import sys
import signal

from andeboxlib.exceptions import AndeboxException
from andeboxlib.actions.ansibletest import AnsibleTestAction
from andeboxlib.actions.ignorefile import IgnoreLinesAction
from andeboxlib.actions.runtime import RuntimeAction
from andeboxlib.actions.toxtest import ToxTestAction
from andeboxlib.actions.vagrant import VagrantAction


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 Developer (Tool)Box v{}".format(__version__))
        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, ToxTestAction, VagrantAction)
    box.run()


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