#!/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.23'

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


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