#!/opt/anaconda1anaconda2anaconda3/bin/python
# encoding: utf-8
"""Report progress of a workerbee experiment

Usage:
  workerbee <jobset_id> [--host=<host> --port=<port> --user=<user> --password=<password> --dbname=<dbname>]
  workerbee (--help)
  workerbee --version

Options:
  <jobset_id>             report progress for this set of jobs
  --host=<host>           database server host or socket directory
  --port=<port>           database server port
  --user=<user>           database user name
  --password=<password>   database user password
  --dbname=<dbname>       database name to connect to
  --help                  show this screen
  -v --version            report workerbee version
"""
import curses
import logging
import time
from functools import partial

from docopt import docopt

import workerbee  # needed for version
from workerbee import JobSet


# Quiet all logging
logging.basicConfig(stream=logging.NullHandler())


def report_progress(jobset, scr):
    title = 'workerbee'
    scr.addstr(1, 2, 'workerbee', curses.A_UNDERLINE) 
    scr.addstr(1, 2 + len(title) + 2, jobset.jobset_id) 

    scr.addstr(3, 2, str(jobset.db_connection_info))

    report, stats = jobset._stats_report()

    h_width = max([len(r[0]) for r in report]) + 2

    i = 0
    for i, (heading, value) in enumerate(report, 5):
        heading_padded = heading.rjust(h_width - 1).ljust(h_width)
        scr.addstr(i, 0, heading_padded, curses.A_STANDOUT)
        scr.addstr(i, h_width + 1, value)

    scr.addstr(i + 2, 1, "Press 'q' to quit, 'r' to manually refresh")
    scr.refresh()

    if stats.jobs_per_sec > 0:
        av_period_between_completions = (1 / stats.jobs_per_sec)
        # refresh 4x more often than we expect changes (to look smoother)
        return av_period_between_completions / 4
    else:
        # refresh every 10 secs if no work is currently being done
        return 10


def curses_ui(jobset, stdscr):
    curses.halfdelay(1)
    curses.curs_set(0)

    wait_time = 0
    last_update = time.time()

    while True:

        # Allow for quitting with q
        c = stdscr.getch()
        if c == ord('q'):
            break
        
        if time.time() - last_update > wait_time:
            last_update = time.time()
            wait_time = report_progress(jobset, stdscr)
        elif c == ord('r'):
            # manual refresh
            last_update = time.time()
            wait_time = report_progress(jobset, stdscr)           

        time.sleep(0.1)


if __name__ == "__main__":
    a = docopt(__doc__, version='workerbee v{}'.format(workerbee.__version__))

    main_loop = partial(curses_ui, JobSet(a['<jobset_id>'],
                        host=a['--host'], port=a['--port'], user=a['--user'],
                        password=a['--password'], dbname=a['--dbname'],
                        logger_name=None))

    curses.wrapper(main_loop)
