#!/usr/bin/env python

import argparse
import logging
import os
import subprocess
import sys

logger = logging.getLogger('chronograph')

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description=('Run cron jobs for a Django '
                                                  'project using '
                                                  'django-chronograph.'),
                                     epilog=("NOTE: You must provide one of "
                                             "the following: settings or "
                                             "project_dir."))
    parser.add_argument('-s', metavar='settings', type=str, nargs='?',
                        dest="settings", help=('Django settings module.  You '
                                               'must provide '))
    parser.add_argument('-p', metavar='project_dir', type=str, nargs='?',
                        dest="project_dir", help='Path to project directory')
    parser.add_argument('-e', metavar='virtualenv', type=str, nargs='?',
                        dest="virtualenv", help=('Path to virtual environment '
                                                 '"activate_this.py" file'))
    parser.add_argument('-q', action='store_true', dest="quite", default=False,
                        help="Suppress output")
    parser.add_argument('-l', action='store_true', dest="loud", default=False,
                        help="Display more output")
    args = parser.parse_args()
    
    log_level = logging.INFO
    if args.quite:
        logging.disable(logging.CRITICAL)
        log_level = logging.CRITICAL
    elif args.loud:
        log_level = logging.DEBUG
    
    logging.basicConfig(stream=sys.stdout, format="[%(levelname)-8s] %(message)s")
    logger.setLevel(log_level)

        
    
    # If we're supposed to be running in a virtualenv, activate it
    if args.virtualenv:
        virtualenv = os.path.abspath(args.virtualenv)
        execfile(virtualenv, dict(__file__=virtualenv))
    
    # Now setup django
    project_dir = args.project_dir
    if project_dir:
        project_dir = os.path.abspath(args.project_dir)
        if not os.path.isdir(project_dir):
            logger.error("Error: Project directory does not "
                         "exist: %s" % project_dir)
        
        # Make sure that the project is on the path
        sys.path.append(project_dir)
        sys.path.append(os.path.join(project_dir, '../'))
        
    settings = args.settings
    if not settings and not os.environ.has_key('DJANGO_SETTINGS_MODULE'):
        if not project_dir:
            # Well, we can't do anything...
            logger.error("Error: You must either set the environmental "
                         "variable DJANGO_SETTINGS_MODULE or pass it as "
                         "an argument")
            sys.exit(0)
        
        # We'll assume the settings file is in the project directory
        settings = "%s.settings" % os.path.basename(project_dir)
    
    # Now assign the settings
    os.environ['DJANGO_SETTINGS_MODULE'] = settings
    
    logger.debug("Project dir: %s" % project_dir)
    logger.debug("Settings mod: %s" % settings)
    
    # We should be good to go now
    from django.core.management import call_command, setup_environ
    
    try:
        settings = __import__(os.environ['DJANGO_SETTINGS_MODULE'])
    except:
        sys.stderr.write("Error: Could not find Django settings\n")
        sys.exit(0)
    
    #setup_environ(settings)
    call_command('cron')
