#!/usr/bin/env python

from __future__ import print_function

import argparse
import os
import subprocess
import sys

from tools import cov


is_python3 = bool(sys.version_info.major == 3)
has_python34 = False
verbose = False
repo_dir = os.path.abspath(os.path.dirname(__file__))
path_to_cov = os.path.join(repo_dir, 'tools', 'cov.py')
path_to_runner = os.path.join(repo_dir, 'typ', 'runner.py')


def call(*args, **kwargs):
    if verbose:
        print(' '.join(args[0]))
    ret = subprocess.call(*args, **kwargs)
    if ret != 0:
        sys.exit(ret)


def main(argv):
    parser = argparse.ArgumentParser(prog='run')
    parser.add_argument('--no3', action='store_true',
                        help='Do not run the tests under Python 3.')
    parser.add_argument('-v', '--verbose', action='store_true')
    subps = parser.add_subparsers()

    subp = subps.add_parser('clean', help='Remove any local files.')
    subp.set_defaults(func=run_clean)

    subp = subps.add_parser('coverage',
                            help='Run the tests and report code coverage.')
    subp.set_defaults(func=run_coverage)
    cov.add_arguments(subp)

    subp = subps.add_parser('help',
                            help='Get help on a subcommand.')
    subp.add_argument(nargs='?', action='store', dest='subcommand',
                      help='The command to get help for.')
    subp.set_defaults(func=run_help)

    subp = subps.add_parser('lint',
                            help='run lint over the source')
    subp.set_defaults(func=run_lint)

    subp = subps.add_parser('tests',
                            help='run the tests')
    subp.set_defaults(func=run_tests)

    args = parser.parse_args(argv)

    global verbose
    if args.verbose:
        verbose = True
    global has_python34
    if not args.no3:
        try:
            ver = subprocess.check_output(['python3', '--version'])
            has_python34 = ver.split()[1] >= '3.4'
        except:
            pass
    args.func(args)


def run_clean(args):
    call(['git', 'clean', '-fxd'])


def run_coverage(args):
    if not args.path:
        args.path = [repo_dir]
    if not args.source:
        args.source = [os.path.join(repo_dir, 'typ')]
    argv = cov.argv_from_args(args)
    cov_args = [path_to_runner, '-j', '1']
    print('Running coverage of unit tests for Python 2.7.')
    call(['python', path_to_cov] + argv + cov_args)
    if has_python34:
        print('Running coverage of unit tests for Python 3.4.')
        call(['python3', path_to_cov] + argv + cov_args)


def run_help(args):
    if args.subcommand:
        main([args.subcommand, '--help'])
    main(['--help'])


def run_lint(args):
    call('pylint --rcfile=pylintrc */*.py */*/*.py', shell=True)


def run_tests(args):
    print('Testing running the typ module directly if it is in sys.path.')
    call(['python', '-m', 'typ', 'typ.tests.main_test.TestMain.test_basic'])

    print('Testing running the runner directly if nothing is in sys.path.')
    home_dir = os.environ['HOME']
    call(['python', path_to_runner, 'typ.tests.main_test.TestMain.test_basic'],
         cwd=home_dir)

    # Now run all the tests under Python2 and Python3.
    print('Running the unit tests under Python 2.')
    call(['python', path_to_runner])
    if has_python34:
        print('Running the unit tests under Python 3.4.')
        call(['python3', path_to_runner])


if __name__ == '__main__':
    sys.exit(main(sys.argv[1:]))
