#!/usr/bin/env python
import argparse
import docker_buildtool
import logging
import os
import sys
import yaml

from docker_buildtool import error, utils, git_version

logger = logging.getLogger()
formatter = logging.Formatter('[%(asctime)s] %(message)s')
handler = logging.StreamHandler(sys.stderr)
handler.setFormatter(formatter)
logger.addHandler(handler)

def build(args):
    variables = {}
    for k_v in args.variable:
        k, v = k_v.split('=', 2)
        variables[k] = v

    builder = docker_buildtool.Builder(
        dockerfile=args.dockerfile,
        image=args.tag,
        variables=variables,
        no_fetch=args.no_fetch
    )
    builder.run(dryrun=args.dryrun)

def pull(args):
    puller = docker_buildtool.Puller(dockerfile=args.dockerfile)
    puller.run(dryrun=args.dryrun)

def version(args):
    versioner = docker_buildtool.Versioner(dockerfile=args.dockerfile)
    logger.info('Note: the following fetch commands may take a while to run.')
    versions = versioner.run(no_fetch=args.no_fetch)

    if args.yaml:
        full_version_string = yaml.dump(versions)
    else:
        full_version_string = '\n\n'.join([
'''{name}
{version_string}'''.format(name=name, version_string=git_version.pretty_string(version))
            for (name, version) in sorted(versions.items())])

    logger.critical('\n' + full_version_string)
    if args.outfile is not None:
        with open(args.outfile, 'w') as f:
            logger.info('Writing version string to %s', args.outfile)
            f.write(full_version_string)

def main():
    parser = argparse.ArgumentParser(description=None)
    parser.add_argument('-v', '--verbose', action='count', dest='verbosity', default=0, help='Set verbosity.')
    parser.add_argument('-f', '--dockerfile', default='Dockerfile', help='Which Dockerfile to use.')

    subparsers = parser.add_subparsers()
    sub = subparsers.add_parser('build')
    sub.add_argument('--no-fetch', default=True, action='store_true', help='Do not fetch')
    sub.add_argument('--fetch', dest='no_fetch', action='store_false', help='Fetch git repos')
    sub.add_argument('-t', '--tag', help='The tag to use.')
    sub.add_argument('-v', '--variable', default=[], nargs='+', help='Value of docker-buildtool varable of the form KEY=VALUE.')
    sub.add_argument('-n', '--dryrun', action='store_true', help='Do not actually run')
    sub.set_defaults(func=build)

    sub = subparsers.add_parser('pull')
    sub.add_argument('-n', '--dryrun', action='store_true', help='Do not actually run')
    sub.set_defaults(func=pull)

    sub = subparsers.add_parser('version')
    sub.add_argument('-n', '--no-fetch', default=False, action='store_true', help='Do not fetch')
    sub.add_argument('--fetch', dest='no_fetch', action='store_false', help='Fetch git repos')
    sub.add_argument('-f', '--dockerfile', default='Dockerfile', help='Which Dockerfile to use.')
    sub.add_argument('-o', '--outfile', default=None, help='Optional output file to save the version string')
    sub.add_argument('-y', '--yaml', action='store_true', default=False, help='Print as YAML')
    sub.set_defaults(func=version)

    args = parser.parse_args()

    if args.verbosity == 0:
        logger.setLevel(logging.INFO)
    elif args.verbosity >= 1:
        logger.setLevel(logging.DEBUG)

    if hasattr(args, 'func'):
        args.func(args)
    else:
        parser.print_help()

    return 0

if __name__ == '__main__':
    sys.exit(main())
