"""
ObsoleteEntriesDialog — Dialog zur Bestätigung des Entfernens veralteter Projekteinträge.

Zeigt XslFile-Einträge an, die nicht mehr in der Datenbank vorhanden sind,
und lässt den Benutzer entscheiden ob sie entfernt werden sollen.
"""

import logging
from PySide6.QtCore import Qt
from PySide6.QtWidgets import (
    QCheckBox,
    QDialog,
    QDialogButtonBox,
    QLabel,
    QSizePolicy,
    QTreeWidget,
    QTreeWidgetItem,
    QVBoxLayout,
)

from obsolete_detector import ObsoleteGroup

logger = logging.getLogger(__name__)


class ObsoleteEntriesDialog(QDialog):
    """
    Dialog zur Anzeige und Bestätigung veralteter Einträge nach einem DB-Import.

    Zeigt die veralteten XslFile-Einträge gruppiert nach ihrer Baumhierarchie an.
    Der Benutzer kann entscheiden ob die Einträge entfernt und ob nicht mehr
    verwendete XML-Dateien physisch gelöscht werden sollen.
    """

    def __init__(self, parent, obsolete_groups: list[ObsoleteGroup]):
        """
        Args:
            parent: Eltern-Widget
            obsolete_groups: Veraltete Einträge gruppiert nach Hierarchiepfad
        """
        super().__init__(parent)
        self._obsolete_groups = obsolete_groups
        self._setup_ui()
        self._populate_tree()

    def _setup_ui(self) -> None:
        """Erstellt die UI-Elemente des Dialogs."""
        total_count = sum(len(g.xsl_entries) for g in self._obsolete_groups)

        self.setWindowTitle("Veraltete Einträge gefunden")
        self.resize(640, 420)
        self.setSizeGripEnabled(True)

        layout = QVBoxLayout(self)
        layout.setSpacing(10)

        # Erklärungstext
        info_label = QLabel(
            f"<b>{total_count} XSL-Datei(en)</b> sind nicht mehr in der Datenbank vorhanden "
            f"und können aus dem Projekt entfernt werden."
        )
        info_label.setWordWrap(True)
        layout.addWidget(info_label)

        # Baumansicht der veralteten Einträge
        self._tree = QTreeWidget()
        self._tree.setColumnCount(3)
        self._tree.setHeaderLabels(["Bezeichnung", "XSL-Datei", "XML-Dateien"])
        self._tree.setColumnWidth(0, 280)
        self._tree.setColumnWidth(1, 200)
        self._tree.setColumnWidth(2, 80)
        self._tree.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
        self._tree.setAlternatingRowColors(True)
        self._tree.setEditTriggers(QTreeWidget.EditTrigger.NoEditTriggers)
        layout.addWidget(self._tree)

        # Checkbox für physische XML-Löschung
        self._delete_xml_checkbox = QCheckBox("Nicht mehr verwendete XML-Dateien physisch löschen")
        self._delete_xml_checkbox.setChecked(False)
        layout.addWidget(self._delete_xml_checkbox)

        # Dialog-Buttons
        self._button_box = QDialogButtonBox()
        remove_button = self._button_box.addButton(
            "Veraltete Einträge entfernen", QDialogButtonBox.ButtonRole.AcceptRole
        )
        remove_button.setToolTip("Entfernt alle aufgelisteten Einträge aus dem Projekt")
        self._button_box.addButton(QDialogButtonBox.StandardButton.Cancel)
        self._button_box.accepted.connect(self.accept)
        self._button_box.rejected.connect(self.reject)
        layout.addWidget(self._button_box)

    def _populate_tree(self) -> None:
        """Befüllt den QTreeWidget mit den veralteten Einträgen."""
        self._tree.clear()

        for group in self._obsolete_groups:
            # Hierarchiepfad als verschachtelte Items aufbauen
            parent_item = self._tree.invisibleRootItem()
            for path_part in group.node_path:
                # Prüfe ob dieser Pfadteil bereits als Kind vorhanden ist
                existing = None
                for i in range(parent_item.childCount()):
                    child = parent_item.child(i)
                    if child.text(0) == path_part and not child.data(0, Qt.ItemDataRole.UserRole):
                        existing = child
                        break
                if existing:
                    parent_item = existing
                else:
                    node_item = QTreeWidgetItem(parent_item, [path_part])
                    font = node_item.font(0)
                    font.setBold(True)
                    node_item.setFont(0, font)
                    parent_item = node_item

            # XslFile-Einträge unter dem Hierarchiepfad
            for entry in group.xsl_entries:
                xsl = entry.xsl_file
                xml_count = str(len(xsl.xmls)) if xsl.xmls else "0"
                xsl_item = QTreeWidgetItem(
                    parent_item,
                    [xsl.bez, xsl.xsl_file.name, xml_count],
                )
                xsl_item.setData(0, Qt.ItemDataRole.UserRole, xsl)
                xsl_item.setToolTip(1, str(xsl.xsl_file))

        self._tree.expandAll()

    def delete_xml_files(self) -> bool:
        """
        Gibt zurück ob der Benutzer die physische Löschung der XML-Dateien gewünscht hat.

        Returns:
            True wenn die Checkbox aktiviert ist
        """
        return self._delete_xml_checkbox.isChecked()
