# -*- coding: utf-8 -*-
"""列表视图：表格形式展示资产（适合批量核对、排序）。"""
from __future__ import annotations

from pathlib import Path

from PySide6.QtCore import Qt, Signal
from PySide6.QtGui import QColor, QPixmap
from PySide6.QtWidgets import (
    QAbstractItemView,
    QHeaderView,
    QScrollArea,
    QTableWidget,
    QTableWidgetItem,
    QVBoxLayout,
    QWidget,
)

from .. import thumbnail as thumb_mod
from ..models import Asset
from .theme import ACCENT, BG, BG_INPUT, BORDER, BORDER_LIGHT, FG, FG_DIM, FG_FAINT

COLUMNS = ["缩略", "标题", "类型", "系列", "章节", "页序", "标签", "更新时间"]


def _fmt_ts(ts: float) -> str:
    import datetime
    return datetime.datetime.fromtimestamp(ts).strftime("%m-%d %H:%M")


class ListView(QScrollArea):
    """表格视图。"""

    asset_selected = Signal(int)
    asset_double_clicked = Signal(int)

    def __init__(self, thumb_root: Path | None = None, parent=None):
        super().__init__(parent)
        self.setWidgetResizable(True)
        self.thumb_root = thumb_root

        wrap = QWidget()
        lay = QVBoxLayout(wrap)
        lay.setContentsMargins(0, 0, 0, 0)

        self.table = QTableWidget(0, len(COLUMNS))
        self.table.setHorizontalHeaderLabels(COLUMNS)
        self.table.verticalHeader().setVisible(False)
        self.table.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows)
        self.table.setSelectionMode(QAbstractItemView.SelectionMode.SingleSelection)
        self.table.setEditTriggers(QAbstractItemView.EditTrigger.NoEditTriggers)
        self.table.setAlternatingRowColors(True)
        self.table.setShowGrid(False)
        self.table.setWordWrap(False)

        hh = self.table.horizontalHeader()
        hh.setSectionResizeMode(QHeaderView.ResizeMode.ResizeToContents)
        hh.setSectionResizeMode(1, QHeaderView.ResizeMode.Stretch)  # 标题列伸展

        self.table.setStyleSheet(f"""
            QTableWidget {{
                background: {BG}; border: none;
                gridline-color: {BORDER};
                alternate-background-color: {BG_INPUT};
            }}
            QTableWidget::item {{ padding: 4px 8px; border: none; color: {FG}; }}
            QTableWidget::item:selected {{ background: {ACCENT}33; color: {FG}; }}
            QTableWidget::item:hover {{ background: {BG_INPUT}; }}
            QHeaderView::section {{
                background: transparent; color: {FG_DIM}; border: none;
                border-bottom: 1px solid {BORDER_LIGHT};
                padding: 6px 8px; font-weight: 600; font-size: 11px;
            }}
        """)
        self.table.itemSelectionChanged.connect(self._on_selection)
        self.table.doubleClicked.connect(lambda _idx: self.asset_double_clicked.emit(self._row_asset_id(_idx.row())))

        lay.addWidget(self.table)
        self.setWidget(wrap)
        self._ids: list[int] = []

    # ------------------------------------------------------------------
    def set_assets(self, assets: list[Asset], series_map: dict[int, str],
                   chapter_map: dict[int, str]):
        self.table.setRowCount(0)
        self._ids = []
        for i, a in enumerate(assets):
            self.table.insertRow(i)
            self._ids.append(a.id)

            # 缩略图
            pix_item = QTableWidgetItem()
            pix_item.setTextAlignment(Qt.AlignmentFlag.AlignCenter)
            self._set_cell_icon(pix_item, a)
            self.table.setItem(i, 0, pix_item)

            # 标题
            title_item = QTableWidgetItem(a.title or "(无标题)")
            title_item.setToolTip(a.description or "")
            title_item.setForeground(QColor("#E6E8EB"))
            self.table.setItem(i, 1, title_item)

            # 类型
            meta = a.type_meta
            type_item = QTableWidgetItem(f"{meta.icon} {meta.label}")
            type_item.setForeground(QColor(meta.color))
            self.table.setItem(i, 2, type_item)

            # 系列 / 章节
            self.table.setItem(i, 3, QTableWidgetItem(series_map.get(a.series_id, "—")))
            self.table.setItem(i, 4, QTableWidgetItem(chapter_map.get(a.chapter_id, "—")))

            # 页序
            self.table.setItem(i, 5, QTableWidgetItem(
                str(a.page_index) if a.page_index is not None else "—"))

            # 标签
            tag_item = QTableWidgetItem(" ".join(f"#{t}" for t in a.tags) if a.tags else "—")
            tag_item.setForeground(QColor(FG_DIM))
            self.table.setItem(i, 6, tag_item)

            # 时间
            time_item = QTableWidgetItem(_fmt_ts(a.updated_at))
            time_item.setForeground(QColor(FG_FAINT))
            self.table.setItem(i, 7, time_item)

        self.table.resizeColumnsToContents()
        self.table.setRowHeight(0, 44)
        self.table.horizontalHeader().setSectionResizeMode(1, QHeaderView.ResizeMode.Stretch)

    def _set_cell_icon(self, item: QTableWidgetItem, asset: Asset):
        icon_lbl = QPixmap()
        path = thumb_mod.thumb_path(asset.id, self.thumb_root) if self.thumb_root else None
        if path and path.exists():
            icon_lbl = QPixmap(str(path))
        if not icon_lbl.isNull():
            item.setData(Qt.ItemDataRole.DecorationRole,
                         icon_lbl.scaled(28, 28, Qt.AspectRatioMode.KeepAspectRatio,
                                         Qt.TransformationMode.SmoothTransformation))
            item.setText("")
        else:
            item.setText(asset.type_meta.icon)
            item.setForeground(QColor(asset.type_meta.color))

    def _row_asset_id(self, row: int) -> int:
        return self._ids[row] if 0 <= row < len(self._ids) else -1

    def _on_selection(self):
        rows = self.table.selectionModel().selectedRows()
        if rows:
            self.asset_selected.emit(self._row_asset_id(rows[0].row()))

    def highlight(self, asset_id: int | None):
        for r, aid in enumerate(self._ids):
            if aid == asset_id:
                self.table.selectRow(r)
                break

    def clear(self):
        self.table.setRowCount(0)
        self._ids = []
