# -*- coding: utf-8 -*-
"""详情面板：展示所选资产的完整元信息与预览，并提供操作按钮。"""
from __future__ import annotations

import os
from pathlib import Path

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

from .. import thumbnail as thumb_mod
from ..models import Asset, AssetType
from .theme import ACCENT, BG_CARD, BG_INPUT, BG_PANEL, BORDER, FG, FG_DIM, FG_FAINT
from .viewer import AudioPlayer, ImageViewer, TextViewer
from .widgets import type_badge_label

SECTION_QSS = f"color: {FG_FAINT}; font-size: 10px; font-weight: 600; letter-spacing: 1px;"


class DetailPanel(QScrollArea):
    """右侧详情面板。"""

    edit_requested = Signal(int)
    delete_requested = Signal(int)
    open_file = Signal(str)
    open_folder = Signal(str)
    navigate = Signal(int)      # 翻页预览（同系列同类型上下页）

    def __init__(self, thumb_root: Path | None = None, parent=None):
        super().__init__(parent)
        self.setWidgetResizable(True)
        self.setFixedWidth(320)
        self.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
        self.thumb_root = thumb_root

        inner = QWidget()
        inner.setStyleSheet(f"background: {BG_PANEL};")
        root = QVBoxLayout(inner)
        root.setContentsMargins(14, 12, 14, 12)
        root.setSpacing(8)

        # ── 标题 ──
        self.title = QLabel("", inner)
        self.title.setWordWrap(True)
        self.title.setStyleSheet(f"color: {FG}; font-size: 16px; font-weight: 700;")
        root.addWidget(self.title)

        # ── 类型徽章 + 状态 ──
        self.badge_row = QHBoxLayout()
        self.badge_row.setSpacing(6)
        self.status_lbl = QLabel("", inner)
        self.status_lbl.setStyleSheet(f"color: {FG_FAINT}; font-size: 10px;")
        root.addLayout(self.badge_row)

        # ── 预览区（Tab：图片 / 音频 / 文本）──
        self.tabs = QTabWidget()
        self.tabs.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
        self.tabs.setMinimumHeight(180)
        self.tabs.setStyleSheet(f"""
            QTabWidget::pane {{ border: 1px solid {BORDER}; border-radius: 8px; background: {BG_INPUT}; }}
            QTabBar::tab {{
                background: transparent; color: {FG_DIM}; padding: 6px 12px;
                border: none; border-bottom: 2px solid transparent; font-size: 12px;
            }}
            QTabBar::tab:selected {{ color: {FG}; border-bottom: 2px solid {ACCENT}; }}
            QTabBar::tab:hover {{ color: {FG}; }}
        """)
        self.image_view = ImageViewer()
        self.audio_player = AudioPlayer()
        self.text_view = TextViewer()
        self.tabs.addTab(self.image_view, "图片")
        self.tabs.addTab(self.audio_player, "音频")
        self.tabs.addTab(self.text_view, "文本")
        root.addWidget(self.tabs, 1)

        # ── 描述 ──
        self.desc_section = self._section("描述")
        root.addWidget(self.desc_section)
        self.desc = QLabel("—", inner)
        self.desc.setWordWrap(True)
        self.desc.setStyleSheet(f"color: {FG_DIM}; font-size: 12px; padding: 0 2px;")
        root.addWidget(self.desc)

        # ── 标签 ──
        self.tags_section = self._section("标签")
        root.addWidget(self.tags_section)
        self.tags_row = QWidget(inner)
        self.tags_lay = QHBoxLayout(self.tags_row)
        self.tags_lay.setContentsMargins(0, 0, 0, 0)
        root.addWidget(self.tags_row)

        # ── 属性表（只显示有值的行，保持简洁）──
        root.addWidget(self._section("属性"))
        self.props = QFrame(inner)
        self.props.setObjectName("Card")
        self.props.setStyleSheet(
            f"QFrame#Card {{ background: {BG_CARD}; border: 1px solid {BORDER};"
            f" border-radius: 8px; }}"
        )
        self.props_lay = QVBoxLayout(self.props)
        self.props_lay.setContentsMargins(10, 6, 10, 6)
        self.props_lay.setSpacing(2)
        self._prop_rows: dict[str, tuple[QWidget, QLabel]] = {}
        for key in ("系列", "章节", "页序", "文件", "大小", "尺寸", "时长", "创建", "修改"):
            row = QWidget(self.props)
            rl = QHBoxLayout(row)
            rl.setContentsMargins(0, 3, 0, 3)
            rl.setSpacing(8)
            k = QLabel(key, row)
            k.setFixedWidth(30)
            k.setStyleSheet(f"color: {FG_FAINT}; font-size: 11px;")
            v = QLabel("—", row)
            v.setWordWrap(True)
            v.setTextInteractionFlags(Qt.TextInteractionFlag.TextSelectableByMouse)
            v.setStyleSheet(f"color: {FG}; font-size: 11px;")
            rl.addWidget(k)
            rl.addWidget(v, 1)
            self.props_lay.addWidget(row)
            self._prop_rows[key] = (row, v)
        root.addWidget(self.props)

        # ── 操作按钮 ──
        btns = QWidget(inner)
        bl = QVBoxLayout(btns)
        bl.setContentsMargins(0, 2, 0, 0)
        bl.setSpacing(6)

        self.btn_edit = QPushButton("✎  编辑元数据")
        self.btn_edit.setObjectName("Ghost")
        self.btn_edit.clicked.connect(lambda: self.edit_requested.emit(self._asset.id))

        self.btn_open = QPushButton("↗  打开文件")
        self.btn_open.setObjectName("Ghost")
        self.btn_open.clicked.connect(lambda: self.open_file.emit(self._asset.file_path))

        self.btn_folder = QPushButton("📁  显示在文件夹")
        self.btn_folder.setObjectName("Ghost")
        self.btn_folder.clicked.connect(lambda: self.open_folder.emit(
            os.path.dirname(self._asset.file_path)))

        self.btn_delete = QPushButton("🗑  删除资产")
        self.btn_delete.setObjectName("Danger")
        self.btn_delete.clicked.connect(lambda: self.delete_requested.emit(self._asset.id))

        for b in (self.btn_edit, self.btn_open, self.btn_folder):
            bl.addWidget(b)
        self.btn_delete.setMinimumHeight(30)
        bl.addWidget(self.btn_delete)
        root.addWidget(btns)
        root.addStretch(1)

        self.setWidget(inner)
        self._asset = Asset(type=AssetType.COMIC_PAGE)

    def _section(self, text: str) -> QLabel:
        lbl = QLabel(text)
        lbl.setStyleSheet(SECTION_QSS)
        return lbl

    # ------------------------------------------------------------------
    def show_asset(self, asset: Asset | None, series_name: str = "", chapter_label: str = ""):
        """显示一个资产的详情；asset 为 None 时显示空态。"""
        self._asset = asset or Asset(type=AssetType.COMIC_PAGE)
        a = self._asset

        if asset is None:
            self.title.setText("未选择资产")
            self.title.setStyleSheet(f"color: {FG_FAINT}; font-size: 16px;")
            self.desc.setText("—")
            self.desc_section.setVisible(False)
            self.desc.setVisible(False)
            self.tags_section.setVisible(False)
            self.tags_row.setVisible(False)
            self.tabs.setEnabled(False)
            self.btn_edit.setEnabled(False)
            self.btn_open.setEnabled(False)
            self.btn_folder.setEnabled(False)
            self.btn_delete.setEnabled(False)
            self._clear_props()
            return

        self.tabs.setEnabled(True)
        for b in (self.btn_edit, self.btn_delete):
            b.setEnabled(True)
        self.btn_open.setEnabled(bool(a.file_path) and os.path.exists(a.file_path))
        self.btn_folder.setEnabled(bool(a.file_path))

        self.title.setText(a.title or "(无标题)")
        self.title.setStyleSheet(f"color: {FG}; font-size: 16px; font-weight: 700;")

        # 徽章重建（保留 status_lbl，只替换 badge）
        while self.badge_row.count():
            item = self.badge_row.takeAt(0)
            w = item.widget()
            if w is not None and w is not self.status_lbl:
                w.deleteLater()
        self.badge_row.addWidget(type_badge_label(a))
        self.badge_row.addStretch(1)
        self.badge_row.addWidget(self.status_lbl)

        # 描述（无内容时折叠）
        has_desc = bool(a.description)
        self.desc_section.setVisible(has_desc)
        self.desc.setVisible(has_desc)
        self.desc.setText(a.description if has_desc else "—")

        # 标签（无内容时折叠）
        self.tags_section.setVisible(bool(a.tags))
        self.tags_row.setVisible(bool(a.tags))
        self._render_tags(a.tags)

        # 预览
        if a.type == AssetType.AUDIO:
            self.tabs.setCurrentIndex(1)
            self.audio_player.load(a.file_path)
        elif a.is_text:
            self.tabs.setCurrentIndex(2)
            self.text_view.set_text(a.content or a.description)
        else:
            self.tabs.setCurrentIndex(0)
            if a.file_path and os.path.exists(a.file_path):
                self.image_view.show_image(a.file_path)

        # 属性
        info = thumb_mod.describe_file(a.file_path) if a.file_path else {}
        import datetime
        fmt = lambda ts: datetime.datetime.fromtimestamp(ts).strftime("%Y-%m-%d %H:%M")
        self._set_props({
            "系列": series_name or "—",
            "章节": chapter_label or "—",
            "页序": str(a.page_index) if a.page_index is not None else "—",
            "文件": os.path.basename(a.file_path) if a.file_path else "—",
            "大小": info.get("size", "—"),
            "尺寸": info.get("dimensions", "—"),
            "时长": info.get("duration", "—"),
            "创建": fmt(a.created_at),
            "修改": fmt(a.updated_at),
        })
        self.status_lbl.setText(f"ID {a.id}" if a.id else "")

    # ------------------------------------------------------------------
    def _render_tags(self, tags: list[str]):
        while self.tags_lay.count():
            item = self.tags_lay.takeAt(0)
            w = item.widget()
            if w:
                w.deleteLater()
        if not tags:
            lbl = QLabel("—")
            lbl.setStyleSheet(f"color: {FG_FAINT}; font-size: 12px;")
            self.tags_lay.addWidget(lbl)
        else:
            from .widgets import make_tag_chips
            self.tags_lay.addWidget(make_tag_chips(tags))

    def _set_props(self, values: dict[str, str]):
        """设置属性值；空值行自动隐藏以保持简洁，属性表整体为空时隐藏。"""
        any_visible = False
        for key, (row, lbl) in self._prop_rows.items():
            val = values.get(key, "—")
            visible = val != "—"
            lbl.setText(val)
            row.setVisible(visible)
            any_visible = any_visible or visible
        self.props.setVisible(any_visible)

    def _clear_props(self):
        for row, lbl in self._prop_rows.values():
            lbl.setText("—")
            row.setVisible(False)
        self.props.setVisible(False)


