##
# This software was developed and / or modified by Raytheon Company,
# pursuant to Contract DG133W-05-CQ-1067 with the US Government.
# 
# U.S. EXPORT CONTROLLED TECHNICAL DATA
# This software product contains export-restricted data whose
# export/transfer/disclosure is restricted by U.S. law. Dissemination
# to non-U.S. persons whether in the United States or abroad requires
# an export license or other authorization.
# 
# Contractor Name:        Raytheon Company
# Contractor Address:     6825 Pine Street, Suite 340
#                         Mail Stop B8
#                         Omaha, NE 68106
#                         402.291.0100
# 
# See the AWIPS II Master Rights File ("Master Rights File.pdf") for
# further licensing information.
##
from pupynere import NetCDFFile
import sys
import xml.etree.ElementTree as ET 

typeMap = { 'd' : 'DOUBLE', 'f' : 'FLOAT', 
            'i' : 'INT', 'c' : 'CHAR',
            's' : 'STRING', 'h' : 'INT' }

excludeVars = ('time', 'validTimeList', 'nStaticIds', 'inventory', 'globalInventory', 'firstInBin', 'lastInBin', 'lastRecord', 'staticIds','prevRecord', 'firstOverflow', 'isOverflow')


def main():
    fileName = sys.argv[1]

    ncFile = NetCDFFile(fileName, 'r')
    description = ET.Element('pointDataDescription')

    variableKeys = ncFile.variables.keys()
    variableKeys.sort()
    for variableName in variableKeys:
       if variableName in excludeVars:
          continue
       variableObject = ncFile.variables[variableName]
       varElement = ET.SubElement(description, 'parameter')
       varElement.set('name', variableName) 
       typeCode = variableObject.typecode()
       numDims = len(variableObject.shape)
       if numDims > 1 and typeCode is 'c':
          typeCode = 's' 
          numDims = numDims - 1
       varElement.set('type', typeMap[typeCode])
       varElement.set('numDims', str(numDims))

       if 'units' in variableObject._attributes: 
          unit = variableObject._attributes['units']
          varElement.set('unit', unit)
       if '_FillValue' in variableObject._attributes:
          fillValue = variableObject._attributes['_FillValue']
          # Disabled for now: 
          # if fillValue:
          #   varElement.set('fillValue',str(long(fillValue)))
    indentElement(description)
    print ET.tostring(description, 'UTF-8')

def indentElement(elem, level=0):
    """Used for pretty printing XML."""
    i = "\n" + level*"  "
    if len(elem):
        if not elem.text or not elem.text.strip():
            elem.text = i + "  "
        for e in elem:
            indentElement(e, level+1)
            if not e.tail or not e.tail.strip():
                e.tail = i + "  "
        if not e.tail or not e.tail.strip():
            e.tail = i
    else:
        if level and (not elem.tail or not elem.tail.strip()):
            elem.tail = i


if __name__ == "__main__":
   main()