"""
Определения моделей данных (pydantic) для представления состояния агента LangGraph.
Включают схему для отслеживания хода выполнения диалога и визуализации графа.
"""

from typing import Dict, Any, List, Optional
from langchain_core.pydantic_v1 import BaseModel, Field


# Определяем состояние нашего агента (LangGraph)
class AgentState(BaseModel):
    """Состояние графа агента."""
    input: str = Field(description="Исходный запрос пользователя.")
    command: Optional[str] = Field(None,
                                   description="Распознанная слеш-команда.")
    command_args: List[str] = Field([], description="Аргументы команды.")
    llm_response: Optional[str] = Field(None, description="Ответ от LLM.")
    image_urls: List[str] = Field(
        [], description="URL сгенерированных изображений.")
    analysis_result: Optional[str] = Field(
        None, description="Результат анализа изображения.")
    subtitles: Optional[str] = Field(None, description="Полученные субтитры.")
    summarized_history_text: Optional[str] = Field(
        None, description="Суммированная история.")
    error: Optional[str] = Field(None, description="Сообщение об ошибке.")
    # Для визуализации графа (имитация узлов и ребер)
    graph_nodes: List[Dict[str, Any]] = Field(
        [], description="Узлы для визуализации графа.")
    graph_edges: List[Dict[str, Any]] = Field(
        [], description="Ребра для визуализации графа.")
    current_node_id: str = Field(
        "start", description="ID текущего узла графа для фронтенда.")
    parent_node_id: Optional[str] = Field(None,
                                          description="ID родительского узла.")
    # Временное хранилище для chat_history, которое не сохраняется в БД
    # Оно используется для передачи контекста между узлами в пределах одного выполнения
    temporary_chat_history: List[Dict[str, Any]] = Field(
        [], description="Временная история чата, не сохраняемая в БД.")
    system_prompt: Optional[str] = Field(None,
                                   description="Системный промпт.")
    selected_model: str = Field(None, description="Модель llm.")