# =============================================================================
# 企微IT智能服务台 — 待办事项模型
# =============================================================================
# 说明：对应数据库 todo_items 表，存储坐席的待办事项
# 待办类型：ticket(工单)/approval(审批)/device(设备) 等
# =============================================================================

import uuid
from datetime import datetime
from typing import Any, Dict, Optional

from sqlalchemy import Boolean, DateTime, Integer, JSON, String
from sqlalchemy.orm import Mapped, mapped_column

from app.database import Base


class TodoItem(Base):
    """待办事项模型 — 对应 todo_items 表。

    存储坐席需要跟进的各类待办事项，包括工单、审批、设备处理等。

    Attributes:
        id: 待办唯一标识（UUID，数据库自动生成）
        type: 待办类型（ticket/approval/device）
        title: 待办标题
        priority: 优先级（urgent/high/normal）
        description: 详细描述（JSON，存储结构化数据）
        status: 状态（pending/processing/resolved）
        assigned_agent_id: 分配的坐席ID（可为空，表示未分配）
        corp_id: 企业微信企业ID
        created_at: 创建时间
        updated_at: 更新时间
    """

    # 表名
    __tablename__ = "todo_items"

    # --------------------------------------------------------------------------
    # 字段定义
    # --------------------------------------------------------------------------

    # 主键：UUID
    id: Mapped[str] = mapped_column(
        String(36),
        primary_key=True,
        default=lambda: str(uuid.uuid4()),
        comment="待办唯一标识",
    )

    # 待办类型
    type: Mapped[str] = mapped_column(
        String(20),
        nullable=False,
        default="ticket",
        comment="待办类型: ticket/approval/device",
    )

    # 待办标题
    title: Mapped[str] = mapped_column(
        String(256),
        nullable=False,
        default="",
        comment="待办标题",
    )

    # 优先级
    priority: Mapped[str] = mapped_column(
        String(20),
        nullable=False,
        default="normal",
        comment="优先级: urgent/high/normal",
    )

    # 详细描述（JSON 格式，存储结构化数据）
    description: Mapped[Dict[str, Any]] = mapped_column(
        JSON,
        nullable=False,
        default=dict,
        comment="详细描述",
    )

    # 状态
    status: Mapped[str] = mapped_column(
        String(20),
        nullable=False,
        default="pending",
        comment="状态: pending/processing/resolved",
    )

    # 分配的坐席ID（可为空，表示未分配）
    assigned_agent_id: Mapped[Optional[str]] = mapped_column(
        String(64),
        nullable=True,
        comment="分配的坐席ID",
    )

    # 企业微信企业ID
    corp_id: Mapped[str] = mapped_column(
        String(64),
        nullable=False,
        default="",
        comment="企业微信企业ID",
    )

    # 创建时间
    created_at: Mapped[datetime] = mapped_column(
        DateTime(timezone=True),
        nullable=False,
        default=datetime.now,
        comment="创建时间",
    )

    # 更新时间
    updated_at: Mapped[datetime] = mapped_column(
        DateTime(timezone=True),
        nullable=False,
        default=datetime.now,
        onupdate=datetime.now,
        comment="更新时间",
    )

    def __repr__(self) -> str:
        """待办事项对象的字符串表示。"""
        return (
            f"<TodoItem(id={self.id}, type={self.type}, "
            f"title={self.title}, status={self.status})>"
        )
