# -*- coding: utf-8 -*-

# Copyright (c) 2012 - 2024 Detlev Offenbach <detlev@die-offenbachs.de>
#

"""
Module implementing a dialog to list the configured IRC networks.
"""

from PyQt6.QtCore import pyqtSlot
from PyQt6.QtWidgets import QDialog, QTreeWidgetItem

from eric7.EricWidgets import EricMessageBox

from .Ui_IrcNetworkListDialog import Ui_IrcNetworkListDialog


class IrcNetworkListDialog(QDialog, Ui_IrcNetworkListDialog):
    """
    Class implementing a dialog to list the configured IRC networks.
    """

    def __init__(self, manager, parent=None):
        """
        Constructor

        @param manager reference to the IRC network manager
        @type IrcNetworkManager
        @param parent reference to the parent widget
        @type QWidget
        """
        super().__init__(parent)
        self.setupUi(self)

        self.__manager = manager

        self.__refreshNetworksList()

    def __resizeColumns(self):
        """
        Private slot to resize all columns to their contents.
        """
        for col in range(self.networksList.columnCount()):
            self.networksList.resizeColumnToContents(col)

    def __checkButtons(self):
        """
        Private slot to set the enabled state of the buttons.
        """
        enable = True
        selectedItems = self.networksList.selectedItems()
        if len(selectedItems) == 0:
            enable = False
        else:
            for itm in selectedItems:
                enable &= itm.parent() is None

        self.editButton.setEnabled(enable)
        self.deleteButton.setEnabled(enable)
        self.autoConnectButton.setEnabled(enable)

        if enable:
            itm = self.networksList.selectedItems()[0]
            check = self.__manager.getNetwork(itm.text(0)).autoConnect()
            self.autoConnectButton.setChecked(check)

    def __refreshNetworkEntry(self, itm):
        """
        Private method to (re-)set the data of a network entry.

        @param itm reference to the network entry
        @type QTreeWidgetItem
        """
        from .IrcNetworkManager import IrcIdentity

        # step 1: delete all child entries
        children = itm.takeChildren()
        for child in children:
            del child

        # step 2: (re-)add the child entries
        networkName = itm.text(0)
        network = self.__manager.getNetwork(networkName)
        server = network.getServer()
        identityName = network.getIdentityName()
        if identityName == IrcIdentity.DefaultIdentityName:
            identityName = IrcIdentity.DefaultIdentityDisplay
        autoConnect = self.tr("Yes") if network.autoConnect() else self.tr("No")

        QTreeWidgetItem(itm, [self.tr("Identity"), identityName])
        QTreeWidgetItem(
            itm,
            [self.tr("Server"), "{0}:{1}".format(server.getName(), server.getPort())],
        )
        QTreeWidgetItem(
            itm, [self.tr("Channels"), ", ".join(network.getChannelNames())]
        )
        QTreeWidgetItem(itm, [self.tr("Auto-Connect"), autoConnect])

        self.__resizeColumns()

    def __refreshNetworksList(self):
        """
        Private method to refresh the complete networks list.
        """
        self.networksList.clear()

        networkNames = self.__manager.getNetworkNames()
        for networkName in networkNames:
            topitm = QTreeWidgetItem(self.networksList, [networkName])
            self.__refreshNetworkEntry(topitm)
            topitm.setExpanded(True)
        self.__resizeColumns()

        self.__checkButtons()

    @pyqtSlot()
    def on_networksList_itemSelectionChanged(self):
        """
        Private slot to handle changes of the selection of networks.
        """
        self.__checkButtons()

    @pyqtSlot()
    def on_newButton_clicked(self):
        """
        Private slot to add a new network entry.
        """
        from .IrcNetworkEditDialog import IrcNetworkEditDialog

        dlg = IrcNetworkEditDialog(self.__manager, "", self)
        if dlg.exec() == QDialog.DialogCode.Accepted:
            network = dlg.getNetwork()
            self.__manager.addNetwork(network)
            self.__refreshNetworksList()

    @pyqtSlot()
    def on_editButton_clicked(self):
        """
        Private slot to edit the selected network.
        """
        from .IrcNetworkEditDialog import IrcNetworkEditDialog

        itm = self.networksList.selectedItems()[0]
        if itm:
            networkName = itm.text(0)
            dlg = IrcNetworkEditDialog(self.__manager, networkName, self)
            if dlg.exec() == QDialog.DialogCode.Accepted:
                network = dlg.getNetwork()
                self.__manager.setNetwork(network, networkName)
                if network.getName() != networkName:
                    itm.setText(0, network.getName())
                self.__refreshNetworkEntry(itm)

    @pyqtSlot()
    def on_deleteButton_clicked(self):
        """
        Private slot to delete the selected entry.
        """
        itm = self.networksList.selectedItems()[0]
        if itm.parent() is None:
            networkName = itm.text(0)
            res = EricMessageBox.yesNo(
                self,
                self.tr("Delete Irc Network"),
                self.tr(
                    """Do you really want to delete IRC network <b>{0}</b>?"""
                ).format(networkName),
            )
            if res:
                index = self.networksList.indexOfTopLevelItem(itm)
                self.networksList.takeTopLevelItem(index)
                del itm

                self.__manager.deleteNetwork(networkName)

    @pyqtSlot(QTreeWidgetItem)
    def on_networksList_itemExpanded(self, item):
        """
        Private slot handling the expansion of a top level item.

        @param item reference to the expanded item
        @type QTreeWidgetItem
        """
        self.__resizeColumns()

    @pyqtSlot(QTreeWidgetItem)
    def on_networksList_itemCollapsed(self, item):
        """
        Private slot handling the collapse of a top level item.

        @param item reference to the collapsed item
        @type QTreeWidgetItem
        """
        self.__resizeColumns()

    @pyqtSlot(bool)
    def on_autoConnectButton_clicked(self, checked):
        """
        Private slot handling the auto-connect selection.

        @param checked flag indicating the state of the button
        @type bool
        """
        itm = self.networksList.selectedItems()[0]
        if itm.parent() is None:
            networkName = itm.text(0)
            if checked:
                # enable the selected network, disable all others
                # step 1: update network objects
                for name in self.__manager.getNetworkNames():
                    network = self.__manager.getNetwork(networkName)
                    if name == networkName:
                        network.setAutoConnect(True)
                    else:
                        network.setAutoConnect(False)
                    self.__manager.networkChanged()

                # step 2: update list entries
                for index in range(self.networksList.topLevelItemCount()):
                    titm = self.networksList.topLevelItem(index)
                    if titm.text(0) == networkName:
                        self.__setAutoConnectEntry(titm, True)
                    else:
                        self.__setAutoConnectEntry(titm, False)
            else:
                # step 1: update network object
                network = self.__manager.getNetwork(networkName)
                network.setAutoConnect(False)
                self.__manager.networkChanged()

                # step 2: update list entry
                self.__setAutoConnectEntry(itm, False)

    def __setAutoConnectEntry(self, itm, on):
        """
        Private method to set the auto-connect entry of a network item.

        @param itm reference to the network item
        @type QTreeWidgetItem
        @param on flag indicating the auto-connect state
        @type bool
        """
        autoConnect = self.tr("Yes") if on else self.tr("No")
        for index in range(itm.childCount()):
            citm = itm.child(index)
            if citm.text(0) == self.tr("Auto-Connect"):
                citm.setText(1, autoConnect)

    @pyqtSlot()
    def on_editIdentitiesButton_clicked(self):
        """
        Private slot to edit the identities.
        """
        from .IrcIdentitiesEditDialog import IrcIdentitiesEditDialog

        dlg = IrcIdentitiesEditDialog(self.__manager, "", self)
        dlg.exec()

        selectedNetwork = self.networksList.selectedItems()
        selectedNetworkName = selectedNetwork[0].text(0) if selectedNetwork else ""
        self.__refreshNetworksList()
        if selectedNetworkName:
            for index in range(self.networksList.topLevelItemCount()):
                itm = self.networksList.topLevelItem(index)
                if itm.text(0) == selectedNetworkName:
                    itm.setSelected(True)
                    break
