#!/usr/bin/env python3
import os
import sys
import traceback
programPath = os.path.split(os.path.realpath(__file__))[0]  # 返回 string
sys.path.append(f"{programPath}/..")

import os
import sys
import json
import dbus
import threading
from UI.KeyAddGui import *
import PyQt5.QtWidgets as QtWidgets

keyListDebianMap = [[], ["shift"], ["ctrl"], ["alt"], ["ctrl", "alt"], ["ctrl", "shift"], ["alt", "shift"]]
keyList = ["无快捷键", "shift", "ctrl", "alt", "ctrl+alt", "ctrl+shift", "alt+shift"]

class Check:
    def VersionCheck():
        try:
            bus = dbus.SessionBus()
            bus.get_object("com.deepin.daemon.Keybinding", "/com/deepin/daemon/Keybinding").List()
            #int("a")
            return True
        except:
            print("无法检测到 Deepin/UOS 快捷键服务")
            return False
    def CheckThreading():
        if Check.VersionCheck():
            ui.startServer.setDisabled(True)
            ui.stopServer.setDisabled(True)
            ui.setAutoStart.setDisabled(True)
            ui.setUnautoStart.setDisabled(True)
            ui.editButton.setDisabled(True)
            ui.keyBoardList.setDisabled(True)
            ui.delectButton.setDisabled(True)

def Clear():
    #ui.keyBoardList.model().removeRows(0, ui.keyBoardList.model().rowCount())
    
    model = QtCore.QStringListModel(window)
    try:
        with open(f"{programPath}/list/KeyList.json", "r") as file:
            lists = []
            for i in json.loads(file.read()):
                #lists.append(f"{i[0]}({'+'.join(i[0: -1])}),{i[-1]}")
                choice = i
                #ui.localKeyboardChoose.setCurrentIndex(keyListDebianMap.index(choice[:-2]))
                newList = []
                newList.append([keyListDebianMap.index(choice[:-2]), choice[-2]])
                # 解析命令
                command = choice[-1]
                # 筛掉路径
                command = command[command[1:].index("'") + 2:].strip()
                # 筛出其中一个快捷键
                newList.append([command[command.index(" ") - 1]])
                command = command[command.index(" ") + 2:]
                # 读 exe
                newList.insert(0, command[:command.index("'")])
                command = command[command.index("'") + 1: ].strip()
                # 读最后的快捷键
                newList[2].insert(0, int(command))
                print(newList)
                lists.append(f"{newList[0]}({'+'.join(keyListDebianMap[newList[1][0]])}+{newList[1][1]})=>({'+'.join(keyListDebianMap[newList[2][0]])}+{newList[2][1]})")
            model.setStringList(lists)
        ui.keyBoardList.setModel(model)
    except:
        traceback.print_exc()

class Click:
    def AddButton():
        os.system(f"'{programPath}/keyboard-add-gui.py'")
        Clear()

    def EditButton():
        os.system(f"'{programPath}/keyboard-add-gui.py' {ui.keyBoardList.currentIndex().row()}")
        Clear()

    def DeleteButton():
        try:
            with open(f"{programPath}/list/KeyList.json", "r") as file:
                lists = json.loads(file.read())
            del lists[ui.keyBoardList.currentIndex().row()]
            with open(f"{programPath}/list/KeyList.json", "w") as file:
                file.write(json.dumps(lists))
            Clear()
        except:
            traceback.print_exc()
            QtWidgets.QMessageBox.critical(window, "错误", traceback.format_exc())
    

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(window)
    # 连接槽
    ui.addButton.clicked.connect(Click.AddButton)
    ui.editButton.clicked.connect(Click.EditButton)
    ui.delectButton.clicked.connect(Click.DeleteButton)
    ui.startServer.triggered.connect(lambda: threading.Thread(target=os.system, args=[f"nohup '{programPath}/key-get.py' &"]).start())
    ui.stopServer.triggered.connect(lambda: threading.Thread(target=os.system, args=[f"'{programPath}/stop.sh'"]).start())
    ui.setAutoStart.triggered.connect(lambda: threading.Thread(target=os.system, args=[f"pkexec '{programPath}/start-auto-server.sh'"]).start())
    ui.setUnautoStart.triggered.connect(lambda: threading.Thread(target=os.system, args=[f"pkexec '{programPath}/stop-auto-server.sh'"]).start())
    window.show()
    threading.Thread(target=Check.CheckThreading).start()
    Clear()
    sys.exit(app.exec_())