from com.raytheon.uf.common.message.response import ResponseMessageGeneric
from gov.noaa.nws.ncep.edex.uengine.tasks.profile import NcSoundingDrv

class NcSoundingDataRequest():

    def __init__(self):
        self.NcSoundingDrv = NcSoundingDrv()
        
    def setNcSoundingLayer2(self, useLayer2):
        self.NcSoundingDrv.setUseNcSoundingLayer2(useLayer2)
        
        
    def setLat(self, lat):
        self.NcSoundingDrv.setLat(lat)
        self.lat = lat
        
    def setLon(self, lon):
        self.NcSoundingDrv.setLon(lon)
        self.lon = lon
        
    def setRangeTimeArr(self,rtArr):
        from jep import jarray, JLONG_ID
        jTA = jarray(len(rtArr), JLONG_ID)
        for i in range(len(rtArr)):
            jTA[i] = long(rtArr[i])
        self.NcSoundingDrv.setRangeTimeArr(jTA)

    def setLatLonArr(self, LatLonArr):
        from jep import jarray, JDOUBLE_ID
        jA = jarray(len(LatLonArr), JDOUBLE_ID)
        for i in range(len(LatLonArr)):
            jA[i] = LatLonArr[i]
        self.NcSoundingDrv.setLatLons(jA)
        
    def setRefTime(self, refTime):
        self.NcSoundingDrv.setRefTime(refTime)
        self.refTime = refTime
        
    def setRefTimeStr(self, refTimeStr):
        self.NcSoundingDrv.setRefTimeStr(refTimeStr)
        
    def setValidTimeStart(self, validTimeStart):
        self.NcSoundingDrv.setValidTimeStart(validTimeStart)
        self.validTimeStart = validTimeStart
        
    def setValidTimeEnd(self, validTimeEnd):
        self.NcSoundingDrv.setValidTimeEnd(validTimeEnd)
        self.validTimeEnd = validTimeEnd

    def setValidTimeStartStr(self, validTimeStartStr):
        self.NcSoundingDrv.setValidTimeStartStr(validTimeStartStr)

    def setValidTimeEndStr(self, validTimeEndStr):
        self.NcSoundingDrv.setValidTimeEndStr(validTimeEndStr)

    def setSndType(self, sndType):
        self.NcSoundingDrv.setSndType(sndType)
        
    def setDataType(self, dataType):
        self.NcSoundingDrv.setDataType(dataType)
        
    def setQueryType(self, queryType):
        self.NcSoundingDrv.setQueryType(queryType)
        
    def setTableName(self, tableName):
        self.NcSoundingDrv.setTableName(tableName)
        
    def setMerge(self, mergeFlag):
        self.NcSoundingDrv.setMerge(mergeFlag)
        
    def setLevel(self, level):
        self.NcSoundingDrv.setLevel(level)
 
    def setDbIdList(self, dbIdList):
        #print dbIdList
        from jep import jarray, JINT_ID
         # create a one dim jarray of length len(dbIdList) of JINT_ID type
        jA = jarray(len(dbIdList), JINT_ID, 0)
         # fill the values
        for i in range(len(dbIdList)):
            jA[i] = int(dbIdList[i])
        self.NcSoundingDrv.setDbIdList(jA)
        
    def setLatLonList(self, LatLonArr):
        from jep import jarray, JDOUBLE_ID
        jA = jarray(len(LatLonArr)*len(LatLonArr[0]), JDOUBLE_ID, 0)
        for i in range(len(LatLonArr)):
            for j in range(len(LatLonArr[0])):
                jA[i*len(LatLonArr)+j] = LatLonArr[i][j]
        self.NcSoundingDrv.setLatLons(jA)
        
    def setTimeLine(self, timeLine):
        self.NcSoundingDrv.setTimeLine(timeLine)
        

    def makeResponse(self):
#            print 'Before calling the constructor for ResponseMessageGeneric with NcSoundingCube'
            return ResponseMessageGeneric(self.result)

    def makeNullResponse(self):
#        print 'from makeNullResponse'
        return ResponseMessageGeneric("No data is available")

 
    def getSoundingRangeTimeLine(self):
        self.result = self.NcSoundingDrv.getSoundingRangeTimeLine()
        if self.result is None:
            return self.makeNullResponse()
        else:
            return self.makeResponse()
       
    def getSoundingTimeLine(self):
        self.result = self.NcSoundingDrv.getSoundingTimeLine()
        if self.result is None:
            return self.makeNullResponse()
        else:
            return self.makeResponse()
    def getMdlSoundingRangeTimeLine(self):
        self.result = self.NcSoundingDrv.getMdlSoundingRangeTimeLine()
        if self.result is None:
            return self.makeNullResponse()
        else:
            return self.makeResponse()
       
    def getMdlSoundingTimeLine(self):
        self.result = self.NcSoundingDrv.getMdlSoundingTimeLine()
        if self.result is None:
            return self.makeNullResponse()
        else:
            return self.makeResponse()
       
    def getSoundingStnInfoCol(self):
        self.result = self.NcSoundingDrv.getSoundingStnInfoCol()
        if self.result is None:
            return self.makeNullResponse()
        else:
            return self.makeResponse()
    
    
    def getSoundingDataByLatLonArray(self, LatLonArr):
        self.NcSoundingDrv.setQueryType("LATLON")
        from jep import jarray, JDOUBLE_ID
        jA = jarray(len(LatLonArr), JDOUBLE_ID)
        for i in range(len(LatLonArr)):
            jA[i] = LatLonArr[i]
        self.NcSoundingDrv.setLatLons(jA)
        self.result = self.NcSoundingDrv.getSoundingDataGeneric()
#was        self.result = self.NcSoundingDrv.getSoundingDataByLatLonArray()
        if self.result is None:
            return self.makeNullResponse()
        else:
            return self.makeResponse()
        
        
    def getSoundingDataByRangeTimeArray(self, rtArr):
        self.NcSoundingDrv.setQueryType("LATLON")
        from jep import jarray, JLONG_ID
        jTA = jarray(len(rtArr), JLONG_ID)
        for i in range(len(rtArr)):
            jTA[i] = long(rtArr[i])
        self.NcSoundingDrv.setRangeTimeArr(jTA)
        self.result = self.NcSoundingDrv.getSoundingDataGeneric()
#        self.result = self.NcSoundingDrv.getSoundingDataByRangeTimeArray()
        if self.result is None:
            return self.makeNullResponse()
        else:
            return self.makeResponse()
        
    def getSoundingDataByStnIdArray(self, StnIdArr):
        self.NcSoundingDrv.setQueryType("STNID")
        from jep import jarray
        from java.lang import String
        jA = jarray(len(StnIdArr), String)
        for i in range(len(StnIdArr)):
            jA[i] = String(StnIdArr[i])
        self.NcSoundingDrv.setStnIdArr(jA)
        self.result = self.NcSoundingDrv.getSoundingDataGeneric()
#        self.result = self.NcSoundingDrv.getSoundingDataByStnArray()
        if self.result is None:
            return self.makeNullResponse()
        else:
            return self.makeResponse()

    def getSoundingDataByStnNumArray(self, StnNumArr):
        self.NcSoundingDrv.setQueryType("STNNUM")
        from jep import jarray
        from java.lang import String
        jA = jarray(len(StnNumArr), String)
        for i in range(len(StnNumArr)):
            jA[i] = String(StnNumArr[i])
        self.NcSoundingDrv.setStnNumArr(jA)
        self.result = self.NcSoundingDrv.getSoundingDataGeneric()
#        self.result = self.NcSoundingDrv.getSoundingDataByStnArray()
        if self.result is None:
            return self.makeNullResponse()
        else:
            return self.makeResponse()

    def getSoundingData2ByStnIdArray(self, stnIdArr):
        self.NcSoundingDrv.setQueryType("STNID")
        from jep import jarray        
        from java.lang import String
        jA = jarray(len(stnIdArr), String)
        for i in range(len(stnIdArr)):
            jA[i] = String(stnIdArr[i])
        self.NcSoundingDrv.setStnIdArr(jA)

        self.result = self.NcSoundingDrv.getSoundingData2Generic()
        if self.result is None:
            return self.makeNullResponse()
        else:
            return self.makeResponse()    
    def getSoundingData2ByLatLonArray(self, LatLonArr):
#        print'from NcSoundingDataRequest.getSoundingLayer2DataByLatLonArray'
        self.NcSoundingDrv.setQueryType("LATLON")
        from jep import jarray, JDOUBLE_ID
        jA = jarray(len(LatLonArr), JDOUBLE_ID)
        for i in range(len(LatLonArr)):
            jA[i] = LatLonArr[i]
        self.NcSoundingDrv.setLatLons(jA)
#        print'just before calling self.NcSoundingDrv.getSoundingLayer2DataUsingLatLonArray()'
        self.result = self.NcSoundingDrv.getSoundingData2Generic()
        if self.result is None:
#            print 'unable to get the sounding cube back'
            return self.makeNullResponse()
        else:
#            print 'Got the sounding cube back'
            return self.makeResponse()        

    def getModelSoundingModelNames (self):
        self.result = self.NcSoundingDrv.getModels()
        if self.result is None:
            return self.makeNullResponse()
        else:
            return self.makeResponse() 
        
#   Chin: query DB from Python script directly. Much slower than from Java. Obsoleted and replaced by getModelSoundingModelNames()
    def getSoundingModelNames (self, plugin):
        from java.util import ArrayList
        from com.raytheon.edex.uengine.tasks.query import TableQuery
        from com.raytheon.uf.edex.database.plugin import PluginFactory
        
        recordClass = PluginFactory.getInstance().getPluginRecordClassName(plugin)
        
        query = TableQuery("metadata",recordClass)
        query.setDistinctField("modelInfo.modelName")
        queryResults = query.execute()
        if queryResults is None or queryResults.size() == 0:
            return self.makeNullResponse()
        else:
            response = ArrayList()
            for i in range(queryResults.size()):
                currentQuery = queryResults.get(i)
                response.add(ResponseMessageGeneric(currentQuery))
            return response
    
    def setModelName (self, modelName):
        self.NcSoundingDrv.setModelName(modelName)
        self.modelName = modelName
        
    def setPluginName (self, plugin):
        self.NcSoundingDrv.setPluginName(plugin)
        self.plugin = plugin
        
    def getModelSoundingDataProto (self, aModel ):       
        import GempakDataPointRequest
        dpr = GempakDataPointRequest.GempakDataPointRequest(self.plugin)
        dpr.setTime(self.refTime)
        dpr.setGrid(self.modelName)
        dpr.setLocationLatlon (self.lon, self.lat)
        dpr.setParm(parm)
        return dpr.execute()
    
    def getModelSoundingData (self):
        self.result = self.NcSoundingDrv.getMdlSoundingData()
        print "result=", self.result
        if self.result is None:
            return self.makeNullResponse()
        else:
            return self.makeResponse()