from typing import List, Dict, Any, Optional
import json
import logging
from agents.base_agent import BaseAgent, AgentState, AgentResponse

logger = logging.getLogger(__name__)

class ButtonSuggesterAgent(BaseAgent):
    """
    Agent responsible for suggesting the next possible user replies as buttons.
    """
    
    PREDEFINED_BUTTONS = [
        "объясни",
        "приведи пример",
        "краткий итог",
        "составь конспект",
        "продолжай объяснение"
    ]

    def __init__(self, history_limit: int = 5):
        system_prompt = (
            "Предложи до 3 кнопок из списка ниже, которые лучше всего подходят к ответу на последнее сообщение."
            f"Список кнопок: {', '.join(self.PREDEFINED_BUTTONS)}."
            "Если последнее сообщение содержит в конце фразы продолжаем? или идём дальше? или продолжать объяснять следующий пункт? - верни кнопку продолжить объяснение."
            "Если последнее сообщение никак не относиться к учебе (например приветствие, прощание, не по теме, etc.) - верни пустой список."
            "Если подходящих кнопок нет, верни пустой список."
            "Верни ответ строго в формате JSON: {\"suggestions\": [\"кнопка1\", ...]}"
        )
        super().__init__(
            name="ButtonSuggester",
            system_prompt=system_prompt,
            mode=0, # Chat mode
            history_limit=history_limit
        )

    def _get_tools(self) -> List:
        return []

    def _process_function_call(self, function_call, state: AgentState) -> Any:
        return None

    def suggest_buttons(self, last_message: str, state: AgentState) -> List[str]:
        """
        Suggest buttons based on the last model response.
        """
        try:
            # Получаем API ключи и провайдера из настроек, но модель задаем жестко
            self._ensure_model(state)
            target_model = "gemini-2.5-flash-lite"
            
            # Единая лаконичная инструкция
            instruction = self.system_prompt

            if self.provider == "gemini_client":
                from google.genai import types
                config = types.GenerateContentConfig(
                    system_instruction=instruction,
                    temperature=0.1,
                    response_mime_type="application/json",
                    thinking_config=types.ThinkingConfig(thinking_budget=0)
                )
                
                logger.info(f"ButtonSuggester: using Gemini model {self.model_name}")
                response = self.client.models.generate_content(
                    model=self.model_name,
                    contents=f"Последний ответ модели: {last_message}",
                    config=config
                )
                response_text = response.text
                
            elif self.provider in ["openai_client", "openrouter_client", "deepseek_client"]:
                logger.info(f"ButtonSuggester: using OpenAI-compatible model {self.model_name}")
                response = self.client.chat.completions.create(
                    model=self.model_name,
                    messages=[
                        {"role": "system", "content": instruction},
                        {"role": "user", "content": f"Последний ответ модели: {last_message}"}
                    ],
                    response_format={"type": "json_object"},
                    temperature=0.1
                )
                response_text = response.choices[0].message.content
            else:
                return []

            try:
                data = json.loads(response_text)
                suggestions = data.get("suggestions", [])
                
                # Сравнение без учета регистра для надежности
                valid_lower = [b.lower() for b in self.PREDEFINED_BUTTONS]
                filtered = []
                for s in suggestions:
                    if s.lower() in valid_lower:
                        # Берем оригинальное написание из нашего списка
                        original = self.PREDEFINED_BUTTONS[valid_lower.index(s.lower())]
                        filtered.append(original)
                
                # Возвращаем ровно столько, сколько предложила модель (в рамках допустимого списка)
                return filtered
            except (json.JSONDecodeError, AttributeError):
                return []
            
        except Exception as e:
            logger.error(f"ButtonSuggester error: {e}")
            return []

    def process_message(self, history: List[Dict[str, Any]], state: AgentState) -> AgentResponse:
        # This agent is not usually called via Orchestrator's handle_message flow
        # but we implement it just in case.
        suggestions = self.suggest_buttons(history[-1]['content'] if history else "", state)
        return AgentResponse(
            agent_name=self.name,
            content=json.dumps({"suggestions": suggestions}),
            is_final=True
        )
