#!/usr/bin/env python3

import argparse
import os
import re
import sys
import collections

if __name__ == '__main__':  # noqa
    pkg_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))  # noqa
    sys.path.insert(0, pkg_root)  # noqa

from dcp_diag import DcpDiagException
from dcp_diag.finders import Finder


class DcpDig:

    def __init__(self):
        parser = argparse.ArgumentParser()
        parser.add_argument('-d', '--deployment', help="search this deployment")
        parser.add_argument('component', metavar="@component")
        parser.add_argument('expression', type=self._expression_argument)
        parser.add_argument('-s', '--show', default='',
                            help='comma separated list of entities to show, e.g.: files,bundles')
        parser.add_argument('-v', '--verbose', action='store_true', help="provide lots of detail in output")
        parser.add_argument('-c', '--credentials', type=str, default='',
                            help="path to the JSON file containing credentials to query for analysis "
                                 "service(if present), otherwise will skip searching for workflows")

        args = vars(parser.parse_args())
        self.verbose = args.pop('verbose')

        self.deployment = self._choose_deployment(args)
        print(f"Using deployment {self.deployment}")

        component = args.pop('component')
        if component.startswith('@'):
            component = component[1:]

        entities_to_show = args.pop('show').split(',')

        try:
            expression = args.pop('expression')
            finder = Finder.factory(finder_name=component, deployment=self.deployment, **args)
            entity = finder.find(expression)

            if isinstance(entity, collections.abc.Iterable):
                # some of the bundles may trigger more than one analysis workflows
                # iterate the results here in case there are multiple workflows or
                # other entities are returned
                for sub_entity in entity:
                    sub_entity.print(verbose=self.verbose, associated_entities_to_show=entities_to_show)
            else:
                entity.print(verbose=self.verbose, associated_entities_to_show=entities_to_show)
        except DcpDiagException as e:
            print("\n" + str(e))
        except KeyboardInterrupt:
            pass

    def _choose_deployment(self, args):
        if 'deployment' in args and args['deployment']:
            return args.pop('deployment')
        elif 'DEPLOYMENT_STAGE' in os.environ:
            deployment = os.environ['DEPLOYMENT_STAGE']
            answer = input(f"Use deployment {deployment}? (y/n): ")
            if answer is 'y':
                return deployment
            else:
                exit(1)
        else:
            print("You must supply the --deployment argument or set environment variable DEPLOYMENT_STAGE")
            sys.exit(1)

    @staticmethod
    def _expression_argument(v):
        regex = r"\w+=\w+"
        if re.match(regex, v):
            return v
        else:
            raise argparse.ArgumentTypeError(f"must be of the format x=y")


DcpDig()
