#!/usr/bin/env python
"""
Command-line tool to convert CSV into a prettier table
"""
__rcsid__ = "$Id: nl_tbl 802 2008-06-06 18:15:21Z dang $"
__author__ = "Dan Gunter dkgunter@lbl.gov"


import csv
from itertools import izip
import logging
import optparse
import signal 
import sys
import time
#
from netlogger import nllog
from netlogger.util import ScriptOptionParser

STDIN_FILENAME = '-'

# Logging
log = nllog.NullLogger()
def activateLogging(name="netlogger.nl_tbl"):
    global log
    log = nllog.getScriptLogger(name)

def load(filename):
    if filename == STDIN_FILENAME:
        ifile = sys.stdin
    else:
        ifile = file(filename)
    rdr = csv.reader(ifile)
    header = rdr.next()
    body = [ ]
    for row in rdr:
        body.append(row)
    return header, body

def output(header, body, ofile=None):
    ncol = len(header)
    max_width = [ 0 ] * ncol
    for row in body:
        for i in xrange(ncol):
            max_width[i] = max(len(row[i]), max_width[i])
    makeRow = lambda r: ' '.join(["%-*s" % (w, s) 
                                  for w,s in izip(max_width, r)])
    ofile.write(makeRow(header))
    ofile.write('\n')
    for row in body:
        ofile.write(makeRow(row))
        ofile.write('\n')

def main():
    global log
    usage = "%prog [files..]"
    desc = "Convert CSV into a more readable tabular format"
    parser = ScriptOptionParser(usage=usage, version="0.1",
                                description=desc)
    options, args = parser.parse_args()
    if len(args) == 0:
        filenames = [ STDIN_FILENAME ]
    else:
        filenames = args
    log = getProgramLogger(options=options)
    log.info(dict(event="start", num_files=len(filenames)))
    for f in filenames:
        status = 0
        log.debug(dict(event="file.start", filename=f))
        try:
            header, body = load(f)
            output(header, body, ofile=sys.stdout)
        except OSError,E:
            log.error("could not open file '%s' for reading: %s" % (f, E))
            status = -1
        log.debug(dict(event="file.end", filename=f, status=status))
    log.info(dict(event="end", status=0))

if __name__ == '__main__':
    main()
