"""会话状态数据模型。"""

from datetime import datetime
from enum import Enum
from typing import Optional

from pydantic import BaseModel, Field


class SessionMode(str, Enum):
    """会话运行模式。"""

    NATURAL_LANGUAGE = "nl"
    INTERACTIVE = "interactive"


class PtyState(str, Enum):
    """PTY 进程状态。"""

    IDLE = "idle"
    RUNNING = "running"
    BLOCKED = "blocked"
    UNKNOWN = "unknown"


class SessionState(BaseModel):
    """会话状态快照。"""

    session_id: str = Field(..., description="tmux session 名称")
    user_id: str = Field(..., description="QQ 用户 ID")
    mode: SessionMode = Field(default=SessionMode.NATURAL_LANGUAGE, description="当前模式")

    pwd: str = Field(default="", description="当前工作目录")
    env: dict[str, str] = Field(default_factory=dict, description="关键环境变量")
    last_output: str = Field(default="", description="最近终端输出摘要")

    interactive_process: Optional[str] = Field(
        default=None, description="当前交互进程名 (vim, top, etc.)"
    )

    created_at: datetime = Field(default_factory=datetime.utcnow, description="创建时间")
    updated_at: datetime = Field(default_factory=datetime.utcnow, description="更新时间")
    last_active_at: datetime = Field(default_factory=datetime.utcnow, description="最后活跃时间")

    def touch(self) -> None:
        """更新活跃时间。"""
        self.updated_at = datetime.utcnow()
        self.last_active_at = datetime.utcnow()

    def idle_seconds(self) -> int:
        """计算空闲秒数。"""
        delta = datetime.utcnow() - self.last_active_at
        return int(delta.total_seconds())


class MessageContext(BaseModel):
    """消息处理上下文。"""

    message_id: str = Field(..., description="消息唯一 ID")
    user_id: str = Field(..., description="QQ 用户 ID")
    content: str = Field(..., description="消息内容")

    is_command: bool = Field(default=False, description="是否以 / 开头")
    requires_approval: bool = Field(default=False, description="危险命令标记")
    session: Optional[SessionState] = Field(default=None, description="关联的会话状态")


class NapCatEvent(BaseModel):
    """NapCatQQ 事件格式。"""

    time: int = Field(..., description="事件时间戳")
    self_id: int = Field(..., description="机器人 QQ 号")
    post_type: str = Field(..., description="事件类型")
    message_type: str = Field(default="", description="消息类型")
    user_id: int = Field(default=0, description="发送者 ID")
    message: str = Field(default="", description="消息内容")
    raw_message: str = Field(default="", description="原始消息")

    @property
    def is_private_message(self) -> bool:
        """是否是私聊消息。"""
        return self.post_type == "message" and self.message_type == "private"
