#!/usr/bin/env python
import os
import sys
import dispatch
import coverage

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__":

    command_name = sys.argv[1]
    args = sys.argv[2:]

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

    # Execute the function
    func(*args)
