#!/usr/bin/python

import argparse
import sys
import os
import logging
from repodeploy import config, Deployer

DEFAULT_CACHE = '/var/cache/repo-deploy'
LOG_FORMAT='%(asctime)s %(levelname)s %(name)s:%(lineno)d %(message)s'

if __name__ == '__main__':

    parser = argparse.ArgumentParser()
    parser.add_argument('-c', '--config', default='/etc/repo-deploy/repo-deploy.cfg', help='Configuration file')
    parser.add_argument('--cache', default=DEFAULT_CACHE, help='Repository cache')
    parser.add_argument('--pre-hooks', default='/etc/repo-deploy/pre-update.d', help='Pre-update script hooks directory')
    parser.add_argument('--post-hooks', default='/etc/repo-deploy/post-update.d', help='Post-update script hooks directory')
    parser.add_argument('-r', '--remote', help='Remote repository')
    parser.add_argument('-l', '--local', help='Local directory')
    parser.add_argument('-f', '--fetch', action='store_true', help='Fetch repository once and exit')
    parser.add_argument('-v', '--verbose', action='store_true', help='Verbose logging for debugging')
    args = parser.parse_args()

    # Logging config
    if args.verbose:
        logging.basicConfig(level=logging.DEBUG, format=LOG_FORMAT)
    else:
        logging.basicConfig(level=logging.INFO, format=LOG_FORMAT, filename='/var/log/ext/repo-deploy.log')

    # Chatty
    logging.getLogger('requests.packages.urllib3.connectionpool').setLevel(logging.INFO)
    logging.getLogger('urllib3.connectionpool').setLevel(logging.INFO)
    logging.getLogger('sh').setLevel(logging.WARNING)

    log = logging.getLogger(__name__)

    parsed = config.parse(args.config)
    
    cfg = {
        'remote': config.value(parsed, 'remote', 'REMOTE_REPOSITORY', args.remote),
        'local': config.value(parsed, 'local', 'LOCAL_REPOSITORY', args.local),
        'schedule': config.value(parsed, 'schedule', 'UPDATE_SCHEDULE', '* * * * *'),
        'pre_hooks': args.pre_hooks,
        'post_hooks': args.post_hooks,
        'cache': args.cache
    }

    if not 'remote' in cfg or not cfg['remote']:
        log.error('No remote repository specified, exiting')
        sys.exit(1)

    if not 'local' in cfg or not cfg['remote']:
        log.error('No local directory specified, exiting')
        sys.exit(1)

    # Initialize cache
    if not os.path.exists(args.cache):
        try:
            os.makedirs(args.cache)
            log.debug('Created cache directory: %s' % args.cache)
        except Exception as e:
            log.error('Could not create cache directory: %s' % e)
            sys.exit(1)

    if args.fetch:
        if not Deployer(cfg).check_repo():
            log.error('Empty or missing repository')
            sys.exit(1)
    else:
        Deployer(cfg).run()
