#!/usr/bin/env python3

import argparse
import os
import re
import sys

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

        args = parser.parse_args()
        self.verbose = args.verbose

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

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

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

        try:
            finder = Finder.factory(finder_name=args.component, deployment=self.deployment)
            entity = finder.find(args.expression)
            print(entity)
            entity.show_associated(entities_to_show, prefix="\t", verbose=args.verbose)
        except DcpDiagException as e:
            print("\n" + e)
        except KeyboardInterrupt:
            pass

    def _choose_deployment(self, args):
        if 'deployment' in args and args.deployment:
            return args.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()
