#!/usr/bin/env python3
"""
trionyx
~~~~~~~

Trionyx commandline tool

:copyright: 2017 by Maikel Martens
:license: GPLv3
"""
import os
import sys
import argparse
import logging

logger = logging.getLogger(__name__)


try:
    from trionyx.quickstart import Quickstart
except ImportError:
    # try to import based on file
    sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))))
    try:
        from trionyx.quickstart import Quickstart
    except ImportError:
        print('Could not import trionyx')
        sys.exit(1)


class TrionyxCommand:
    """Trionyx commandline tool"""

    def __init__(self):
        """Init command parser"""
        parser = argparse.ArgumentParser(
            description='Trionyx',
            usage='''trionyx <command> [<args>]

Available commands are:
   create_project       Creates a new Trionyx project
   create_reusable_app  Create a new reusable app
   create_ansible       Creates a new ansible project to build and deploy Trionyx server
        ''')
        parser.add_argument('command', help='Subcommand to run')
        parser.add_argument("-v", "--verbose", action="store_true", help="Verbose output")
        args = parser.parse_args(sys.argv[1:2])

        if '-v' in sys.argv or '--verbose' in sys.argv:
            logging.basicConfig(format="%(levelname)s: %(message)s", level=logging.DEBUG)

        if not hasattr(self, args.command):
            print('Unrecognized command')
            parser.print_help()
            exit(1)
            # use dispatch pattern to invoke method with same name
        getattr(self, args.command)(sys.argv[2:])

    def create_command_argument_parser(self, description):
        parser = argparse.ArgumentParser(description=description)
        parser.add_argument("-v", "--verbose", action="store_true", help="Verbose output")
        return parser

    def create_project(self, argv):
        """Create new Trionyx project"""
        parser = self.create_command_argument_parser('Create a Trionyx project')
        parser.add_argument('name', help='Name of project (folder name)')

        args = parser.parse_args(argv)

        try:
            quickstart = Quickstart()
            quickstart.create_project(os.path.join(os.getcwd(), args.name))
            print(
                '\n\033[32mProject created in \033[33m{name}\033[32m,'.format(name=args.name),
                'cd into project folder and run\033[33m make first_setup\n'
            )
        except FileExistsError:
            print("Could not create project because a folder ({}) already exists".format(args.name))
            sys.exit(1)
        except Exception as e:
            logger.exception(e)
            print("Could not create project")
            sys.exit(1)

    def create_reusable_app(self, argv):
        """Create reusable app"""
        parser = self.create_command_argument_parser('Create a Trionyx reusable app')
        parser.add_argument('name', help='Name of app')

        args = parser.parse_args(argv)

        try:
            quickstart = Quickstart()
            quickstart.create_reusable_app(os.path.join(os.getcwd(), args.name), args.name)
            print(
                '\n\033[32mReusable app created in \033[33m{name}\033[32m,'.format(name=args.name),
                'cd into app folder and run\033[33m make setup\n'
            )
        except FileExistsError:
            print("Could not create reusable app because a folder ({}) already exists".format(args.name))
            sys.exit(1)
        except Exception as e:
            logger.exception(e)
            print("Could not create reusable app")
            sys.exit(1)

    def create_ansible(self, argv):
        """Create ansible playbook"""
        parser = self.create_command_argument_parser('Create a Trionyx Ansible build/deploy playbook')
        parser.add_argument('domain', help='Domain name of project')
        parser.add_argument('repo', help='Repository of project')

        args = parser.parse_args(argv)

        try:
            quickstart = Quickstart()
            quickstart.create_ansible(
                project_path=os.path.join(os.getcwd(), args.domain),
                domain=args.domain,
                repo=args.repo,
            )
        except Exception as e:
            logger.exception(e)
            print("Could not create Ansible playbook")
            sys.exit(1)

        print(
            f'\n\033[32mAnsible playbook created in \033[33m{args.domain}\033[32m,',
            f'cd into folder and run\033[33m ansible-galaxy install -r requirements.yml\033[32m\n',
            '\nAnd follow the instructions in the created README.rst file\n',
        )


if __name__ == '__main__':
    TrionyxCommand()
