#!/usr/bin/env python

import sys

from optparse import OptionParser
from glue.ligolw import ligolw
from glue.ligolw import table
from glue.ligolw import lsctables
from glue.ligolw import ilwd
from glue.ligolw import utils
from glue.ligolw.utils import process as ligolw_process

cols = lsctables.SnglInspiralTable.validcolumns

def fill_missing_columns(sngl):
  for entry in cols.keys():
    if not(hasattr(sngl,entry)):
      if cols[entry] in ['real_4','real_8']:
        setattr(sngl,entry,0.)
      elif cols[entry] == 'int_4s':
        setattr(sngl,entry,0)
      elif cols[entry] == 'lstring':
        setattr(sngl,entry,'')
      elif entry == 'process_id':
        sngl.process_id = ilwd.ilwdchar("sngl_inspiral:process_id:0")
      elif entry == 'event_id':
        sngl.event_id = ilwd.ilwdchar("sngl_inspiral:event_id:0")
      else:
        print >> sys.stderr, "Column %s not recognized" %(entry)
        raise ValueError


parser = OptionParser(
    usage   = "%prog [OPTIONS]",
    description = "Creates a template bank and writes it to XML." )

parser.add_option("-V", "--verbose", action="store_true", help="print extra debugging information", default=False )
parser.add_option("-i", "--input-file", action="store", type="string",  help="Input file with sngl_inspiral xml table")
parser.add_option("-o", "--output-file", action="store", type="string",  help="Output file name")
(opts,args) = parser.parse_args()

if not opts.input_file:
  print >> sys.stderr, "--input-file must be supplied"
  sys.exit(1)

if not opts.output_file:
  print >> sys.stderr, "--output-file must be supplied"
  sys.exit(1)

oldxml = utils.load_filename(opts.input_file,gz = opts.input_file.endswith('gz'))
oldSnglTable = table.get_table(oldxml,"sngl_inspiral")

for key in cols.keys():
  if key not in oldSnglTable.columnnames:
    oldSnglTable.appendColumn(key)

for sngl in oldSnglTable:
  fill_missing_columns(sngl) 

utils.write_filename(oldxml,opts.output_file,gz = opts.output_file.endswith('gz'))
