#!/usr/bin/env python
# -*- Python -*-
"""Transform find-fix.py output into Excellable csv."""

__date__ = "Time-stamp: <2003-10-16 13:26:27 jrepenning>"[13:30]
__author__ = "Jack Repenning <jrepenning@collab.net>"

import getopt
import inspect
import os
import os.path
import pydoc
import re
import shutil
import string
import sys
import time

# Long options and their usage strings; "=" means it takes an argument.
# To get a list suitable for getopt.getopt(), just do
#
#   [x[0] for x in long_opts]
#
# Make sure to sacrifice a lamb to Guido for each element of the list.
long_opts = [
    ["doc",             """Optional, print pydocs."""],
    ["help",            """Optional, print usage (this text)."""],
    ["verbose",         """Optional, print more progress messages."""],
    ]

help    = 0
verbose = 0
me = os.path.basename(sys.argv[0])

DATA_FILE = "http://subversion.tigris.org/iz-data/query-set-1.tsv"

def main():
    """Run find-fix.py with arguments du jour for drawing pretty
manager-speak pictures.""" 

    global verbose

    try:
        opts, args = getopt.getopt(sys.argv[1:], "", [x[0] for x in long_opts])
    except getopt.GetoptError, e:
        print "Error: ", e.msg
        shortusage()
        print me + " --help for options."
        sys.exit(1)

    for opt, arg in opts:
        if opt == "--help":
            usage()
            sys.exit(0)
        elif opt == "--verbose":
            verbose = 1
        elif opt == "--doc":
            pydoc.doc(pydoc.importfile(sys.argv[0]))
            sys.exit(0)

    # do something fruitful with your life
    if len(args) == 0:
        args = ["query-set-1.tsv", "core-history.csv"]
        print ("ff2csv %s %s" % args)

    if len(args) != 2:
        print "%s: Wrong number of args." % me
        shortusage()
        sys.exit(1)

    if os.system("curl " + DATA_FILE + "> " + args[0]):
        os.system("wget " + DATA_FILE)

    outfile = file(args[1], "w")
    outfile.write("Date,found,fixed,inval,dup,other,remain\n")

    totalsre = re.compile("totals:.*found= +([0-9]+) +"
                          "fixed= +([0-9]+) +"
                          "inval= +([0-9]+) +"
                          "dup= +([0-9]+) +"
                          "other= +([0-9]+) +"
                          "remain= *([0-9]+)")
    for year in ("2001", "2002", "2003", "2004"):
        for month in ("01", "02", "03", "04", "05", "06", "07", "08",
                      "09", "10", "11", "12"):
            for dayrange in (("01", "08"),
                             ("08", "15"),
                             ("15", "22"),
                             ("22", "28")):
                if verbose:
                    print "searching %s-%s-%s to %s" % (year,
                                                        month,
                                                        dayrange[0],
                                                        dayrange[1])
                ffpy = os.popen("python ./find-fix.py --m=beta "
                                "%s %s-%s-%s %s-%s-%s"
                                % (args[0],
                                   year, month, dayrange[0],
                                   year, month, dayrange[1]))
                if verbose:
                    print "ffpy: ", ffpy

                line = ffpy.readline()
                if verbose:
                    print "initial line is: ", line
                matches = totalsre.search(line)
                if verbose:
                    print "initial match is: ", matches
                while line and not matches:
                    line = ffpy.readline()
                    if verbose:
                        print "%s: read line '%s'" % (me, line)
                    matches = totalsre.search(line)
                    if verbose:
                        print "subsequent line is: ", line

                ffpy.close()

                if verbose:
                    print "line is ", line

                if matches.group(1) != "0" \
                   or matches.group(2) != "0" \
                   or matches.group(3) != "0" \
                   or matches.group(4) != "0" \
                   or matches.group(5) != "0":
                    
                    outfile.write("%s-%s-%s,%s,%s,%s,%s,%s,%s\n"
                                  % (year, month, dayrange[1],
                                     matches.group(1),
                                     matches.group(2),
                                     matches.group(3),
                                     matches.group(4),
                                     matches.group(5),
                                     matches.group(6),
                                     ))
                elif matches.group(6) != "0":
                    # quit at first nothing-done week
                    # allows slop in loop controls
                    break
    outfile.close()            
    

def shortusage():
  "Print one-line usage summary."
  print "%s - %s" % (me, pydoc.synopsis(sys.argv[0]))

def usage():
  "Print multi-line usage tome."
  shortusage()
  print '''%s [opts] [queryfile [outfile]]
Option keywords may be abbreviated to any unique prefix.
Option order is not important.
Most options require "=xxx" arguments:''' % me
  for x in long_opts:
      padding_limit = 18
      if x[0][-1:] == '=':
          print "   --" + x[0][:-1],
          padding_limit = 19
      else:
          print "   --" + x[0],
      print (' ' * (padding_limit - len(x[0]))), x[1]

if __name__ == "__main__":
  main()
