"""
聊天总结消息数据模型

用于存储总结后的历史消息记录
"""
from typing import List, Optional
from pydantic import BaseModel, Field
from datetime import datetime


class SummaryMessage(BaseModel):
    """
    总结消息
    
    保存总结后的文本和元数据
    """
    id: str = Field(..., description="总结消息唯一标识符 (UUID)")
    chatId: str = Field(..., description="关联的聊天 ID")
    
    # 总结内容
    summaryText: str = Field(..., description="总结后的文本内容")
    originalMessageIds: List[str] = Field(default_factory=list, description="被总结的原始消息 ID 列表")
    messageRange: Optional[str] = Field(None, description="消息范围描述，如 '1-10'")
    
    # 元数据
    summaryTimestamp: int = Field(default_factory=lambda: int(datetime.now().timestamp()), description="总结时间戳")
    messageCount: int = Field(..., description="被总结的消息数量")
    includeUserInput: bool = Field(True, description="是否包含用户输入")
    
    # 统计信息
    originalTokenCount: Optional[int] = Field(None, description="原始消息的 token 总数")
    summaryTokenCount: Optional[int] = Field(None, description="总结文本的 token 数")
    
    # 版本控制
    version: int = Field(1, description="总结版本号（用于追溯）")
    
    @classmethod
    def create_summary(
        cls,
        chat_id: str,
        summary_text: str,
        message_ids: List[str],
        include_user_input: bool = True,
        version: int = 1
    ) -> 'SummaryMessage':
        """
        创建总结消息的工厂方法
        
        Args:
            chat_id: 聊天 ID
            summary_text: 总结文本
            message_ids: 被总结的消息 ID 列表
            include_user_input: 是否包含用户输入
            version: 版本号
            
        Returns:
            SummaryMessage 实例
        """
        import uuid
        
        # 生成消息范围描述
        if len(message_ids) > 0:
            message_range = f"{len(message_ids)}条消息"
        else:
            message_range = "无消息"
        
        return cls(
            id=str(uuid.uuid4()),
            chatId=chat_id,
            summaryText=summary_text,
            originalMessageIds=message_ids,
            messageRange=message_range,
            messageCount=len(message_ids),
            includeUserInput=include_user_input,
            version=version
        )
