class ConfigureElectronicsDialog(QtGui.QDialog):
    """Dialog for setting up the electronics configuration"""

    def __init__(self, parent=None):
        super(QtGui.QDialog, self).__init__(parent)

        self.resize(700, 560)

        self.initButtons()
        self.initConnections()

        self.configFile = "test.config"

    def start(self, moduleHandler, databaseHandler, moduleId, auto = False):

        self.moduleHandler = moduleHandler
        self.databaseHandler = databaseHandler
        self.moduleId = moduleId

        self.initFrames()
        self.loadFromFile()
        if auto == False:
            self.exec_()
        
        
    def initButtons(self):

        self.buttonLayoutWidget = QtGui.QWidget(self)
        self.buttonLayoutWidget.setGeometry(QtCore.QRect(self.width() - 330, self.height() - 50, 330, 60))

        self.buttonLayout = QtGui.QHBoxLayout(self.buttonLayoutWidget)

        self.saveButton = QtGui.QPushButton(self.buttonLayoutWidget)
        self.saveButton.setText("&Save")
        
        self.configureButton = QtGui.QPushButton(self.buttonLayoutWidget)
        self.configureButton.setText("C&onfigure")

        self.cancelButton = QtGui.QPushButton(self.buttonLayoutWidget)
        self.cancelButton.setText("&Cancel")

        self.buttonLayout.addWidget(self.saveButton)
        self.buttonLayout.addWidget(self.configureButton)
        self.buttonLayout.addWidget(self.cancelButton)

        self.buttonLayoutWidget.setLayout(self.buttonLayout)

    def initConnections(self):

        self.connect(self.saveButton, QtCore.SIGNAL("clicked()"), self.saveToFile)
        self.connect(self.configureButton, QtCore.SIGNAL("clicked()"), self.doConfigure)
        self.connect(self.cancelButton, QtCore.SIGNAL("clicked()"), self.cancelConfiguration)

    def saveToFile(self):
        
        CONFIGFILE = open(self.configFile, "w") 
        configLines = []

        xfirst, xlast, zfirst, zlast, lgxfirst, lgxlast, lgzfirst, lgzlast = self.regionWidget.getReadOutRegion()

        truRoEnabled = self.regionWidget.isTruReadoutEnabled()

        preSamples, samples, truSamplesMin, truSamplesMax = self.samplesWidget.getSamplesSettings()

        zeroSuppression = self.zsWidget.isZeroSuppressionOn()
        zsThreshold = self.zsWidget.getZSThreshold()
        zsOffset = self.zsWidget.getOffset()
        sparseReadout = self.zsWidget.isSparseReadout()
        sparseReadoutRcu = self.zsWidget.isSparseReadoutRcu()
        autoBS = self.fpWidget.isAutoSubtracted()
        
        
        configLines.append("HGXFIRST " + str(xfirst) + "\n")
        configLines.append("HGXLAST " + str(xlast) + "\n")
        configLines.append("HGZFIRST " + str(zfirst) + "\n")
        configLines.append("HGZLAST " + str(zlast) + "\n")

        configLines.append("LGXFIRST " + str(lgxfirst) + "\n")
        configLines.append("LGXLAST " + str(lgxlast) + "\n")
        configLines.append("LGZFIRST " + str(lgzfirst) + "\n")
        configLines.append("LGZLAST " + str(lgzlast) + "\n")

        configLines.append("TRUREADOUT " + str(truRoEnabled) + "\n")

        configLines.append("PRESAMPLES " + str(preSamples) + "\n")
        configLines.append("SAMPLES " + str(samples) + "\n")
        configLines.append("TRUSAMPLESMIN " + str(truSamplesMin) + "\n")
        configLines.append("TRUSAMPLESMAX " + str(truSamplesMax) + "\n")
        configLines.append("ZEROSUPPRESSION " + str(zeroSuppression) + "\n")
        configLines.append("THRESHOLD " + str(zsThreshold) + "\n")
        configLines.append("OFFSET " + str(zsOffset) + "\n")
        configLines.append("AUTOBS " + str(autoBS) + "\n")
        configLines.append("SPARSEREADOUT " + str(sparseReadout) + "\n")
        configLines.append("SPARSEREADOUTRCU " + str(sparseReadoutRcu) + "\n")
        configLines.append("MEBMODE " + str(self.mebWidget.getMEBMode()) + "\n")
        configLines.append("APDCONFIG " + str(self.getApdConfig()) + "\n")
       

        CONFIGFILE.writelines(configLines)
        CONFIGFILE.close()

    def loadFromFile(self):

        CONFIGFILE = open(self.configFile, "r")
        
        
        for line in CONFIGFILE.readlines():

            valueName = line.split(" ")[0]
            if valueName == "HGXFIRST":
                self.regionWidget.setHgFirstX(int(line.split(" ")[1]))
            if valueName == "HGXLAST":
                self.regionWidget.setHgLastX(int(line.split(" ")[1]))
            if valueName == "HGZFIRST":
                self.regionWidget.setHgFirstZ(int(line.split(" ")[1]))
            if valueName == "HGZLAST":
                self.regionWidget.setHgLastZ(int(line.split(" ")[1]))
            if valueName == "LGXFIRST":
                self.regionWidget.setLgFirstX(int(line.split(" ")[1]))
            if valueName == "LGXLAST":
                self.regionWidget.setLgLastX(int(line.split(" ")[1]))
            if valueName == "LGZFIRST":
                self.regionWidget.setLgFirstZ(int(line.split(" ")[1]))
            if valueName == "LGZLAST":
                self.regionWidget.setLgLastZ(int(line.split(" ")[1]))
            if valueName == "TRUREADOUT":
                if line.split(" ")[1].strip() == "True":
                    self.regionWidget.setTruEnabled(True)
                if line.split(" ")[1].strip() == "False":
                    self.regionWidget.setTruEnabled(False)
            if valueName == "PRESAMPLES":
                self.samplesWidget.setPreSamples(int(line.split(" ")[1]))
            if valueName == "SAMPLES":
                self.samplesWidget.setSamples(int(line.split(" ")[1]))
            if valueName == "TRUSAMPLESMIN":
                self.samplesWidget.setTruSamplesMin(int(line.split(" ")[1]))
            if valueName == "TRUSAMPLESMAX":
                self.samplesWidget.setTruSamplesMax(int(line.split(" ")[1]))
            if valueName == "ZEROSUPPRESSION":
                if line.split(" ")[1].strip() == "True":
                    self.zsWidget.setZeroSuppression(True)
                if line.split(" ")[1].strip() == "False":
                    self.zsWidget.setZeroSuppression(False)
            if valueName == "AUTOBS":
                if line.split(" ")[1].strip() == "True":
                    self.fpWidget.setAutoSubtracted(True)
                    self.fpWidget.fpCheckBox.setChecked(False)
                if line.split(" ")[1].strip() == "False":
                    self.fpWidget.setAutoSubtracted(False)
                    self.fpWidget.fpCheckBox.setChecked(True)
            if valueName == "SPARSEREADOUT":
                if line.split(" ")[1].strip() == "True":
                    self.zsWidget.setSparseReadout(True)
                if line.split(" ")[1].strip() == "False":
                    self.zsWidget.setSparseReadout(False)
            if valueName == "SPARSEREADOUTRCU":
                if line.split(" ")[1].strip() == "True":
                    self.zsWidget.setSparseReadoutRcu(True)
                if line.split(" ")[1].strip() == "False":
                    self.zsWidget.setSparseReadoutRcu(False)
            if valueName == "THRESHOLD":
                self.zsWidget.setZSThreshold(int(line.split(" ")[1]))
            if valueName == "OFFSET":
                self.zsWidget.setOffset(int(line.split(" ")[1]))
            if valueName == "MEBMODE":
                if line.split(" ")[1].strip() == "True":
                    self.mebWidget.setMEBMode(True)
                if line.split(" ")[1].strip() == "False":
                    self.mebWidget.setMEBMode(False)
            if valueName == "APDCONFIG":
                self.setApdConfig(int(line.split(" ")[1]))

        CONFIGFILE.close()


    def doConfigure(self):

        rdoRegion, rdoSettings = self.getReadoutConfig()

        self.moduleHandler.configureElectronics(self.moduleId, rdoRegion, rdoSettings)
        
        self.cancelConfiguration()

    def getReadoutConfig(self):

        preSamples, samples, truSamplesMin, truSamplesMax = self.samplesWidget.getSamplesSettings()

        zeroSuppression = self.zsWidget.isZeroSuppressionOn()
        zsThreshold = self.zsWidget.getZSThreshold()
        zsOffset = self.zsWidget.getOffset()
        sparseReadout = self.zsWidget.isSparseReadout()
        sparseReadoutRcu = self.zsWidget.isSparseReadoutRcu()
        autoBs = self.fpWidget.isAutoSubtracted() and self.zsWidget.isZeroSuppressionOn()
        fixedBS = self.fpWidget.isFixedSubtracted()

        enableFakeAltroReadout = self.regionWidget.isTruReadoutEnabled()

        MEBMode = self.mebWidget.getMEBMode()
#        print "MEBMODE: " + str(MEBMode)
    #triggerMode = self.getTriggerMode()

        xfirst, xlast, zfirst, zlast, lgxfirst, lgxlast, lgzfirst, lgzlast = self.regionWidget.getReadOutRegion()

        rdoRegion = ReadoutRegion_t(StartZ_t(zfirst), EndZ_t(zlast), StartX_t(xfirst), EndX_t(xlast), StartZ_t(lgzfirst), EndZ_t(lgzlast), StartX_t(lgxfirst), EndX_t(lgxlast), enableFakeAltroReadout, truSamplesMin, truSamplesMax)

        rdoSettings = ReadoutSettings_t(NPreSamples_t(preSamples), NSamples_t(samples), zeroSuppression, zsThreshold, zsOffset, 
                                        sparseReadout, sparseReadoutRcu, autoBs, fixedBS, MEBMode)

        return rdoRegion, rdoSettings

    def getAltroConfig(self):
        
        preSamples, samples = self.samplesWidget.getSamplesSettings()
        
        readoutMode = self.mebWidget.getNumberOfMEB()/5

    def cancelConfiguration(self):

        self.close()
        
    def initFrames(self):
        
        self.readoutFrame = QtGui.QFrame(self)
        self.readoutFrame.setGeometry(10, 10, self.width()/2 - 15, self.height() - 60)
        self.readoutFrame.setFixedSize(self.width()/2 - 40, self.height() - 60)
        self.readoutFrame.setFrameShape(QtGui.QFrame.StyledPanel)
        self.readoutFrame.setFrameShadow(QtGui.QFrame.Raised)

        self.apdFrame = QtGui.QFrame(self)
        self.apdFrame.setGeometry(self.width()/2 - 15, 10, self.width()/2 - 10, self.height()/2 - 40)
        self.apdFrame.setFixedSize(self.width()/2 + 5, self.height()/2 - 35)
        self.apdFrame.setFrameShape(QtGui.QFrame.StyledPanel)
        self.apdFrame.setFrameShadow(QtGui.QFrame.Raised)

#         self.truFrame = QtGui.QFrame(self)
#         self.truFrame.setGeometry(self.width()/2 - 15, self.height()/2 - 15, self.width()/2 - 10, self.height()/2 - 30)
#         self.truFrame.setFixedSize(self.width()/2 + 5, self.height()/2 - 35)
#         self.truFrame.setFrameShape(QtGui.QFrame.StyledPanel)
#         self.truFrame.setFrameShadow(QtGui.QFrame.Raised)

        self.fpFrame = QtGui.QFrame(self)
        self.fpFrame.setGeometry(self.width()/2 - 15, self.height()/2 - 15, self.width()/2 - 10, self.height()/2 - 30)
        self.fpFrame.setFixedSize(self.width()/2 + 5, self.height()/2 - 35)
        self.fpFrame.setFrameShape(QtGui.QFrame.StyledPanel)
        self.fpFrame.setFrameShadow(QtGui.QFrame.Raised)
        
        self.readoutLabel = QtGui.QLabel("READ OUT SETTINGS", self.readoutFrame)
        self.readoutLabel.setGeometry(self.readoutFrame.width()/2 - self.readoutLabel.width()/2 - 15, 10, 130, 20)

        self.initReadoutWidgets()
        self.initApdWidgets()
        self.initFPWidgets()

    def initReadoutWidgets(self):

        self.readoutSep = QtGui.QFrame(self.readoutFrame)
        self.readoutSep.setGeometry(0, 35, self.readoutFrame.width(), self.readoutFrame.width())
        self.readoutSep.setFixedWidth(self.readoutFrame.width())
        self.readoutSep.setFixedHeight(1)
        self.readoutSep.setFrameShadow(QtGui.QFrame.Raised)
        self.readoutSep.setFrameShape(QtGui.QFrame.HLine)

        self.regionWidget = ReadoutRegionSettingsWidget(self.readoutFrame.width() - 30, 140, self)
        self.regionWidget.setGeometry(10, 45, self.readoutFrame.width() - 30, 140)

        self.regionSep = QtGui.QFrame(self.readoutFrame)
        self.regionSep.setGeometry(0, self.readoutSep.y() + self.regionWidget.height(), self.readoutFrame.width(), self.readoutFrame.width())
        self.regionSep.setFixedWidth(self.readoutFrame.width())
        self.regionSep.setFixedHeight(1)
        self.regionSep.setFrameShadow(QtGui.QFrame.Raised)
        self.regionSep.setFrameShape(QtGui.QFrame.HLine)

        self.samplesWidget = ReadoutSamplesSettingsWidget(self.readoutFrame.width() - 30, 100, self)
        self.samplesWidget.setGeometry(10, self.regionSep.y() + 5, self.readoutFrame.width() - 30, 100)

        self.samplesSep = QtGui.QFrame(self.readoutFrame)
        self.samplesSep.setGeometry(0, self.regionSep.y() + self.samplesWidget.height(), self.readoutFrame.width(), self.readoutFrame.width())
        self.samplesSep.setFixedWidth(self.readoutFrame.width())
        self.samplesSep.setFixedHeight(1)
        self.samplesSep.setFrameShadow(QtGui.QFrame.Raised)
        self.samplesSep.setFrameShape(QtGui.QFrame.HLine)

        self.zsWidget = ReadoutZeroSuppressionWidget(self.readoutFrame.width() - 30, 150, self)
        self.zsWidget.setGeometry(10, self.samplesSep.y() + 5, self.readoutFrame.width() - 30, 150)

        self.zsSep = QtGui.QFrame(self.readoutFrame)
        self.zsSep.setGeometry(0, self.samplesSep.y() + self.zsWidget.height(), self.readoutFrame.width(), self.readoutFrame.width())
        self.zsSep.setFixedWidth(self.readoutFrame.width())
        self.zsSep.setFixedHeight(1)
        self.zsSep.setFrameShadow(QtGui.QFrame.Raised)
        self.zsSep.setFrameShape(QtGui.QFrame.HLine)

        self.mebWidget = ReadoutMEBWidget(self.readoutFrame.width() - 30, 150, self)
        self.mebWidget.setGeometry(10, self.zsSep.y() + 5, self.readoutFrame.width() - 30, 150)

    def initApdWidgets(self):

        self.apdWidget = APDSettingSelectorWidget(self.apdFrame.width() - 30, 200, self.apdFrame)
        latest = self.databaseHandler.getLatestConfigId()
        id = latest
        self.configId = id

        comment = self.databaseHandler.getConfigComment(id)

        self.apdWidget.setConfig(id, latest, comment)

        self.connect(self.apdWidget, QtCore.SIGNAL("getConfig"), self.setApdConfig)
        self.connect(self.apdWidget, QtCore.SIGNAL("loadApdSettings"), self.loadApdSettings)
        self.connect(self.apdWidget, QtCore.SIGNAL("applyApdSettings"), self.applyApdSettings)

    def initFPWidgets(self):
        
        self.fpWidget = FixedPedestalsSelectorWidget(self.fpFrame.width() - 30, 200, self.fpFrame)

#         self.connect(self.fpWidget, QtCore.SIGNAL("getCommitMessage"), self.getCommitMessage)
#         self.connect(self.fpWidget, QtCore.SIGNAL("loadPFValues"), self.loadPFValues)
#         self.connect(self.fpWidget, QtCore.SIGNAL("applyPFValues"), self.applyPFValues)

    def setApdConfig(self, id):
        
        comment = self.databaseHandler.getConfigComment(id)
        latest = self.databaseHandler.getLatestConfigId()
        self.apdWidget.setConfig(id, latest, comment)
        self.configId = id

    def getApdConfig(self):

        return self.configId

    def loadApdSettings(self, id):

        self.databaseHandler.loadApdConfig(id)
        self.databaseHandler.loadApdValues(self.moduleId)

    def applyApdSettings(self, id):
        
        self.moduleHandler.applyApdSettings(self.moduleId)