#!/usr/bin/env python 
"""Dispatch Admin.

Usage:
    dispatch_admin <command_name>
    dispatch_admin <command_name> [<test_labels>...]
    dispatch_admin (-h | --help)
    dispatch_admin (-v | --version)

Options:
    -h --help     Show this screen.
    -v --version  Show version.

Commands:
    test          Run tests.
    coverage      Run coverage.
    report        Generate coverage report.
    report_html   Generate html coverage report.

"""
import os
import sys
import dispatch
import coverage
from docopt import docopt

import django
from django.conf import settings
from django.test.utils import get_runner

PACKAGE_DIR = os.path.dirname(dispatch.__file__)


def run_tests(*args):
    os.environ['DJANGO_SETTINGS_MODULE'] = 'dispatch.tests.settings'

    django.setup()

    TestRunner = get_runner(settings)
    test_runner = TestRunner()

    test_labels = args if args else [os.path.join(PACKAGE_DIR, 'tests')]

    failures = test_runner.run_tests(test_labels)

    if failures:
        sys.exit(1)


def run_coverage(*args):
    # Setup coverage
    cov = coverage.Coverage(
        branch=True,
        source=['dispatch'],
        omit=[
            os.path.join(PACKAGE_DIR, 'migrations/*'),
            os.path.join(PACKAGE_DIR, 'vendor/*'),
            os.path.join(PACKAGE_DIR, 'tests/*'),
            os.path.join(PACKAGE_DIR, 'bin/*')
        ]
    )

    # Start tracking coverage
    cov.start()

    # Run tests
    run_tests(*args)

    # Stop tracking coverage
    cov.stop()

    # Save coverage report
    cov.save()


def coverage_report():
    # Show report
    cov = coverage.Coverage()
    cov.load()
    cov.report()


def coverage_html_report():
    # Show report
    cov = coverage.Coverage()
    cov.load()
    cov.html_report()


commands = {
    'test': run_tests,
    'coverage': run_coverage,
    'report': coverage_report,
    'report_html': coverage_html_report
}

if __name__ == "__main__":

    if len(sys.argv) == 1:
        sys.argv.append("-h")

    # arguments = docopt(__doc__, version="Dispatch Admin %s" % dispatch.__version__)
    arguments = docopt(__doc__)

    # Attempt to find command function
    try:
        func = commands[arguments["<command_name>"]]
    except KeyError:
        print ("%s isn't a valid command" % arguments["<command_name>"])
        exit()

    # Execute the function
    func(*arguments['<test_labels>'])
