#!/usr/bin/python

from __future__ import with_statement
import os, sys
from optparse import OptionParser
import ConfigParser

from boss_image_dispatcher import submit, get_ks_list

AMQP_SET = {
    'host': '127.0.0.1:5672',
    'vhost': 'boss',
    'user': 'boss',
    'pwd': 'boss',
}

VERBOSE = False
BOSS_CFG_PATH = '/etc/boss'

P_NAME = 'image_dispatcher' # component name in boss

def _Vprint(d):
    """ Verbose print routine """
    if VERBOSE:
        from pprint import pprint
        if isinstance(d, str):
            print d
        else:
            pprint(d)

if __name__ == '__main__':
    parser = OptionParser()
    parser.add_option("-c", "--config", dest="config",
                      help="specify configuration file")
    parser.add_option("-b", "--buildid",
                      help="BuildID string, like 1.1.80.13.20110105.1")
    parser.add_option("-k", "--ks",
                      help="specify the path of ks file, will a task with the content directly")
    parser.add_option("-l", "--kslist",
                      help="specify the name(s) of ks files directly, multiple ks names separated by comma")
    parser.add_option("-t", "--mailto",
                      help="specify the receipt email addresses of notification, multiple emails separated by comma")
    parser.add_option("-v", "--verbose", action="store_true",
                      help="print out verbose message for debugging")

    (opts, args) = parser.parse_args()

    if opts.config:
        cfg_fp = opts.config
    else:
        cfg_fp = os.path.join(BOSS_CFG_PATH, 'boss-participant-image-dispatcher.conf')
        if not os.path.isfile(cfg_fp):
            print 'Cannot find default config file: %s, abort' % cfg_fp
            sys.exit(1)

    with open(cfg_fp) as f:
        config = ConfigParser.ConfigParser()
        config.readfp(f)

    AMQP_SET['host'] = config.get('boss', 'amqp_host')
    AMQP_SET['vhost'] = config.get('boss', 'amqp_vhost')
    AMQP_SET['pwd'] = config.get('boss', 'amqp_pwd')
    AMQP_SET['user'] = config.get('boss', 'amqp_user')

    if opts.verbose:
        VERBOSE = True

    if not opts.buildid:
        print 'Please specify the buildid of current images'
        sys.exit(1)

    if opts.mailto:
        mailto = opts.mailto
    else:
        mailto = config.get(P_NAME, 'mailto')

    mailto = filter(None, [s.strip() for s in mailto.split(',')])

    if opts.kslist:
        name_list = [s.strip() for s in opts.kslist.split(',')]
    else:
        name_list = None

    # multiple urls split by ','
    try:
        urls = config.get(P_NAME, 'orig_baseurls')
        orig_baseurls = [l.strip().rstrip('/') for l in urls.split(',')]
    except ConfigParser.NoOptionError:
        orig_baseurls = []

    conf_baseurl = config.get(P_NAME, 'conf_baseurl').rstrip('/')
    pub_baseurl = config.get(P_NAME, 'pub_baseurl').rstrip('/')
    images_path = config.get(P_NAME, 'images_path')

    if opts.ks:
        ksn = os.path.basename(opts.ks)
        with file(opts.ks) as f:
            ksc = f.read()

        process, fields = submit(AMQP_SET, [(ksn, ksc)], orig_baseurls, conf_baseurl, pub_baseurl, opts.buildid, mailto, images_path)
        _Vprint(process)
        _Vprint(fields)

    else:
        ks_list = get_ks_list(conf_baseurl, opts.buildid, names=name_list)

        if ks_list:
            _Vprint(ks_list)
            process, fields = submit(AMQP_SET, [(ksn, None) for ksn in ks_list], orig_baseurls, conf_baseurl, pub_baseurl, opts.buildid, mailto, images_path, url_check=True)
            _Vprint(process)
            _Vprint(fields)

            print 'The following ks files was used to launch image tasks:'
            for ks in ks_list:
                print '\t', ks
        else:
            print 'No valid ks files found!'
