from PySide6.QtWidgets import QDialog, QTableWidgetItem, QMessageBox
from PySide6.QtCore import Qt
from icons import icon


class XsltParamsEditDialog(QDialog):
    """Gemeinsame Basisklasse für Dialoge zur Bearbeitung von XSLT-Parametern."""

    def __init__(self, parent=None, node=None, parent_params=None):
        super().__init__(parent)

        self.ui = self._create_ui()
        self.ui.setupUi(self)

        self.node = node
        self.parent_params = parent_params or {}

        self.ui.addParamButton.setIcon(icon("plus-circle"))
        self.ui.removeParamButton.setIcon(icon("minus-circle"))

        self.ui.addParamButton.clicked.connect(self.add_parameter)
        self.ui.removeParamButton.clicked.connect(self.remove_parameter)

        self._setup_tables()

        if self.node:
            self._load_data()

    def _create_ui(self):
        """Gibt eine Instanz der konkreten UI-Klasse zurück. Muss überschrieben werden."""
        raise NotImplementedError

    def _setup_tables(self):
        """Konfiguriert die Tabellen."""
        self.ui.xsltParamsTable.setColumnWidth(0, 200)
        self.ui.xsltParamsTable.setColumnWidth(1, 300)
        self.ui.xsltParamsTable.horizontalHeader().setStretchLastSection(True)

        self.ui.parentParamsTable.setColumnWidth(0, 200)
        self.ui.parentParamsTable.setColumnWidth(1, 300)
        self.ui.parentParamsTable.horizontalHeader().setStretchLastSection(True)

    def _load_data(self):
        """Lädt die Daten des Knotens in den Dialog."""
        if not self.node:
            return

        self.ui.bezEdit.setText(str(self.node.bez) if self.node.bez else "")
        self._load_xslt_params()
        self._load_parent_params()

    def _load_xslt_params(self):
        """Lädt die XSLT-Parameter in die Tabelle."""
        if not self.node or not self.node.xslt_params:
            return

        params = self.node.xslt_params
        self.ui.xsltParamsTable.setRowCount(len(params))

        for row, (key, value) in enumerate(params.items()):
            self.ui.xsltParamsTable.setItem(row, 0, QTableWidgetItem(str(key)))
            self.ui.xsltParamsTable.setItem(row, 1, QTableWidgetItem(str(value)))

    def _load_parent_params(self):
        """Lädt die Eltern-Parameter in die Tabelle (nur anzeigen)."""
        if not self.parent_params:
            return

        self.ui.parentParamsTable.setRowCount(len(self.parent_params))

        for row, (key, value) in enumerate(self.parent_params.items()):
            key_item = QTableWidgetItem(str(key))
            key_item.setFlags(key_item.flags() & ~Qt.ItemFlag.ItemIsEditable)
            self.ui.parentParamsTable.setItem(row, 0, key_item)

            value_item = QTableWidgetItem(str(value))
            value_item.setFlags(value_item.flags() & ~Qt.ItemFlag.ItemIsEditable)
            self.ui.parentParamsTable.setItem(row, 1, value_item)

    def add_parameter(self):
        """Fügt einen neuen Parameter hinzu."""
        row_count = self.ui.xsltParamsTable.rowCount()
        self.ui.xsltParamsTable.insertRow(row_count)
        self.ui.xsltParamsTable.setItem(row_count, 0, QTableWidgetItem(""))
        self.ui.xsltParamsTable.setItem(row_count, 1, QTableWidgetItem(""))
        self.ui.xsltParamsTable.setCurrentCell(row_count, 0)

    def remove_parameter(self):
        """Entfernt den ausgewählten Parameter."""
        current_row = self.ui.xsltParamsTable.currentRow()
        if current_row >= 0:
            self.ui.xsltParamsTable.removeRow(current_row)

    def get_data(self):
        """
        Gibt die bearbeiteten Daten zurück.

        Returns:
            dict mit 'bez', 'xslt_params', 'force_transform', oder None bei Validierungsfehler
        """
        bez = self.ui.bezEdit.text().strip()
        if not bez:
            QMessageBox.warning(self, "Warnung", "Bitte geben Sie eine Bezeichnung ein.")
            return None

        xslt_params = {}
        for row in range(self.ui.xsltParamsTable.rowCount()):
            key_item = self.ui.xsltParamsTable.item(row, 0)
            value_item = self.ui.xsltParamsTable.item(row, 1)
            if key_item and value_item:
                key = key_item.text().strip()
                if key:
                    xslt_params[key] = value_item.text().strip()

        return {
            "bez": bez,
            "xslt_params": xslt_params,
            "force_transform": self.ui.alle_xml_transformieren.isChecked(),
        }

    def accept(self):
        """Überschreibt accept() um Datenvalidierung durchzuführen."""
        if self.get_data() is not None:
            super().accept()
