from PyQt5.QtWidgets import QComboBox, QListWidget, QListWidgetItem, QMenu, QWidgetAction, QAction
from PyQt5.QtCore import Qt, pyqtSignal

class CustomComboBox(QComboBox):
    optionChanged = pyqtSignal(list, str, bool)

    def __init__(self, parent=None):
        super().__init__(parent)
        self.setEditable(False)
        self.selected_options = []
        self.options = []
        self.placeholder = "🔍 Sélectionnez un livrable"  # Texte par défaut
        self.addItem(self.placeholder)  # Ajoute le placeholder en premier
        self.setCurrentIndex(0)  # Sélectionne l'index 0

        self.menu = QMenu()
        self.list_widget = QListWidget()

        # Ajouter les actions pour tout sélectionner et tout désélectionner
        self.select_all_action = QAction("Tout sélectionner", self)
        self.deselect_all_action = QAction("Tout désélectionner", self)

        self.select_all_action.triggered.connect(self.selectAll)
        self.deselect_all_action.triggered.connect(self.deselectAll)

        self.menu.addAction(self.select_all_action)
        self.menu.addAction(self.deselect_all_action)

        for option in self.options:
            item = QListWidgetItem(option)
            item.setFlags(item.flags() | Qt.ItemIsUserCheckable)
            item.setCheckState(Qt.Unchecked)
            self.list_widget.addItem(item)

        self.list_widget.itemChanged.connect(self.updateSelection)
        action = QWidgetAction(self.menu)
        action.setDefaultWidget(self.list_widget)
        self.menu.addAction(action)

        self.setContextMenuPolicy(Qt.CustomContextMenu)
        self.customContextMenuRequested.connect(self.showMenu)
        self.mousePressEvent = self.showMenu

    def showMenu(self, event=None):
        self.menu.exec_(self.mapToGlobal(self.rect().bottomLeft()))

    def updateSelection(self, item):
        checked = item.checkState() == Qt.Checked
        option_text = item.text()

        if checked and option_text not in self.selected_options:
            self.selected_options.append(option_text)
        elif not checked and option_text in self.selected_options:
            self.selected_options.remove(option_text)

        self.setCurrentText(", ".join(self.selected_options))
        self.optionChanged.emit(self.selected_options, option_text, checked)

    def resetOptions(self, new_options):
        """Réinitialise les options de la ComboBox."""
        self.options = new_options  # Mettre à jour les options
        self.addItem(self.placeholder)  # Réajoute le placeholder
        self.selected_options = []  # Réinitialiser la sélection
        
        # Effacer toutes les options existantes
        self.list_widget.clear()

        # Ajouter les nouvelles options
        for option in self.options:
            item = QListWidgetItem(option)
            item.setFlags(item.flags() | Qt.ItemIsUserCheckable)
            item.setCheckState(Qt.Checked)  # Cocher les options par défaut
            self.list_widget.addItem(item)

            # Ajouter l'option à la sélection par défaut
            self.selected_options.append(option)

    def selectAll(self):
        """Sélectionner toutes les options."""
        for row in range(self.list_widget.count()):
            item = self.list_widget.item(row)
            item.setCheckState(Qt.Checked)
            option_text = item.text()
            if option_text not in self.selected_options:
                self.selected_options.append(option_text)
        
        self.setCurrentText(", ".join(self.selected_options))
        self.optionChanged.emit(self.selected_options, "Tout sélectionner", True)

    def deselectAll(self):
        """Désélectionner toutes les options."""
        for row in range(self.list_widget.count()):
            item = self.list_widget.item(row)
            item.setCheckState(Qt.Unchecked)
            option_text = item.text()
            if option_text in self.selected_options:
                self.selected_options.remove(option_text)

        self.setCurrentText(", ".join(self.selected_options))
        self.optionChanged.emit(self.selected_options, "Tout désélectionner", False)
