#!/usr/bin/python3 

import sys
import argparse 
import car

container_help = 'desired container name: ajp | ftp | h2b | mysql | neo4j | nginx | samba | ssh | tftp or .'
container_help_all = 'desired container name: ajp | ftp | h2b | mysql | neo4j | nginx | samba | ssh | tftp | all or .'

parser = argparse.ArgumentParser(description='''car v2.1.0 - commandline interface for the container arsenal''')
parser.add_argument('--dry', action='store_true', help="only display docker compose commands without executing them")
subparsers = parser.add_subparsers(dest='command')

parser_build = subparsers.add_parser('build', help='build a container')
parser_build.add_argument('container', metavar='container', help=container_help_all)

parser_clean = subparsers.add_parser('clean', help='clean resource folders')
parser_clean.add_argument('container', metavar='container', help=container_help_all)

parser_env = subparsers.add_parser('env', help='list environment variables for the corresponding container')
parser_env.add_argument('container', metavar='container', help=container_help[:-5])

parser_exec = subparsers.add_parser('exec', help='execute command inside a running container')
parser_exec.add_argument('container', metavar='container', help=container_help)
parser_exec.add_argument('--it', dest='it', action='store_true', help='run command with an interactive terminal')
parser_exec.add_argument('--cmd', dest='cmd', help='command to run (default sh with --it)')

parser_list = subparsers.add_parser('list', help='list available containers')
parser_images = subparsers.add_parser('images', help='list allready build car containers')

parser_mirror = subparsers.add_parser('mirror', help='copy a container folder to the current working directory')
parser_mirror.add_argument('container', metavar='container', help=container_help)

parser_pull = subparsers.add_parser('pull', help='pull a prebuild container from github')
parser_pull.add_argument('container', metavar='container', help=container_help_all[:-5])

parser_rm = subparsers.add_parser('rm', help='remove a stopped container')
parser_rm.add_argument('container', metavar='container', help=container_help_all)

parser_run = subparsers.add_parser('run', help='start a container')
parser_run.add_argument('container', metavar='container', help=container_help)
parser_run.add_argument('--rm', dest='remove', action='store_true', help='automatically remove container after shutdown')
parser_run.add_argument('--rebuild', dest='rebuild', action='store_true', help='force rebuilding of the specified container')

parser_shell = subparsers.add_parser('shell', help='spawn a shell inside a running container')
parser_shell.add_argument('container', metavar='container', help=container_help)

parser_stop = subparsers.add_parser('stop', help='stop a running container')
parser_stop.add_argument('container', metavar='container', help=container_help)

parser_wipe = subparsers.add_parser('wipe', help='remove specified container image')
parser_wipe.add_argument('container', metavar='container', help=container_help_all)


def main():
    '''
    Starts car. The exact process is mainly controlled by its command line paramaters

    Parameters:
        None

    Returns:
        None
    '''
    args = parser.parse_args()
    car.init(args.dry)

    if args.command == 'list':
        containers = car.list_containers()
        print('\n'.join(containers))
        sys.exit(0)

    if args.command == 'images':
        containers = car.show_images()
        sys.exit(0)

    if hasattr(args, 'container'):
        c = args.container

    if args.command == 'run':

        if c == '.':
            car.start_local(args.rebuild, args.remove)
        else:
            car.start_container(c, args.rebuild, args.remove)

        sys.exit(0)

    if args.command == 'stop':

        if c == '.':
            car.stop_local()
        else:
            car.stop_container(c)

        sys.exit(0)

    if args.command == 'rm':

        if c == 'all':
            car.rm_all_containers()
        elif c == '.':
            car.rm_local()
        else:
            car.rm_container(c)

        sys.exit(0)

    if args.command == 'build':

        if c == 'all':
            car.build_all()
        elif c == '.':
            car.build_local()
        else:
            car.build(c)

        sys.exit(0)

    if args.command == 'pull':

        if c == 'all':
            car.pull_all()
        else:
            car.pull(c)

        sys.exit(0)

    if args.command == 'env':

        car.show_env(c)
        sys.exit(0)

    if args.command == 'shell':

        if c == '.':
            car.shell_local()
        else:
            car.shell(c)
        sys.exit(0)

    if args.command == 'wipe':

        if c == 'all':
            car.wipe_all()
        elif c == '.':
            car.wipe_local()
        else:
            car.wipe(c)
        sys.exit(0)

    if args.command == 'mirror':

        car.mirror(c)
        sys.exit(0)

    if args.command == 'exec':

        if not args.cmd:
            args.cmd = 'sh'
            args.it = True
        if c == '.':
            car.exec_local(args.cmd, interactive=args.it)
        else:
            car.exec(c, args.cmd, interactive=args.it)
        sys.exit(0)

    if args.command == 'clean':

        if c == 'all':
            car.clean_all()
        else:
            car.clean(c)

        sys.exit(0)

    parser.print_help()

if __name__ == '__main__': 
    main()
