from netcdfhelper import netcdfhelper
from MultiSpectralFile import MultiSpectralFile


#class NetcdfFile(MultiSpectralFile):
class NetcdfFile:
  def __init__(self, filename):
    self.nc_helper   = netcdfhelper(filename)
    self.nc_file     = self.nc_helper.file
    self.dims        = self.nc_helper.getDimensions()
    self.vars        = self.nc_helper.getVariables()
    self.readerTable = None

  def getNumObsElements(self, name=None):
    if name != None:
      return self.dims[name]
    else:
      raise Exception, "must supply dimension name with this reader"
      
  def getNumObsLines(self, name=None):
    if name != None:
      return self.dims[name]
    else:
      raise Exception, "must supply dimension name with this reader"

  def getNumGeoElements(self, name=None):
    if name != None:
      return self.dims[name]
    else:
      raise Exception, "must supply dimension name with this reader"

  def getNumGeoLines(self, name=None):
    if name != None:
      return self.dims[name]
    else:
      raise Exception, "must supply dimension name with this reader"

  def getNumObsChannels(self, name=None):
    if name != None:
      return self.dims[name]
    else:
      raise Exception, "must supply dimension name with this reader"

  def getInstrumentName(self, name):
    return self.nc_helper.getAttribute(name)

  def getTrackSegments(self, name=None):
    if name != None:
      var = self.nc_helper.getVariable(name)
      if var != None:
        return self.nc_helper.getValues(var)
      else:
        return None
    else:
      return None

  def getValues(self, name, start=None, size=None, stride=None):
    var = self.nc_helper.getVariable(name)
    if var != None:
      #-- detect/rearrange to match dimension order in the file
      return self.nc_helper.getValues(var, start, size, stride)
    else:
      return None

  def getValue(self, name, start=None):
    var = self.nc_helper.getVariable(name)
    if var != None:
      return self.nc_helper.getFloat(var, start)
    else:
      return None

  #- get scale/offset attribute for the observations variable
  def getObsScaleOffset(self, observation_name, scale_name, offset_name):
    var = self.nc_helper.getVariable(observation_name)
    scaleAttr  = var.findAttribute(scale_name)
    offsetAttr = var.findAttribute(offset_name)
    if scaleAttr == None or offsetAttr == None:
      return None, None
    else:
      return scaleAttr.getValue(), offsetAttr.getValue()

  def getObsDimOrder(self):
    var = self.nc_helper.getVariable(self.readerTable.observation)
    var_dims = var.getDimensions()
    dim_order = []
    #- assumed, default order
    dims_list = [self.readerTable.channelIndex, self.readerTable.obsElement, self.readerTable.obsLine]
    for dim_name in dims_list:
      for i in xrange(len(var_dims)):
        if var_dims[i].getName() == dim_name:
          dim_order.append(i)
    return dim_order

  def getDimOrder(self, name, dims_list):
    var = self.nc_helper.getVariable(name)
    var_dims = var.getDimensions()
    dim_order = []
    for dim_name in dims_list:
      for i in xrange(len(var_dims)):
        if var_dims[i].getName() == dim_name:
          dim_order.append(i)
    return dim_order

  #- verify that this <name> is a variable, dimension or attribute in the file
  def verifyName(self, name):
    found = 0
    for i in xrange(len(self.dims)):
      if (self.dims.has_key(name)):
        found = 1
        return found
    for i in xrange(len(self.vars)):
      if (self.vars[i].getName() == name):
        found = 1
        return found
    return found
