#!/skynet/python/bin/python -sBtt
# -*- coding: utf-8 -*-

"""
CQueue and cqudp debug tools
"""

import argparse
import sys

from api.cqueue import Client
from kernel.util import logging
from kernel.util.config import Config

cfg = Config('ya.skynet.sky', """
Common:
  CQueueImplementation: cqueue
  Verbose: 0
""")


def keys(imp, verbosity=0, identity=None):
    levels = (
        logging.CRITICAL,
        logging.ERROR,
        logging.WARNING,
        logging.INFO,
        logging.DEBUG,
    )
    level = levels[max(0, min(verbosity + 3, len(levels) - 1))]

    handler = logging.StreamHandler()
    handler.setLevel(level)

    formatter = logging.ColoredFormatter(
        useColors=logging.isTerminal(handler.stream.fileno()),
        fmt='%(asctime)s%(levelname)s  %(message)s',
        fmtLevelname='[%(levelname)-1s]',
        fmtAsctime='',
    )
    handler.setFormatter(formatter)

    for logname in ('ya.skynet.cqueue.auth', 'cqudp.auth'):
        log = logging.getLogger(logname)

        logging.initialize(
            logger=log,
            level=level,
            handler=handler,
            formatter=formatter,
        )

    client = Client(imp)
    if identity:
        try:
            key_items = list(client.signer.loadKeys(open(identity, 'rb'), identity))
        except EnvironmentError, err:
            print >>sys.stderr, "Can't load keys from '{0}':".format(identity)
            print >>sys.stderr, "\t{0}".format(err)
            raise SystemExit(1)

        for key in key_items:
            client.signer.addKey(key)


def main():
    cCfg = cfg.Common

    parser = argparse.ArgumentParser(description='cqueue and cqudp debug tools')
    parser.add_argument('mode', help='action to run', choices=['keys'])
    parser.add_argument(
        '--cqueue_implementation', dest='cqueueImplementation', default=cCfg.CQueueImplementation,
        choices=['cqueue', 'cqudp'],
        help='Chosen cqueue implementation',
    )

    parser.add_argument(
        '-C', '--cqueue', dest='cqueueImplementation', action='store_const', const='cqueue',
        help='Use cqueue instead of kqueue'
    )

    parser.add_argument(
        '--cqudp', dest='cqueueImplementation', action='store_const', const='cqudp',
        help='Use cqudp'
    )

    parser.add_argument(
        '-i', dest='identityFile', default=None, metavar='IDENTITY_FILE',
        help='Selects a file from which the identity (private key) for public key authentication is read'
    )

    parser.add_argument(
        '-v', '--verbose', dest='verbose', action='count', default=cCfg.Verbose, help='Verbose output')
    parser.add_argument(
        '-q', '--quiet', dest='quiet', action='count', default=0, help='Quiet output')

    options = parser.parse_args()
    options.verbose -= options.quiet

    if options.mode == 'keys':
        keys(options.cqueueImplementation, verbosity=options.verbose, identity=options.identityFile)
    else:
        parser.print_usage(sys.stderr)
        raise SystemExit(1)


if __name__ == '__main__':
    raise SystemExit(main())
