# -*- coding: utf-8 -*-
# Copyright: Ankitects Pty Ltd and contributors
# License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
from typing import Any

from aqt import AnkiQt, gui_hooks
from aqt.qt import *
from aqt.utils import TR, shortcut, tr


class DeckChooser(QHBoxLayout):
    def __init__(
        self, mw: AnkiQt, widget: QWidget, label: bool = True, start: Any = None
    ) -> None:
        QHBoxLayout.__init__(self)
        self.widget = widget  # type: ignore
        self.mw = mw
        self.label = label
        self.setContentsMargins(0, 0, 0, 0)
        self.setSpacing(8)
        self.setupDecks()
        self.widget.setLayout(self)
        gui_hooks.current_note_type_did_change.append(self.onModelChangeNew)

    def setupDecks(self) -> None:
        if self.label:
            self.deckLabel = QLabel(tr(TR.DECKS_DECK))
            self.addWidget(self.deckLabel)
        # decks box
        self.deck = QPushButton(clicked=self.onDeckChange)  # type: ignore
        self.deck.setAutoDefault(False)
        self.deck.setToolTip(shortcut(tr(TR.QT_MISC_TARGET_DECK_CTRLANDD)))
        QShortcut(QKeySequence("Ctrl+D"), self.widget, activated=self.onDeckChange)  # type: ignore
        self.addWidget(self.deck)
        # starting label
        if self.mw.col.conf.get("addToCur", True):
            col = self.mw.col
            did = col.conf["curDeck"]
            if col.decks.isDyn(did):
                # if they're reviewing, try default to current card
                c = self.mw.reviewer.card
                if self.mw.state == "review" and c:
                    if not c.odid:
                        did = c.did
                    else:
                        did = c.odid
                else:
                    did = 1
            self.setDeckName(
                self.mw.col.decks.nameOrNone(did) or tr(TR.QT_MISC_DEFAULT)
            )
        else:
            self.setDeckName(
                self.mw.col.decks.nameOrNone(self.mw.col.models.current()["did"])
                or tr(TR.QT_MISC_DEFAULT)
            )
        # layout
        sizePolicy = QSizePolicy(QSizePolicy.Policy(7), QSizePolicy.Policy(0))
        self.deck.setSizePolicy(sizePolicy)

    def show(self) -> None:
        self.widget.show()  # type: ignore

    def hide(self) -> None:
        self.widget.hide()  # type: ignore

    def cleanup(self) -> None:
        gui_hooks.current_note_type_did_change.remove(self.onModelChangeNew)

    def onModelChangeNew(self, unused: Any = None) -> None:
        self.onModelChange()

    def onModelChange(self) -> None:
        if not self.mw.col.conf.get("addToCur", True):
            self.setDeckName(
                self.mw.col.decks.nameOrNone(self.mw.col.models.current()["did"])
                or tr(TR.QT_MISC_DEFAULT)
            )

    def onDeckChange(self) -> None:
        from aqt.studydeck import StudyDeck

        current = self.deckName()
        ret = StudyDeck(
            self.mw,
            current=current,
            accept=tr(TR.ACTIONS_CHOOSE),
            title=tr(TR.QT_MISC_CHOOSE_DECK),
            help="editing",
            cancel=False,
            parent=self.widget,
            geomKey="selectDeck",
        )
        if ret.name:
            self.setDeckName(ret.name)

    def setDeckName(self, name: str) -> None:
        self.deck.setText(name.replace("&", "&&"))
        self._deckName = name

    def deckName(self) -> str:
        return self._deckName

    def selectedId(self) -> int:
        # save deck name
        name = self.deckName()
        if not name.strip():
            did = 1
        else:
            did = self.mw.col.decks.id(name)
        return did
