#!/usr/bin/env xonsh
import os, sys, argparse, yaml

class XxhDevEnv(object):
    def __init__(self):
        with open('docker-compose.yml') as docker_compose:
            self.containers = sorted(yaml.load(docker_compose, Loader=yaml.FullLoader)['services'].keys())
        parser = argparse.ArgumentParser(
            usage='''xde <command>

xxh development environment commands:

   build       Build the docker containers and get the xxh code if ./xxh is not exists
   up          Docker-compose up the containers
   test    t   Run tests
   goto    g   Open bash by the container name part
   start       Docker-compose start the containers
   stop        Docker-compose stop the containers
   remove      Docker-compose remove the containers
   
Try `./xde <command> --help` to get more info.
''')
        parser.add_argument('command', help='Command to run')

        args = parser.parse_args(sys.argv[1:2])
        if not hasattr(self, args.command):
            print('Unrecognized command\n')
            parser.print_help()
            sys.exit(1)

        getattr(self, args.command)()

    def build(self):
        if not p'xxh'.exists():
            git clone https://github.com/xonssh/xxh

        if not p'xxh-shell-xonsh-appimage'.exists():
            git clone https://github.com/xxh/xxh-shell-xonsh-appimage

        docker build . -f xxh-dev-start.Dockerfile -t xxh/xxh-dev-start
        docker build . -f xxh-dev-ubuntu-k.Dockerfile -t xxh/xxh-dev-ubuntu-k
        docker build . -f xxh-dev-ubuntu-kf.Dockerfile -t xxh/xxh-dev-ubuntu-kf

    def up(self):
        docker-compose up -d

    def start(self):
        docker-compose start

    def stop(self):
        docker-compose stop

    def remove(self):
        parser = argparse.ArgumentParser(description='')
        parser.add_argument('-f', '--full', action='store_true', help=f"Full remove: containers, images")
        parser.usage = parser.format_usage().replace('usage: xde ', 'xde remove ')
        args = parser.parse_args(sys.argv[2:])

        docker-compose rm -f -s
        if args.full:
            docker image rm xxh/xxh-dev-start xxh/xxh-dev-ubuntu-k xxh/xxh-dev-ubuntu-kf

    def t(self):
        return self.test()

    def test(self):
        docker exec -it xxh-dev_start_1 xonsh /xxh-dev/tests/tests.xsh @(sys.argv[2:])

    def g(self):
        return self.goto()

    def goto(self):
        parser = argparse.ArgumentParser(description='')
        parser.add_argument('container', help=f"Container name: {', '.join(self.containers)}")
        parser.usage = parser.format_usage().replace('usage: xde ', 'xde goto ')
        args = parser.parse_args(sys.argv[2:])

        match_containers = [c for c in self.containers if args.container in c]
        matched_cnt = len(match_containers)

        if matched_cnt == 0:
            print(f"Container {args.container} not found among: {', '.join(self.containers)}")
            sys.exit(1)
        elif matched_cnt == 1 or match_containers[0] == args.container:
            args.container = match_containers[0]
        else:
            print(f"Container '{args.container}' found many times: {', '.join(match_containers)}")
            sys.exit(1)

        container_name = f'xxh-dev_{args.container}_1'
        docker exec -it @(container_name) bash

    def release(self):
        parser = argparse.ArgumentParser(description='')
        parser.add_argument('-r', '--remove', action='store_true', help=f"Remove build dirs after release")
        parser.usage = parser.format_usage().replace('xde ', 'xde release ')
        args = parser.parse_args(sys.argv[2:])

        cd ./xxh && python3 setup.py sdist bdist_wheel && twine upload dist/*

        if args.remove:
            print('Remove build dirs')
            rm -rf ./build ./dist ./xonssh_xxh.egg-info


if __name__ == '__main__':
    XxhDevEnv()