#! /usr/bin/env python
from __future__ import print_function

import os, sys, time
from bacula_tools import Director, Catalog, ID, DIRECTOR_ID, parser_support
import curses, curses.wrapper
from pprint import *

if len(sys.argv) < 2:
    print("Usage: %s configfile.conf [configfile2.conf...]" % sys.argv[0])
    exit()

def screen_setup(screen):
    pass

class Writer():
    def __init__(self, screen):
        self.screen = screen
        (self.RESTY, self.RESTX) = screen.getmaxyx()
        self.RESTX = self.RESTX - 5
        self.rows = {}
        self.rows['empty'] = []
        curses.init_pair(1, curses.COLOR_RED, curses.COLOR_BLACK)
        curses.init_pair(2, curses.COLOR_GREEN, curses.COLOR_BLACK)
        self.normal = curses.color_pair(0) # Have to start somewhere!
        self.problem = curses.color_pair(1)
        self.good = curses.color_pair(2)
        screen.erase()
        screen.box()
        screen.refresh()
        screen.nodelay(0)
        return

    def __call__(self, msg):
        (key, value) = msg.split(': ',1)
        row = self.rows.setdefault(key, [len(self.rows)+2, 0, 0, ''])
        row[3] = value.replace('\n',' ')
        if 'Unable to handle' in value:
            row[2] += 1
            errorlog.append(value)
        else:
            row[1] += 1
        self.screen.addstr(row[0], 3, '%s: %d/' % (key, row[1]), self.normal )
        if row[2]: self.screen.addstr(str(row[2]), self.problem)
        else: self.screen.addstr('0', self.normal)
        (y,x) = self.screen.getyx()
        self.screen.addstr('  ' + row[3][:self.RESTX - x], self.normal)
        (y,x) = self.screen.getyx()
        self.screen.addstr(' ' * ((self.RESTX - x) - 2), self.normal)
        self.screen.refresh()
        return

    def finish(self):
        self.screen.addstr(0, 1, 'Finished processing, press any key to exit', self.good)
        self.screen.getkey()

w = None
errorlog = []
def display_all(stdscreen):
    global w
    screen_setup(stdscreen)
    w = Writer(stdscreen)
    for f in sys.argv[1:]:
        try: stuff = parser_support.parser(open(f).read(), w)
        except: stuff = []
    director = None
    for d in stuff:
        if type(d) == Director:
            director = d
            break
    for d in stuff:
        if type(d) == Catalog:
            d._set(DIRECTOR_ID, director[ID])
        
    w.finish()
    return 

try:
    curses.wrapper(display_all)
except:
    pprint(w.rows)
    raise

if errorlog:
    print( "Encountered these errors")
    for e in errorlog: print(e)
