import httpx
import json
import logging
from typing import Optional
from app.config import settings
from app.settings_cache import settings_cache

logger = logging.getLogger(__name__)

YANDEX_GPT_URL = "https://llm.api.cloud.yandex.net/foundationModels/v1/completion"
YANDEX_GPT_MODEL = "yandexgpt-lite"


class YandexGPT:
    def __init__(self):
        self._api_key: Optional[str] = None
        self._folder_id: Optional[str] = None

    async def _load_credentials(self) -> bool:
        self._api_key = await settings_cache.get("yandex_gpt_key")
        self._folder_id = await settings_cache.get("yandex_folder_id")
        return bool(self._api_key and self._folder_id)

    async def is_available(self) -> bool:
        return await self._load_credentials()

    async def _request(self, prompt: str, system_prompt: str = "") -> Optional[str]:
        if not await self._load_credentials():
            return None

        messages = []
        if system_prompt:
            messages.append({"role": "system", "text": system_prompt})
        messages.append({"role": "user", "text": prompt})

        payload = {
            "modelUri": f"gpt://{self._folder_id}/{YANDEX_GPT_MODEL}",
            "completionOptions": {
                "stream": False,
                "temperature": 0.3,
                "maxTokens": 1000,
            },
            "messages": messages,
        }

        headers = {
            "Authorization": f"Api-Key {self._api_key}",
            "Content-Type": "application/json",
        }

        try:
            async with httpx.AsyncClient(timeout=30.0) as client:
                r = await client.post(YANDEX_GPT_URL, headers=headers, json=payload)
                r.raise_for_status()
                data = r.json()
                result = data.get("result", {})
                alternatives = result.get("alternatives", [])
                if alternatives:
                    return alternatives[0].get("message", {}).get("text", "")
                return None
        except Exception as e:
            logger.error(f"YandexGPT request failed: {e}")
            return None

    async def analyze_intent(self, text: str, history_context: str = "") -> str:
        system_prompt = (
            "Ты — ассистент София из компании AegisOne Engineering. "
            "Определи намерение пользователя. Ответь строго одним словом: "
            "'question' — если это общий вопрос о компании, услугах, контактах; "
            "'ticket' — если пользователь хочет оставить заявку, заказать услугу, попросить обратный звонок; "
            "'unknown' — если намерение неочевидно."
        )
        if history_context:
            system_prompt += f"\n\nИстория обращений пользователя:\n{history_context}"
        result = await self._request(text, system_prompt)
        if result and result.strip().lower() in ("question", "ticket", "unknown"):
            return result.strip().lower()
        return "unknown"

    async def generate_answer(self, question: str, context: str, history_context: str = "") -> Optional[str]:
        system_prompt = (
            "Ты — ассистент София, представитель компании AegisOne Engineering. "
            "Отвечай на вопросы клиентов дружелюбно, профессионально и по делу. "
            "Используй информацию из базы знаний, но отвечай живым языком, не копируй текст дословно. "
            "Если информации недостаточно, предложи связаться с компанией по телефону или почте."
        )
        if history_context:
            system_prompt += f"\n\nДополнительный контекст об этом пользователе:\n{history_context}"
        user_prompt = f"Вопрос клиента: {question}\n\nКонтекст из базы знаний:\n{context}\n\nДай ответ клиенту:"
        return await self._request(user_prompt, system_prompt)

    async def clarify_intent(self, text: str, history_context: str = "") -> str:
        system_prompt = (
            "Ты — ассистент София. "
            "Пользователь написал нечто неочевидное. "
            "Ответь дружелюбно, попроси уточнить, хочет ли он: "
            "1) задать вопрос о компании AegisOne Engineering, "
            "2) оставить заявку на услугу, "
            "3) или что-то другое."
        )
        if history_context:
            system_prompt += f"\n\nКонтекст о пользователе:\n{history_context}"
        result = await self._request(text, system_prompt)
        return result or "Извините, я не совсем поняла ваш запрос. Вы хотели бы задать вопрос о нашей компании или оставить заявку?"


yandex_gpt = YandexGPT()
