from PySide6 import QtCore, QtWidgets, QtGui

from onionshare_cli.mode_settings import ModeSettings

from . import strings
from .tab import Tab
from .threads import EventHandlerThread
from .gui_common import GuiCommon
from .tor_settings_tab import TorSettingsTab
from .settings_tab import SettingsTab
from .connection_tab import AutoConnectTab


class SettingsParentTab(QtWidgets.QTabWidget):
    """
    The settings tab widget containing the tor settings
    and app settings subtabs
    """

    bring_to_front = QtCore.Signal()
    close_this_tab = QtCore.Signal()

    def __init__(
        self, common, tab_id, parent=None, active_tab="general", from_autoconnect=False
    ):
        super(SettingsParentTab, self).__init__()
        self.parent = parent
        self.common = common
        self.common.log("SettingsParentTab", "__init__")

        # Keep track of tabs in a dictionary that maps tab_id to tab.
        # Each tab has a unique, auto-incremented id (tab_id). This is different than the
        # tab's index, which changes as tabs are re-arranged.
        self.tabs = {
            "general": 0,
            "tor": 1,
        }
        self.tab_id = tab_id
        self.current_tab_id = self.tabs[active_tab]

        # Use a custom tab bar
        tab_bar = TabBar(self.common)
        self.setTabBar(tab_bar)
        settings_tab = SettingsTab(self.common, self.tabs["general"], parent=self)
        self.tor_settings_tab = TorSettingsTab(
            self.common,
            self.tabs["tor"],
            self.parent.are_tabs_active(),
            self.parent.status_bar,
            parent=self,
            from_autoconnect=from_autoconnect,
        )
        self.addTab(settings_tab, strings._("gui_general_settings_window_title"))
        self.addTab(self.tor_settings_tab, strings._("gui_tor_settings_window_title"))

        # Set up the tab widget
        self.setMovable(False)
        self.setTabsClosable(False)
        self.setUsesScrollButtons(False)
        self.setCurrentIndex(self.current_tab_id)


class TabBar(QtWidgets.QTabBar):
    """
    A custom tab bar
    """

    move_new_tab_button = QtCore.Signal()

    def __init__(self, common):
        super(TabBar, self).__init__()
        self.setStyleSheet(common.gui.css["settings_subtab_bar"])
