# -*- coding: utf-8 -*-
"""侧边栏导航：资产类型 + 系列 + 标签，发出过滤信号。

filter_changed(payload) 的 payload：
  - None                     全部资产
  - AssetType                按类型
  - ("series", series_id)    按系列
  - ("tag", tag_name)        按标签
"""
from __future__ import annotations

from PySide6.QtCore import Qt, Signal
from PySide6.QtWidgets import (
    QButtonGroup, QHBoxLayout, QLabel, QPushButton, QScrollArea, QVBoxLayout,
    QWidget,
)

from ..models import ASSET_TYPES_ORDERED, ASSET_TYPE_META
from .theme import BG_HOVER, BG_PANEL, BG_SELECTED, FG, FG_DIM, FG_FAINT

_NAV_QSS = (
    f"QPushButton {{ text-align: left; padding: 5px 10px; border-radius: 6px;"
    f" border: none; background: transparent; color: {FG_DIM}; font-size: 12.5px;"
    f" min-height: 22px; }}"
    f"QPushButton:hover {{ background: {BG_HOVER}; color: {FG}; }}"
    f"QPushButton:checked {{ background: {BG_SELECTED}; color: white; font-weight: 600; }}"
)

_SUB_NAV_QSS = (
    f"QPushButton {{ text-align: left; padding: 3px 10px; border-radius: 5px;"
    f" border: none; background: transparent; color: {FG_DIM}; font-size: 11.5px;"
    f" min-height: 18px; }}"
    f"QPushButton:hover {{ background: {BG_HOVER}; color: {FG}; }}"
    f"QPushButton:checked {{ background: {BG_SELECTED}; color: white; }}"
)


class Sidebar(QScrollArea):
    """左侧导航栏。"""

    filter_changed = Signal(object)
    new_series_requested = Signal()

    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWidgetResizable(True)
        self.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
        self.setFixedWidth(196)
        self.setStyleSheet(f"QScrollArea {{ border: none; background: {BG_PANEL}; }}")

        inner = QWidget()
        inner.setStyleSheet(f"background: {BG_PANEL};")
        self._group = QButtonGroup(self)
        self._group.setExclusive(True)
        self._series_btns: dict[int, QPushButton] = {}
        self._tag_btns: dict[str, QPushButton] = {}

        root = QVBoxLayout(inner)
        root.setContentsMargins(6, 8, 6, 8)
        root.setSpacing(2)

        # ── 全部资产 ──
        self.btn_all = self._nav_button("📚", "全部资产", None, 0)
        root.addWidget(self.btn_all)

        # ── 资产类型 ──
        root.addWidget(self._section_title("资产类型"))
        for i, t in enumerate(ASSET_TYPES_ORDERED, start=1):
            meta = ASSET_TYPE_META[t]
            root.addWidget(self._nav_button(meta.icon, meta.label, t, i))

        # ── 系列 ──
        root.addWidget(self._header_with_action("系列", self.new_series_requested))
        self._series_container = QVBoxLayout()
        self._series_container.setContentsMargins(4, 0, 4, 4)
        self._series_container.setSpacing(2)
        root.addLayout(self._series_container)

        # ── 标签 ──
        root.addWidget(self._section_title("标签"))
        self._tag_container = QVBoxLayout()
        self._tag_container.setContentsMargins(4, 0, 4, 4)
        self._tag_container.setSpacing(2)
        root.addLayout(self._tag_container)

        root.addStretch(1)

        # ── 底部统计 ──
        self.stats_lbl = QLabel("", inner)
        self.stats_lbl.setStyleSheet(f"color: {FG_FAINT}; font-size: 10px; padding: 4px 12px;")
        self.stats_lbl.setWordWrap(True)
        root.addWidget(self.stats_lbl)

        self.setWidget(inner)
        self.btn_all.setChecked(True)

    # ------------------------------------------------------------------
    def _section_title(self, text: str) -> QLabel:
        lbl = QLabel(text)
        lbl.setStyleSheet(
            f"color: {FG_FAINT}; font-size: 9.5px; font-weight: 600;"
            f" letter-spacing: 1px; padding: 8px 10px 1px 10px;"
        )
        return lbl

    def _header_with_action(self, text: str, signal) -> QWidget:
        w = QWidget()
        lay = QHBoxLayout(w)
        lay.setContentsMargins(10, 6, 10, 0)
        t = QLabel(text)
        t.setStyleSheet(
            f"color: {FG_FAINT}; font-size: 10px; font-weight: 600; letter-spacing: 1px;"
        )
        btn = QPushButton("+")
        btn.setFixedWidth(20)
        btn.setFixedHeight(20)
        btn.setStyleSheet(
            f"background: {BG_HOVER}; color: {FG_DIM}; border-radius: 4px; font-size: 13px; padding: 0;"
        )
        btn.clicked.connect(signal.emit)
        lay.addWidget(t)
        lay.addStretch(1)
        lay.addWidget(btn)
        return w

    def _nav_button(self, icon: str, text: str, payload: object, id_: int) -> QPushButton:
        btn = QPushButton(f"{icon}  {text}")
        btn.setCheckable(True)
        btn.setStyleSheet(_NAV_QSS)
        btn.clicked.connect(lambda _=False, p=payload: self.filter_changed.emit(p))
        self._group.addButton(btn, id_)
        return btn

    # ------------------------------------------------------------------
    # 动态列表
    # ------------------------------------------------------------------
    def set_series(self, series_list):
        self._clear(self._series_container, self._series_btns)
        for s in series_list:
            btn = QPushButton(f"▸  {s.name}")
            btn.setCheckable(True)
            btn.setToolTip(f"{s.name} · {s.status_label}")
            btn.setStyleSheet(_SUB_NAV_QSS)
            sid = s.id

            def _on_click(b=btn, payload=("series", sid)):
                self._clear_check(self._series_btns, b)
                self._group.button(0).setChecked(False)
                self.filter_changed.emit(payload)

            btn.clicked.connect(_on_click)
            self._series_container.addWidget(btn)
            self._series_btns[sid] = btn

    def set_tags(self, tags):
        self._clear(self._tag_container, self._tag_btns)
        for t in tags:
            color = t.color or "#4A90D9"
            btn = QPushButton(f"<span style='color:{color}'>●</span>  {t.name}")
            btn.setCheckable(True)
            btn.setToolTip(t.name)
            btn.setStyleSheet(_SUB_NAV_QSS)
            name = t.name

            def _on_click(b=btn, payload=("tag", name)):
                self._clear_check(self._tag_btns, b)
                self._group.button(0).setChecked(False)
                self.filter_changed.emit(payload)

            btn.clicked.connect(_on_click)
            self._tag_container.addWidget(btn)
            self._tag_btns[name] = btn

    def update_stats(self, stats: dict):
        self.stats_lbl.setText(
            f"📚 {stats.get('series', 0)} 系列 · {stats.get('chapters', 0)} 章节\n"
            f"🗂️ {stats.get('assets', 0)} 资产 · {stats.get('tags', 0)} 标签"
        )

    def clear_selection(self):
        """取消所有选中态（搜索时调用）。"""
        for b in list(self._series_btns.values()) + list(self._tag_btns.values()):
            b.setChecked(False)

    # ------------------------------------------------------------------
    @staticmethod
    def _clear_check(btns: dict, keep: QPushButton):
        for b in btns.values():
            if b is not keep:
                b.setChecked(False)

    @staticmethod
    def _clear(layout, btns: dict):
        while layout.count():
            item = layout.takeAt(0)
            w = item.widget()
            if w is not None:
                w.deleteLater()
        btns.clear()
