from PyQt5.QtCore import QSize
from PyQt5.QtWidgets import QMenu, QTabWidget, QWidget, QWidgetAction, QShortcut

from rare.shared import LegendaryCoreSingleton, GlobalSignalsSingleton, ArgumentsSingleton
from rare.components.tabs.account import AccountWidget
from rare.components.tabs.downloads import DownloadsTab
from rare.components.tabs.games import GamesTab
from rare.components.tabs.settings import SettingsTab
from rare.components.tabs.settings.debug import DebugSettings
from rare.components.tabs.shop import Shop
from rare.components.tabs.tab_utils import MainTabBar, TabButtonWidget
from rare.utils.misc import icon


class TabWidget(QTabWidget):
    def __init__(self, parent):
        super(TabWidget, self).__init__(parent=parent)
        self.core = LegendaryCoreSingleton()
        self.signals = GlobalSignalsSingleton()
        self.args = ArgumentsSingleton()
        disabled_tab = 3 if not self.args.offline else 1
        self.setTabBar(MainTabBar(disabled_tab))
        # lk: Figure out why this adds a white line at the top
        # lk: despite setting qproperty-drawBase to 0 in the stylesheet
        # self.setDocumentMode(True)
        # Generate Tabs
        self.games_tab = GamesTab()
        self.addTab(self.games_tab, self.tr("Games"))

        if not self.args.offline:
            # updates = self.games_tab.default_widget.game_list.updates
            self.downloadTab = DownloadsTab(self.games_tab.updates)
            self.addTab(
                self.downloadTab,
                "Downloads"
                + (
                    " (" + str(len(self.games_tab.updates)) + ")"
                    if len(self.games_tab.updates) != 0
                    else ""
                ),
            )
            self.store = Shop(self.core)
            self.addTab(self.store, self.tr("Store (Beta)"))

        self.settings = SettingsTab(self)
        if self.args.debug:
            self.settings.addTab(DebugSettings(), "Debug")

        # Space Tab
        self.addTab(QWidget(), "")
        self.setTabEnabled(disabled_tab, False)
        # Button
        self.account = QWidget()
        self.addTab(self.account, "")
        self.setTabEnabled(disabled_tab + 1, False)

        self.account_widget = AccountWidget()
        account_action = QWidgetAction(self)
        account_action.setDefaultWidget(self.account_widget)
        account_button = TabButtonWidget("mdi.account-circle", "Account", fallback_icon="fa.user")
        account_button.setMenu(QMenu())
        account_button.menu().addAction(account_action)
        self.tabBar().setTabButton(
            disabled_tab + 1, self.tabBar().RightSide, account_button
        )

        self.addTab(self.settings, icon("fa.gear"), "")

        self.settings.about.update_available_ready.connect(
            lambda: self.tabBar().setTabText(5, "(!)")
        )
        # Signals
        # set current index
        self.signals.set_main_tab_index.connect(self.setCurrentIndex)

        # update dl tab text
        self.signals.update_download_tab_text.connect(self.update_dl_tab_text)

        # Open game list on click on Games tab button
        self.tabBarClicked.connect(self.mouse_clicked)
        self.setIconSize(QSize(25, 25))

        # shortcuts
        QShortcut("Alt+1", self).activated.connect(lambda: self.setCurrentIndex(0))
        QShortcut("Alt+2", self).activated.connect(lambda: self.setCurrentIndex(1))
        QShortcut("Alt+3", self).activated.connect(lambda: self.setCurrentIndex(2))
        QShortcut("Alt+4", self).activated.connect(lambda: self.setCurrentIndex(5))

    def update_dl_tab_text(self):
        num_downloads = len(
            set(
                [i.options.app_name for i in self.downloadTab.dl_queue]
                + [i for i in self.downloadTab.update_widgets.keys()]
            )
        )

        if num_downloads != 0:
            self.setTabText(1, f"Downloads ({num_downloads})")
        else:
            self.setTabText(1, "Downloads")

    def mouse_clicked(self, tab_num):
        if tab_num == 0:
            self.games_tab.layout().setCurrentIndex(0)

        if not self.args.offline and tab_num == 2:
            self.store.load()

    def resizeEvent(self, event):
        self.tabBar().setMinimumWidth(self.width())
        super(TabWidget, self).resizeEvent(event)
