#!/usr/bin/env python
# vim:ft=python

"""HTTP Task Queue (htq) command-line interface

Usage:
    htq server [--host <host>] [--port <port>] [--redis <redis>] [--debug]
    htq worker [--threads <n>] [--redis <redis>] [--debug]

Options:
    -h --help           Show this screen.
    -v --version        Show version.
    --debug             Turns on debug logging.
    --host <host>       Host of the HTTP service [default: localhost].
    --port <port>       Port of the HTTP service [default: 5000].
    --redis <redis>     Host/port of the Redis server [default: localhost:6379].
    --threads <n>       Number of threads a worker should spawn [default: 10].
"""  # noqa

import logging
from docopt import docopt
from htq import logger
from htq.db import get_redis_client


def run_server(options):
    from htq import service

    host = options['--host']
    port = int(options['--port'])
    debug = options['--debug']

    logger.info('Starting htq REST server...')
    service.app.run(host=host,
                    port=port,
                    debug=debug)


def run_worker(options):
    from queue import Queue
    from threading import Thread
    import htq
    from htq.utils import iter_queue

    threads = int(options['--threads'])

    class Worker(Thread):
        def __init__(self, queue, *args, **kwargs):
            self.queue = queue
            Thread.__init__(self, *args, **kwargs)

        def run(self):
            while True:
                uuid = self.queue.get()

                try:
                    htq.receive(uuid)
                except Exception:
                    self.queue.put(uuid)
                finally:
                    self.queue.task_done()

    # Shared queue
    queue = Queue()

    try:
        for i in range(threads):
            t = Worker(queue, daemon=True)
            t.start()

        logger.info('Started {} workers...'.format(threads))

        # Fill queue as tasks become available
        for uuid in iter_queue():
            queue.put(uuid)

    except (KeyboardInterrupt, SystemExit):
        logger.info('Finishing queue...')
        queue.join()
        logger.info('Done.')


# Parse options
options = docopt(__doc__, version='htq 0.1.0')

# Turn on logging INFO or DEBUG
handler = logging.StreamHandler()
logger.addHandler(handler)

# Turn on debug logging to stdout
if options['--debug']:
    logger.setLevel(logging.DEBUG)
else:
    logger.setLevel(logging.INFO)


if options['--redis']:
    # Includes db index
    if '/' in options['--redis']:
        host, db = options['--redis'].split('/')
        db = int(db)
    else:
        host = options['--redis']
        db = 0

    if ':' in host:
        host, port = host.split(':')
        port = int(port)
    else:
        port = 6379

    # Sets the global connection
    get_redis_client(host=host, port=port, db=db)


# Run the command
if options['server']:
    run_server(options)

elif options['worker']:
    run_worker(options)
