import re
import qtawesome
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import   QStyledItemDelegate, QStyle, QComboBox,  QMessageBox, QPushButton,QStackedWidget, QLineEdit, QVBoxLayout, QHBoxLayout, QWidget, QLabel, QSplitter, QButtonGroup                       
from utils.DBModels.DeviceParModels import *
from UI.BlockParameterView import ParmView
from UI.SearchAddressWidget import SearchAddressWidget

from utils.DBModels.DeviceParModels import *
from utils import Globals
from UI.LoadingDataWidget import LoadingDataWidget

from model.ProjectModel.BlockManage import BlockManage, BlockType, TBType



class HideTextDelegate(QStyledItemDelegate):
    def paint(self, painter, option, index):
        # 仅在下拉列表中绘制文本，避免在ComboBox显示区域绘制
        if option.state & QStyle.State_Enabled:
            super().paint(painter, option, index)

    def sizeHint(self, option, index):
        # 返回原始大小，确保下拉列表项不受ComboBox宽度影响
        return super().sizeHint(option, index)

class TbCombox(QComboBox):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        # 创建ComboBox
  
        self.addItems(["压力转换块 ", "温度转换块", "物位转换块", "流量转换块"])
        
        self.setEditable(True)  # 设置为可编辑以应用样式表隐藏文本
        self.setObjectName('tbcombox')
        # 设置样式隐藏文本
        self.lineEdit().setStyleSheet("color: transparent; border:none; background-color: #f0f0f0")
        self.lineEdit().setCursor(Qt.ArrowCursor)
        self.lineEdit().setReadOnly(True)

        # 设置自定义代理以调整下拉列表行为
        self.delegate = HideTextDelegate(self)
        self.setItemDelegate(self.delegate)

        # 设置ComboBox的固定大小
        self.setFixedSize(30, 40)
        
        # 确保下拉列表宽度适应最长项
        # max_width = max(self.fontMetrics().width(self.itemText(i)) for i in range(self.count()))
        self.view().setMinimumWidth(130)

  

class DynamicAddBlock(QHBoxLayout):
    def __init__(self, blocklist):
        super().__init__()
        self.blocklist = blocklist
        self.buttonlist = []
        self.blockViewlist = []
        self.tbList = ['PressureTranslationBlock', 'TemperatureTranslationBlock', 'LevelTranslationBlock', 'FlowTranslationBlock']  #存放四个转换块
        self.enumList = [TBType.pressureTB, TBType.tempTB, TBType.levelTB, TBType.flowTB]
        self.initUI()

    def initUI(self):
        pbNumber = self.blocklist[0]
        tbNumber = self.blocklist[1]
        fbNumber = self.blocklist[2]

        for i in range(pbNumber):
            pblockBtn = QPushButton('物理块')
          
            pblockBtn.setCheckable(True) 
            # pblockBtn.setFixedSize(90, 43)
            pblockBtn.setObjectName("parameBtn")
            pblockBtn.setIcon(qtawesome.icon('fa.th-large', color='#1fbb6f'))
            # pblockBtn.setCheckable(True)
            pblockBtn.clicked.connect(lambda _, pbbtn = pblockBtn: self.switchParameterWidget(pbbtn))
            self.addWidget(pblockBtn, 3)
            self.buttonlist.append(pblockBtn)
            physicalBlockView = ParmView(PhysicalBlock, i, BlockType.PB)
            self.blockViewlist.append(physicalBlockView)
            if i == 0:
                pblockBtn.setChecked(True) 

        

        for i in range(fbNumber):
            fblockBtn = QPushButton('功能块' + str(i + 1))
            # fblockBtn.setFixedSize(90, 43)
            fblockBtn.setCheckable(True) 
            fblockBtn.setObjectName("parameBtn")
            fblockBtn.setIcon(qtawesome.icon('fa.th-large', color='#1fbb6f'))
            fblockBtn.clicked.connect(lambda _, fbbtn = fblockBtn: self.switchParameterWidget(fbbtn))
            self.addWidget(fblockBtn, 3)
            self.buttonlist.append(fblockBtn)
            aiFunctionBlockView = ParmView(AIFunctionBlock, i, BlockType.FB)
            self.blockViewlist.append(aiFunctionBlockView)

        for i in range(tbNumber):
            tbwidget = QWidget()
            tbwidget.setObjectName('tbwidget')
            tblayout = QHBoxLayout()

            tbwidget.setLayout(tblayout)
            tbcombox = TbCombox()
            tbcombox.setCurrentIndex(0)
            tblockBtn = QPushButton('压力转换块' + str(i + 1))
            tblockBtn.setObjectName("tbparameBtn")
            # tblockBtn.setFixedSize(130, 43)
            tblockBtn.setCheckable(True) 
            tblockBtn.setIcon(qtawesome.icon('fa.th-large', color='#1fbb6f'))
            # tblockBtn.clicked.connect(lambda _, tbbtn = tblockBtn: self.switchParameterWidget(tbbtn))
            tblockBtn.clicked.connect(lambda _, combox = tbcombox, tbbtn = tblockBtn : self.switchTbtype(combox.currentIndex(), combox, tbbtn))
            tbcombox.currentIndexChanged.connect(lambda index, combox = tbcombox, tbbtn = tblockBtn : self.switchTbtype(index, combox, tbbtn))

            tblayout.addWidget(tblockBtn, 6)
            tblayout.addWidget(tbcombox, 1)
            tblayout.setSpacing(0)
            self.addWidget(tbwidget, 5)
            self.buttonlist.append(tblockBtn)
            for tb, enum in zip(self.tbList, self.enumList):
                tbBlockView = ParmView(globals()[tb], i, enum)
                self.blockViewlist.append(tbBlockView)

        self.parameterButtonGroup = QButtonGroup()
        self.parameterButtonGroup.setExclusive(True)
        for button in self.buttonlist:
            self.parameterButtonGroup.addButton(button)

        self.parameStackWidget = QStackedWidget()
        for view in self.blockViewlist:
            self.parameStackWidget.addWidget(view)

    def switchParameterWidget(self, buttonType):
        for index , button in enumerate(self.buttonlist):
            if button == buttonType:
                self.parameStackWidget.setCurrentIndex(index)

    def switchTbtype(self, index, combox, button):

        tbType = combox.itemText(index)
        buttonNumber = button.text()[-1:]
        button.setText(tbType + str(buttonNumber))
        if button.isChecked():
            stackIndex = (int(self.blocklist[0]) + int(self.blocklist[1]) + index) + (int(buttonNumber) - 1) * 4
            self.parameStackWidget.setCurrentIndex(stackIndex)

             
    def deleteLater(self):
        while self.count():
            item = self.takeAt(0)
            widget = item.widget()
            if widget:
                widget.deleteLater()
            layout = item.layout()
            if layout:
                layout.deleteLater()

        if self.parameStackWidget:
            while self.parameStackWidget.count():
                widget = self.parameStackWidget.widget(0)
                self.parameStackWidget.removeWidget(widget)
                widget.deleteLater()
            self.parameStackWidget.deleteLater()

        super().deleteLater()


class BlockParameterManageWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
        self.initUIstat = True
        
        
    def initUI(self):
        self.mainlayout  = QVBoxLayout()
        
        self.settingLayout = QHBoxLayout()
        self.deviceAddressLabel = QLabel('从站地址')
        self.deviceAddressLabel.setObjectName('deviceAddressLabel')
        self.deviceAddressEdit = QLineEdit()
        self.deviceAddressEdit.setObjectName("deviceAddressEdit")

        self.confirmBtn = QPushButton('确定')
        self.confirmBtn.setIcon(qtawesome.icon('fa5s.check-circle', color='#1fbb6f'))
        self.confirmBtn.clicked.connect(self.loadBlackData)
        self.confirmBtn.setObjectName("parameBtn")

        self.refershDataBtn = QPushButton('加载数据')
        self.refershDataBtn.setIcon(qtawesome.icon('fa5s.check-circle', color='#1fbb6f'))
        self.refershDataBtn.clicked.connect(self.refreshData)
        self.refershDataBtn.setObjectName("parameBtn")

        self.deviceAddressSearchBtn = QPushButton('查找')
        self.deviceAddressSearchBtn.setIcon(qtawesome.icon('fa.search', color='#1fbb6f'))
        self.deviceAddressSearchBtn.clicked.connect(self.searchAddress)
        self.deviceAddressSearchBtn.setObjectName("parameBtn")

        self.settingLayout.addWidget(self.deviceAddressLabel, 1)
        self.settingLayout.addWidget(self.deviceAddressEdit, 1)
        self.settingLayout.addWidget(self.confirmBtn, 1)
        self.settingLayout.addWidget(self.refershDataBtn, 1)
        self.settingLayout.addWidget(self.deviceAddressSearchBtn, 1)
        # self.settingLayout.addLayout(self.blockLayout)

        self.splitter = QSplitter()
        self.settingLayout.addWidget(self.splitter, 18)

        self.mainlayout.addLayout(self.settingLayout,1)

        self.widget = QWidget()
        self.mainlayout.addWidget(self.widget, 20)


        self.setLayout(self.mainlayout)
    
    def loadBlackData(self):
        if self.initUIstat:
            address = self.deviceAddressEdit.text()
            # print(address)
            if address:
                pattern = re.compile(r'^(?:[1-9]|[1-9][0-9]|1[0-1][0-9]|12[0-5])$')
                match = pattern.match(address)
                if  not match:
                    QMessageBox.warning(self, '提示', '请输入1 - 125。')
                    return
                if self.initUIstat:
                    try:
                        self.blockManage = BlockManage(int(address))
                    except Exception as e:
                        reply = QMessageBox.question(self.parent(),
                                             '警告',
                                             f"发生错误: {e}",
                                             QMessageBox.Yes)
                        return
                    self.splitter.deleteLater()
                    self.widget.deleteLater()
                    self.splitter = QSplitter()
                    Globals.setValue('blockManage', self.blockManage)
                    blocklist = self.blockManage.getBlockNums()
                    self.blockLayout = DynamicAddBlock(blocklist)
                    self.settingLayout.addLayout(self.blockLayout, 7)
                    self.settingLayout.addWidget(self.splitter, 11)
                    self.mainlayout.addWidget(self.blockLayout.parameStackWidget, 20)
                    self.initUIstat = False
            else:
                reply = QMessageBox.question(self.parent(),
                                             '警告',
                                             "请输入从站地址",
                                             QMessageBox.Yes)
                return
        else:
            reply = QMessageBox.question(self, '确定', '确定更换站地址吗?',
                                     QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
            if reply == QMessageBox.Yes:
                self.blockLayout.deleteLater()
                self.splitter.deleteLater()
                self.splitter = QSplitter()
                blocklist = self.blockManage.getBlockNums()
                self.blockLayout = DynamicAddBlock(blocklist)
                self.settingLayout.addLayout(self.blockLayout, 7)
                self.settingLayout.addWidget(self.splitter, 11)
                self.mainlayout.addWidget(self.blockLayout.parameStackWidget, 20)
            else:
                return

    def refreshData(self):
        if self.initUIstat:
            reply = QMessageBox.question(self.parent(),
                                            '警告',
                                            "请先连接设备",
                                            QMessageBox.Yes)
            return

        self.loadingDataWidget = LoadingDataWidget()
        self.loadingDataWidget.show()
        # self.loadingDataWidget.loadData()
        blockView = self.blockLayout.parameStackWidget.currentWidget()
        
        model = blockView.model
        # model.updateColumn(5, '查询中sdadadsda\r\nsdasdsasasad\r\nasdsadsad...')
        # blockView.resizeHeader()
        blockType = blockView.blockType
        blcokIndex = blockView.blcokIndex
        self.blockManage.getBlockValues(blockType = blockType, blockIndex = blcokIndex, callback = self.loadingDataWidget.loadData, callback2 = model.updateValue)
        # print(valueList)
        # model.updateValue(valueList)
        # print(blockType, blcokIndex)

        
           
            
        
            
      
    def searchAddress(self):
        self.searchAddressWidget = SearchAddressWidget(self.deviceAddressEdit)
        self.searchAddressWidget.show()
        
       
        
