# -*- coding: utf-8 -*-
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from qgis import core, gui
import re
global a

class ValidateForm:
	def __init__(self, layer, formValues, logBrowser):
		self.layer = layer
		self.formValues = formValues
		self.rules = {rules}
		self.logBrowser = logBrowser
		self.validateForm()

	def calculateExpression(self, exp):
		for field in self.formValues:
			if field != 'filter':
				if len(self.formValues[field]) == 3:
					value = self.formValues[field][1][self.formValues[field][0]]
				else:
					value = self.formValues[field][0]
				exp = exp.replace('"{0}"'.format(field), "'{0}'".format(str(value)))
				exp = exp.replace("'NULL'".format(field), "NULL")
		r = QgsExpression(exp)
		return r.evaluate()

	def validateForm(self):
		self.cleanRulesOnForm()
		logText = ""
		for rule in self.rules:
			for field in rule:
				if field in self.formValues:
					for exp in reversed(rule[field]):
						try:
							result = self.calculateExpression(exp['rule'])
							if bool(result):
								if len(self.formValues[field]) == 3:
									self.formValues[field][2].setStyleSheet(
										"QWidget {background-color: rgb(%s)}"%(
											exp["cor_rgb"]
										)
									)
								else:
									self.formValues[field][1].setStyleSheet(
										"QWidget {background-color: rgb(%s)}"%(
											exp["cor_rgb"]
										)
									)
								logText += u"<p>{0}</p>".format(exp["descricao"])
						except:
							pass
		self.logBrowser.setText(logText)

	def cleanRulesOnForm(self):
		for field in self.formValues:
			if len(self.formValues[field]) == 3:
				self.formValues[field][2].setStyleSheet("")
			else:
				self.formValues[field][1].setStyleSheet("")

class ManagerForm(QtCore.QObject):
    def __init__(self, dialog, layer, feature):
        super(ManagerForm, self).__init__()
        self.myDialog = dialog
        self.lyr = layer
        self.validadeForm = ""
        self.logBrowser = dialog.findChild(QLabel, "logLabel")
        self.logFrame = dialog.findChild(QFrame, "logFrame")
        self.logFrame.hide()
        self.logBtn = dialog.findChild(QPushButton, "logBtn")
        self.logBtn.setCheckable(True)
        self.logBtn.clicked.connect(self.showLog)
        buttonBox = dialog.findChild(QDialogButtonBox,"buttonBox")
        buttonBox.rejected.connect(self.finishedForm)
        buttonBox.accepted.connect(self.finishedForm)
        button_ok = buttonBox.button(QDialogButtonBox.Ok)
        button_ok.setAutoDefault(True)
        button_ok.setDefault(True)
        button_cancel = buttonBox.button(QDialogButtonBox.Cancel)
        button_cancel.setAutoDefault(False)
        button_cancel.setDefault(False)
        self.myDialog.installEventFilter(self)

    def showLog(self, state):
        if state:
            self.logFrame.show()
        else:
            self.logFrame.hide()

    def eventFilter(self, o, event):
        if event.type() in [7, 10, 11, 100]:
            self.validateLayerByRules()
        return False

    def validateLayerByRules(self):
        formValues = {}
        for cb in self.myDialog.findChildren(QComboBox):
            idx = self.lyr.fields().indexOf(cb.objectName())
            formValues[cb.objectName()] = [
                cb.currentText(),
                self.lyr.editorWidgetSetup(idx).config()['map'] if idx > 0 else self.optFilter.keys(),
                cb
            ]
        for le in self.myDialog.findChildren(QLineEdit):
                formValues[le.objectName()] = [
                le.text(),
                le
            ]
        self.validadeForm = ValidateForm(self.lyr, formValues, self.logBrowser)

    def finishedForm(self):
        pass

def formOpen(dialog, layer, featureid):
    try:
        global a
        a = ManagerForm(dialog, layer, featureid)
    except:
        pass
