import sys
import os
from PyQt5.QtWidgets import QApplication, QWidget, QDialog, QLabel, QVBoxLayout, QPushButton, QMessageBox, QComboBox, QDialogButtonBox, QShortcut
from PyQt5 import uic
from PyQt5.QtGui import QKeySequence
from PyQt5.QtCore import Qt, QEvent, QObject
import json
# from print_color import *

sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '../..')))
ui_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '../Shared_UI'))
ui_file_path = os.path.join(ui_path, "DialogModifyAlias.ui")

class DialogModifyAlias(QDialog):
    def __init__(self, main_window, parent=None):
        super(DialogModifyAlias, self).__init__(parent)
        # Load UI file
        uic.loadUi(ui_file_path, self)        
        combo : QComboBox  = self.comboBox

        combo.clear()
        self.alias_item_dict = {}
        self.main_window = main_window
        
        self.setWindowTitle("别名参数修改")
        self.setWindowFlag(Qt.FramelessWindowHint)
        self.buttonBox.button(QDialogButtonBox.Ok).setText('确定')
        self.buttonBox.button(QDialogButtonBox.Cancel).setText('取消')
        self.buttonBox.clicked.connect(self.dialog_button_ok_clicked)
        
        #定义4个快捷键, Key_Enter, Key_Escape经常被各类程序模块使用, 用Key_End, 与Key_Home来代替
        QShortcut(QKeySequence(Qt.Key_Up), self, activated=self.key_increase_parameter)
        QShortcut(QKeySequence(Qt.Key_Down), self, activated=self.key_decrease_parameter)
        QShortcut(QKeySequence(Qt.Key_PageDown), self, activated=self.key_enter_process)
        QShortcut(QKeySequence(Qt.Key_PageUp), self, activated=self.key_escape_process)
        QShortcut(QKeySequence(Qt.Key_End), self, activated=self.key_enter_process)
        QShortcut(QKeySequence(Qt.Key_Home), self, activated=self.key_escape_process)

        home_button = self.findChild(QPushButton, "KEY_HOME")
        if home_button:
            home_button.clicked.connect(self.key_escape_process)

        end_button = self.findChild(QPushButton, "KEY_END")
        if end_button:
            end_button.clicked.connect(self.key_enter_process)

        up_button = self.findChild(QPushButton, "KEY_UP")
        if up_button:
            up_button.clicked.connect(self.key_increase_parameter)

        down_button = self.findChild(QPushButton, "KEY_DOWN")
        if down_button:
            down_button.clicked.connect(self.key_decrease_parameter)
    
    def set_caption_name(self, name : str) :
        label : QLabel = self.label
        label.setText(name)

    def key_increase_parameter(self):
        combo : QComboBox  = self.comboBox
        index = combo.currentIndex()
        index += 1
        if index >= combo.count() :
            index = 0
        combo.setCurrentIndex(index)
 
    def key_decrease_parameter(self):
        combo : QComboBox  = self.comboBox
        index = combo.currentIndex()
        index -= 1
        if index < 0 :
            index = combo.count() - 1
        combo.setCurrentIndex(index)

    def get_alias_key_str(self):
        combo : QComboBox  = self.comboBox
        select_text = combo.currentText()
        alias_key = None
        for alias_key, alias_str in self.alias_item_dict.items() :
            if alias_str == select_text :
                return alias_key
        return alias_key

    @property
    def value(self):
        alias_key = self.get_alias_key_str()
        return alias_key
    
    def modify_alias_value(self, modify_str) :
        if self.main_window != None :
            if hasattr(self.main_window, "func_call_back_on_mqtt_param_modify") :
                self.main_window.func_call_back_on_mqtt_param_modify(modify_str)

    def key_enter_process(self):
        alias_key = self.get_alias_key_str()
        self.modify_alias_value(alias_key)
        self.buttonBox.button(QDialogButtonBox.Ok).click()

    def key_escape_process(self):
        self.buttonBox.button(QDialogButtonBox.Cancel).click()

    def set_alias_item_info(self, alias_item_dict, key_value, inform_message : str = "系统参数") :
        combo : QComboBox  = self.comboBox
        
        self.alias_item_dict  = alias_item_dict
        combo.clear()
        current_index = 0
        select_index = -1
        
        self.set_caption_name(inform_message)

        for key, value_str in alias_item_dict.items() :
            combo.addItem(value_str)
            if key_value == key :
                select_index = current_index
            current_index += 1
        
        if select_index >= 0 :
            combo.setCurrentIndex(select_index)
        else :
            combo.setCurrentText(key_value)

    def dialog_button_ok_clicked(self, button):
        if button == self.buttonBox.button(QDialogButtonBox.Ok) :
            alias_key = self.get_alias_key_str()
            self.modify_alias_value(alias_key)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    alias_select = {0 : "380V", 1 : "660V", 2: "1140V", 3 : "3300V"}
    json_msg : str = json.dumps(alias_select, ensure_ascii=False)
    # print_inform_msg(json_msg)
    
    alias_2 = {"alias_voltage" : {0 : "380V", 1 : "660V", 2: "1140V", 3 : "3300V"}}
    json_msg2 : str = json.dumps(alias_2, ensure_ascii=False)
    # print_inform_msg(json_msg2)
    
    
    dialog = DialogModifyAlias(None)    
    dialog.set_alias_item_info(alias_select, 1)
    dialog.show()
    result = dialog.exec_()
    
    # if dialog.result() == QDialog.Accepted:
    #     print_inform_msg(dialog.get_alias_key_str())  # 输出: Button clicked

    sys.exit(0)
