"""
AgentActivity ─ 庫柏(Agent)所有「動作」的歷史紀錄(階段 7)。

每次 Agent 做事都寫一筆,讓:
  1. UI 可以渲染「庫柏動態」面板
  2. 你可以看 token 用量 / Anthropic 花費
  3. 出問題時有 audit trail
  4. 自動派任務的 dry-run 結果直接塞這裡(activity_type='task_extract' 加 metadata 結果)

設計重點:
  - 不是訊息,不上 RAG;就是動作 log
  - 寫入失敗不可影響主流程(any failure → 吞掉,不 raise)
  - 保留 90 天即可(超過自動清,給後面 cron 做)
"""

from datetime import datetime
from uuid import UUID, uuid4

from sqlalchemy import JSON, DateTime, Float, ForeignKey, Integer, String, Text, Uuid
from sqlalchemy.orm import Mapped, mapped_column

from app.database import Base
from app.models.user import TimestampMixin


# 標準動作類型(UI 用這幾個 group 計數)
ACTIVITY_TYPES = (
    "line_response",      # 庫柏在 LINE 回應
    "auto_tag",           # 自動分類訊息
    "rag_index",          # 索引到 Qdrant(可選 log,量大可關)
    "task_extract",       # 自動派任務偵測(dry-run / live)
    "task_create_auto",   # 真的建出來的自動任務
    "task_cancel",        # 任務取消(用戶下令)
    "brief_generated",    # 每日簡報產出
    "binding_redeemed",   # LINE 綁定成功
)


class AgentActivity(Base, TimestampMixin):
    """庫柏每次動作的 log。"""

    __tablename__ = "agent_activities"

    id: Mapped[UUID] = mapped_column(Uuid(as_uuid=True), primary_key=True, default=uuid4)

    # 動作類型(限定 ACTIVITY_TYPES,但 DB 不強制 enum,給未來擴充彈性)
    activity_type: Mapped[str] = mapped_column(String(40), nullable=False, index=True)

    # 對應到的 user(如果動作有「為誰做」的對象)
    user_id: Mapped[UUID | None] = mapped_column(
        Uuid(as_uuid=True),
        ForeignKey("users.id", ondelete="SET NULL"),
        nullable=True,
        index=True,
    )

    # 摘要(人類看得懂的一句話)
    # 例:「在 LINE 群回 Robert 的問題」、「偵測到派工:阿綠 / 客戶 A 提案」
    summary: Mapped[str] = mapped_column(Text, nullable=False)

    # 結果是否成功
    success: Mapped[bool] = mapped_column(default=True, nullable=False)

    # 結構化 metadata(extractor 結果、token 用量、模型等)
    extra: Mapped[dict | None] = mapped_column(JSON, nullable=True)

    # cost 用 USD,精度到小數第 6 位(0.0001 級可顯示)
    cost_usd: Mapped[float | None] = mapped_column(Float, nullable=True)

    # 耗時(毫秒),沒紀錄就 NULL
    duration_ms: Mapped[int | None] = mapped_column(Integer, nullable=True)

    def __repr__(self) -> str:
        return f"<AgentActivity {self.activity_type} {self.created_at} success={self.success}>"
