# backend/src/models/agent.py
# #region Models.Agent [C:2] [TYPE Module] [SEMANTICS agent,model,database]
# @BRIEF SQLAlchemy models for Gradio Agent Chat conversations.

import uuid

from sqlalchemy import JSON, Boolean, Column, DateTime, ForeignKey, String, Text
from sqlalchemy.orm import relationship

from .mapping import Base


def _uuid() -> str:
    return str(uuid.uuid4())


# #region Models.Agent.AgentConversation [C:2] [TYPE Class] [SEMANTICS agent,conversation,model]
# @ingroup Models
# @BRIEF A multi-turn agent chat conversation. Soft-delete via is_archived.
# @RELATION DEPENDS_ON -> [Models.User]

class AgentConversation(Base):
    __tablename__ = "agent_conversations"

    id = Column(String, primary_key=True, default=_uuid)
    user_id = Column(String, nullable=False, index=True)
    title = Column(String(256), nullable=False, server_default="New Conversation")
    is_archived = Column(Boolean, default=False, server_default="false")
    created_at = Column(DateTime, server_default="now()")
    updated_at = Column(DateTime, server_default="now()", onupdate="now()")

    messages = relationship(
        "AgentMessage",
        back_populates="conversation",
        cascade="all, delete-orphan",
        order_by="AgentMessage.created_at",
    )
# #endregion Models.Agent.AgentConversation


# #region Models.Agent.AgentMessage [C:2] [TYPE Class] [SEMANTICS agent,message,model]
# @ingroup Models
# @BRIEF A single message in an agent conversation.
# @RELATION DEPENDS_ON -> [Models.Agent.AgentConversation]

class AgentMessage(Base):
    __tablename__ = "agent_messages"

    id = Column(String, primary_key=True, default=_uuid)
    conversation_id = Column(String, ForeignKey("agent_conversations.id"), nullable=False, index=True)
    role = Column(String(16), nullable=False)  # user | assistant | tool | system
    text = Column(Text, nullable=True)
    state = Column(String(32), nullable=True)
    tool_calls = Column(JSON, nullable=True)  # [{tool, input, output, error, status}]
    attachments = Column(JSON, nullable=True)  # [{name, type, size, extracted_text}]
    created_at = Column(DateTime, server_default="now()")

    conversation = relationship("AgentConversation", back_populates="messages")
# #endregion Models.Agent.AgentMessage
# #endregion Models.Agent
