from PySide6.QtCore import QStringListModel, Qt
from PySide6.QtGui import QStandardItem, QStandardItemModel
from PySide6.QtWidgets import QApplication, QMainWindow, QDialog, QMessageBox
from button_holder import ButtonHolder
from mainwindow import Ui_MainWindow
from add import Ui_Dialog as AddDialog
from edit import Ui_Dialog as EditDialog
from db_service import ConfigService
import sys


class Add(QDialog, AddDialog):

    def __init__(self):
        super(Add, self).__init__()
        self.setupUi(self)
        self.accepted.connect(self.save_config)

    def save_config(self):
        name = self.lineEdit.text()
        value = self.textEdit.toPlainText()

        ConfigService.add_config(name, value)


class Edit(QDialog, EditDialog):

    def __init__(self):
        super(Edit, self).__init__()
        self.setupUi(self)
        self._list_model = QStandardItemModel()
        self.accepted.connect(self.edit_config)
        self.listView.clicked.connect(self._config_click)
        self.pushButton.clicked.connect(self._delete_config)
        self._set_list_view()

    def _set_list_view(self):

        for config in ConfigService.get_config_name_list():
            item = QStandardItem(config.name)
            item.setData(config.id, Qt.UserRole)
            self._list_model.appendRow(item)

        self.listView.setModel(self._list_model)

    def _config_click(self, index):
        item = self._list_model.itemFromIndex(index)
        config_id = item.data(Qt.UserRole)
        config = ConfigService.get_config_by_id(config_id)
        self.textEdit.setText(config.value)

    def edit_config(self):
        index = self.listView.selectedIndexes()[0]
        item = self._list_model.itemFromIndex(index)
        config_id = item.data(Qt.UserRole)
        value = self.textEdit.toPlainText()
        ConfigService.update_config_by_id(config_id, value)

    def _delete_config(self):
        if self.listView.currentIndex().row() == -1:
            QMessageBox.critical(self, "Waring", "请选择需要删除的配置项")
            return
        index = self.listView.currentIndex()
        item = self._list_model.itemFromIndex(index)
        r = QMessageBox.question(self, "Waring", f"是否删除配置项 {item.text()}",)
        if r == QMessageBox.Yes:
            config_id = item.data(Qt.UserRole)
            ConfigService.delete_config_by_id(config_id)
            self._list_model.removeRow(self.listView.currentIndex().row())
            self._set_current_text_edit()

    def _set_current_text_edit(self):
        item = self._list_model.itemFromIndex(self.listView.currentIndex())
        config_id = item.data(Qt.UserRole)
        config = ConfigService.get_config_by_id(config_id)
        self.textEdit.setText(config.value)


class MainWindow(QMainWindow, Ui_MainWindow):

    def __init__(self):
        super(MainWindow, self).__init__()

        self.setupUi(self)
        self.actionConfig.triggered.connect(self._open_add_dialog)
        self.actionConfig_2.triggered.connect(self._open_edit_dialog)

    def _open_add_dialog(self):
        add = Add()
        add.exec()

    def _open_edit_dialog(self):
        edit = Edit()
        edit.exec()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    main = MainWindow()
    main.show()
    app.exec()
