#!/usr/bin/python3
# coding=utf-8

import os
import sys
import argparse
from termcolor import colored

from mztools.ver import __version__
from mztools import status
from mztools import info
from mztools import put
from mztools import get
from mztools import delete
from mztools import deploy
from mztools import build
from mztools import version
from mztools import lists
from mztools import log
from mztools import restart
from mztools import vcexport
from mztools import vcimport

# Main argument parser
parser = argparse.ArgumentParser()
parser.add_argument('-v', '--version',
                    action='version',
                    version='%(prog)s {version}'.format(version=__version__))
subparsers = parser.add_subparsers()

# Subparsers
info_parser = subparsers.add_parser(
    'info',
    help='View info regarding current system setup')
info_parser.set_defaults(func=info.run_info)

status_parser = subparsers.add_parser(
    'status',
    help='View status')
status_parser.set_defaults(func=status.run_status)
status_parser.add_argument('-e', '--environment',
                           choices=['dev', 'test', 'prod'],
                           help='Get status from which environment')
status_parser.add_argument('-v', '--verbose',
                           action='store_true',
                           help='Verbose output')
put_parser = subparsers.add_parser(
    'put',
    help='Put files into your environment')
put_parser.set_defaults(func=put.run_put)
# put_parser.add_argument('-p', '--package',
#                         metavar='file',
#                         nargs='+',
#                         help='MZ Packages (.mzp)')
put_parser.add_argument('-c', '--config',
                        metavar='file',
                        nargs='+',
                        help='MZ Config/System backup (.zip)')
# put_parser.add_argument('-s', '--script',
#                         metavar='file',
#                         nargs='+',
#                         help='MZ Scripts (.sh)')
put_parser.add_argument('-e', '--extref',
                        metavar='file',
                        nargs='+',
                        help='MZ External References (.txt)')
put_parser.add_argument('-f', '--file',
                        metavar='file',
                        nargs='+',
                        help='MZ Generic file (.*)')
put_parser.add_argument('-pm', '--python-module',
                        metavar='folder',
                        nargs='+',
                        help='Python module (folder)')
put_parser.add_argument('-pr', '--python-requirement',
                        metavar='file',
                        nargs='+',
                        help='Python requirements (.txt)')
get_parser = subparsers.add_parser(
    'get',
    help='Get files from your environment')
get_parser.set_defaults(func=get.run_get)
# get_parser.add_argument('-p', '--package',
#                         metavar='file',
#                         nargs='+',
#                         help='MZ Packages (.mzp)')
get_parser.add_argument('-c', '--config',
                        metavar='file',
                        nargs='+',
                        help='MZ Config/System backup (.zip), provide - all to download all files')
# get_parser.add_argument('-s', '--script',
#                         metavar='file',
#                         nargs='+',
#                         help='MZ Scripts (.sh)')
get_parser.add_argument('-e', '--extref',
                        metavar='file',
                        nargs='+',
                        help='MZ External References (.txt), provide - all to download all files')
get_parser.add_argument('-f', '--file',
                        metavar='file',
                        nargs='+',
                        help='MZ Generic file (.*), provide - all to download all files')
get_parser.add_argument('-pm', '--python-module',
                        metavar='folder',
                        nargs='+',
                        help='Python module (folder), provide - all to download all files')
get_parser.add_argument('-pr', '--python-requirement',
                        metavar='file',
                        nargs='+',
                        help='Python requirements (.txt), provide - all to download all files')
delete_parser = subparsers.add_parser(
    'delete',
    help='Delete files in your environment')
delete_parser.set_defaults(func=delete.run_delete)
# delete_parser.add_argument('-p', '--package',
#                            metavar='file',
#                            nargs='+')
delete_parser.add_argument('-c', '--config',
                           metavar='file',
                           nargs='+')
# delete_parser.add_argument('-s', '--script',
#                            metavar='file',
#                            nargs='+')
delete_parser.add_argument('-e', '--extref',
                           metavar='file',
                           nargs='+')
delete_parser.add_argument('-f', '--file',
                           metavar='file',
                           nargs='+')
delete_parser.add_argument('-pm', '--python-module',
                           metavar='file',
                           nargs='+')
delete_parser.add_argument('-pr', '--python-requirement',
                           metavar='file',
                           nargs='+')
list_parser = subparsers.add_parser(
    'list',
    help='List files')
list_parser.set_defaults(func=lists.run_list)
# list_parser.add_argument('-p', '--package',
#                          action='store_true',
#                          nargs='+')
list_parser.add_argument('-c', '--config',
                         action='store_true',
                         help='MZ Config/System backup (.zip)')
# list_parser.add_argument('-s', '--script',
#                          action='store_true',
#                          help='MZ Scripts (.sh)')
list_parser.add_argument('-e', '--extref',
                         action='store_true',
                         help='MZ External References (.txt)')
list_parser.add_argument('-f', '--file',
                         action='store_true',
                         help='MZ Generic file (.*)')
list_parser.add_argument('-pm', '--python-module',
                         action='store_true',
                         help='Python module (folder)')
list_parser.add_argument('-pr', '--python-requirement',
                         action='store_true',
                         help='Python requirements (.txt)')
list_parser.add_argument('-b', '--backup',
                         action='store_true',
                         help='Backup files (.zip)')

version_parser = subparsers.add_parser(
    'version',
    help='List built versions')

build_parser = subparsers.add_parser(
    'build',
    help='Build new container')
build_parser.set_defaults(func=build.run_build)
# build_parser.add_argument('-a', '--auto',
#                           action='store_true',
#                           help='Automatically create a version number')
build_parser.add_argument('-v', '--version',
                          nargs=1,
                          metavar='N',
                          help='Semantic version number <N.N.N>')
build_parser.add_argument('-no-ec', '--no-ec',
                          action='store_true',
                          help='Skip build of the EC image')

deploy_parser = subparsers.add_parser(
    'deploy',
    help='Deploy container to dev, test or production')
deploy_parser.set_defaults(func=deploy.run_deploy)
deploy_group = deploy_parser.add_mutually_exclusive_group(required=True)
deploy_group.add_argument('-t', '--test',
                          nargs=1,
                          metavar='N',
                          help='Deploy specified version <N.N.N> to test')
deploy_group.add_argument('-p', '--promote',
                          action='store_true',
                          help='Promote test container to production')
deploy_group.add_argument('-d', '--dev',
                          nargs=1,
                          metavar='N',
                          help='Deploy specified version <N.N.N> to dev')
deploy_parser.add_argument('-no-ec', '--no-ec',
                           action='store_true',
                           help='Skip deploy of the EC image')
deploy_parser.add_argument('-r', '--reset',
                           action='store_true',
                           help='In combination with --dev this would reset the database and stored config in dev.')

log_parser = subparsers.add_parser(
    'log',
    help='View logs')
log_parser.set_defaults(func=log.run_log)
log_parser.add_argument('-e', '--environment',
                        choices=['dev', 'test', 'prod'],
                        help='Get logs from which environment')
log_parser.add_argument('--json',
                        action='store_true',
                        help='Json format to file')
restart_parser = subparsers.add_parser(
    'restart',
    help='Restart pico')
restart_parser.set_defaults(func=restart.run_restart)
restart_parser.add_argument('-e', '--environment',
                           choices=['dev', 'test', 'prod'],
                           help='The environmet in which the pico to be restarted resides')
restart_parser.add_argument('-n', '--name',
                           metavar='name',
                           help='Get the name of pico to restart by using the status command with the verbose flag')

vcexport_parser = subparsers.add_parser(
    'vcexport',
    help='Export configuration to files in Version Control format')
vcexport_parser.set_defaults(func=vcexport.run_vcexport)
vcexport_parser.add_argument('-e', '--environment',
                            required=True,
                            action='append',
                            choices=['dev', 'test', 'prod'],
                            help='Export files from which environment')
vcexport_parser.add_argument('-es', '--excludesysdata',
                            action='store_true',
                            help='Exclude system data from export')
vcexport_parser.add_argument('-d', '--directory',
                            metavar='folder',
                            required=True,
                            nargs='?',
                            help='Directory to export to')
vcexport_parser.add_argument('-f', '--folders',
                            metavar='folder',
                            nargs='+',
                            help='Folders to include, default all')
vcexport_parser.add_argument('-im', '--includemeta',
                            action='store_true',
                            help='Include meta data')
vcexport_parser.add_argument('-o', '--overwrite',
                            action='store_true',
                            help='Overwrite an existing export')
vcexport_parser.add_argument('-u', '--user',
                            metavar='user',
                            help='MZ user (default mzadmin)')
vcimport_parser = subparsers.add_parser(
    'vcimport',
    help='Import configuration from files in Version Control format')
vcimport_parser.set_defaults(func=vcimport.run_vcimport)
vcimport_parser.add_argument('-e', '--environment',
                            required=True,
                            action='append',
                            choices=['dev', 'test', 'prod'],
                            help='Import files to which environment')
vcimport_parser.add_argument('-d', '--directory',
                            metavar='folder',
                            required=True,
                            nargs='?',
                            help='Directory to import from')
vcimport_parser.add_argument('-f', '--folders',
                            metavar='folder',
                            nargs='+',
                            help='Folders to import, default all in import directory.')
vcimport_parser.add_argument('-m', '--message',
                            metavar='message',
                            nargs='?',
                            help='Add a message to identify the import')
vcimport_parser.add_argument('-u', '--user',
                            metavar='user',
                            help='MZ user (default mzadmin)')
vcimport_parser.add_argument('-y', '--dryrun',
                            action='store_true',
                            help='Parse files without actually importing')

def help_header():
    banner = "                _              _     \n"
    banner += "  _ __ ___  ___| |_ ___   ___ | |___ \n"
    banner += " | '_ ` _ \|_  / __/ _ \ / _ \| / __|\n"
    banner += " | | | | | |/ /| || (_) | (_) | \__ \\\n"
    banner += " |_| |_| |_/___|\__\___/ \___/|_|___/"
    banner += "  " + __version__ + "\n"

    print(colored(banner, "magenta"))
    return


# Check for no args
if len(sys.argv) == 1:
    help_header()
    parser.print_help()
    sys.exit(1)

# Check for no args in subparsers
if len(sys.argv) == 2:
    if 'status' in sys.argv:
        status_parser.print_help()
        sys.exit(1)
    if 'put' in sys.argv:
        put_parser.print_help()
        sys.exit(1)
    if 'get' in sys.argv:
        get_parser.print_help()
        sys.exit(1)
    if 'delete' in sys.argv:
        delete_parser.print_help()
        sys.exit(1)
    if 'deploy' in sys.argv:
        deploy_parser.print_help()
        sys.exit(1)
    if 'build' in sys.argv:
        build_parser.print_help()
        sys.exit(1)
    if 'version' in sys.argv:
        version.run_version()
        sys.exit(0)
    if 'list' in sys.argv:
        if lists.run_list(None):
            sys.exit(0)
        else:
            sys.exit(1)
    if 'log' in sys.argv:
        log_parser.print_help()
        sys.exit(1)
    if 'restart' in sys.argv:
        restart_parser.print_help()
        sys.exit(1)
    if 'vcexport' in sys.argv:
        vcexport_parser.print_help()
        sys.exit(1)
    if 'vcimport' in sys.argv:
        vcimport_parser.print_help()
        sys.exit(1)

# Check for too few args in subparsers
if len(sys.argv) < 6:
    if 'restart' in sys.argv:
        restart_parser.print_help()
        sys.exit(1)

# Parse args and run appropriate function
args = parser.parse_args()
if args.func(args):
    sys.exit(0)

sys.exit(1)
