#!/usr/bin/python2

#
# Copyright (c) 2007,2008,2009 MBARI
# MBARI Proprietary Information.  All Rights Reserved
#

# Usage:
#
# To generate a configuration file set the xsdDir path below.
# Then execute the script as follows (from ~/workspace/LRAUV):
#
# ./Tools/xmlformat/xfcGen.py ./Xml > ./Tools/xmlformat/MissionFormat.conf
#
# Run xmlformat (i.e., to modify ./Missions/Mission.xml from ~/workspace/LRAUV):
#
# ./Tools/xmlformat/xmlformat.pl --config-file=./Tools/xmlformat/MissionFormat.conf \
#    ./Missions/Mission.xml > ./Missions/Mission.xml.new; \
#    mv ./Missions/Mission.xml.new ./Missions/Mission.xml
#

import os, re, sys

if( len( sys.argv ) > 1 ):
  xsdDir = sys.argv[1]
else:
  xsdDir = os.getenv('XSD_DEST_DIR', '/mbari/LRAUV/xsd')

xsdFiles = []
rXsd = re.compile(".*\.+xsd", re.I)
for f in os.listdir(xsdDir):
  if rXsd.search(f) and not f.endswith("Tethys.xsd"):
    xsdFiles.append(f)

items = []
uris = []
units = []
uniUris = []

rItem = re.compile("<element.*name=\"(.*?)\".*Tethys:Item.*/>")
rConfigUri = re.compile("<element.*name=\"(.*?)\".*Tethys:ConfigUriType.*/>")
rDataUri = re.compile("<element.*name=\"(.*?)\".*Tethys:DataUriType.*/>")
rSettingUri = re.compile("<element.*name=\"(.*?)\".*Tethys:SettingUriType.*/>")
rUri = re.compile("<element.*name=\"(.*?)\".*Tethys:UriType.*/>")
rUnit = re.compile("<element.*name=\"(.*?)\".*Tethys:UnitType.*>")
rUniUri = re.compile("<element.*name=\"(.*?)\".*Tethys:UniversalUriType.*/>")

for file in xsdFiles:
  filename = os.path.splitext(file)[0]
  f = open(os.path.join(xsdDir, file), "r")
  lines = f.readlines()
  for line in lines:

    # is it an item?
    m = rItem.search(line)
    if m:
      items.append(filename + ":" + m.group(1))
      continue 

    # is it an uri
    m = rConfigUri.search(line)
    if m:
      uris.append(filename + ":" + m.group(1))
      continue 

    m = rDataUri.search(line)
    if m:
      uris.append(filename + ":" + m.group(1))
      continue 

    m = rSettingUri.search(line)
    if m:
      uris.append(filename + ":" + m.group(1))
      continue 

    m = rUri.search(line)
    if m:
      uris.append(filename + ":" + m.group(1))
      continue 

    # is it a unit
    m = rUnit.search(line)
    if m:
      units.append(filename + ":" + m.group(1))
      continue 
    
    # is it a universial uri
    m = rUniUri.search(line)
    if m:
      uniUris.append(filename + ":" + m.group(1))
      continue 

  f.close()

print "# xmlformat.conf"
print "# formatting configuration file for xmlformat.pl"
print "# auto-generated by xfcGen.py"
print "# (probably during call to prettyMissions.py from a 'make pretty')"

print " ".join(units)
print "  format inline"

print \
"""
*DEFAULT
  entry-break 1
  element-break 1
  exit-break 1
  subindent 4

Eq Ge Gt Le Lt Min Max Add Div Mult Sub
  format block
  entry-break 0
  element-break 0
  exit-break 0
  subindent 0
  normalize yes

DefineArg DefineOutput RedefineArg Period Assign Input Output DefaultValue Preemptive
  format block
  entry-break 0
  element-break 0
  exit-break 0
  subindent 0

And Ne Or Not Abs Elapsed Test Setting Set SetUri OutputArg Interval
  format block
  entry-break 0
  element-break 0
  exit-break 0
  subindent 0

Mission Aggregate Stack DefineBehavior
  format block
  entry-break 2
  element-break 2
  exit-break 2
  subindent 4
  normalize no

Description
  entry-break 1
  exit-break 1
  subindent 4
  wrap-length 80
  normalize yes

Preemptive Until When While ReadData ReadDatum
  entry-break 1
  element-break 1
  exit-break 1
  subindent 4
  wrap-length 2
  normalize yes

Script
  format verbatimindent
  subindent 4

Initialize Run Satisfied
  format block
  entry-break 1
  element-break 1
  exit-break 1
  subindent 4
  normalize no

Syslog
  format block
  entry-break 0
  element-break 0
  exit-break 0
  subindent 0
  normalize no
  
CustomCommand SendData Timeout
  format block
  entry-break 1
  element-break 1
  exit-break 1
  subindent 4

Value True False Arg CustomUri
  format inline
"""

