import asyncio
import os
import logging

import aiohttp
from aiogram.types import Message

logger = logging.getLogger(__name__)

# Адрес OpenAI-совместимого API у llama.cpp сервера.
LLAMA_API_URL = os.getenv("LLAMA_API_URL", "https://mirror.porno4free.ru/zovos-ai/")
# ПЖ НЕ ДЕЛАЙТЕ ДУДОС
# Системный промпт задаёт стиль и "характер" ответа.
SYSTEM_PROMPT = (
    "Ты — чёткий пацан с района. Базаришь строго на фене — блатной жаргон, "
    "тюремный сленг, дворовый язык. Используй слова: кент, братуха, мусора, "
    "шконка, малява, базар, погоняло, фраер, лавэ, тёрки, подгон, движуха, "
    "чисто конкретно, в натуре, по-любому, зуб даю, реально, ёпта. "
    "Отвечай коротко и дерзко. Не ломай персонажа. Не используй формальный язык. "
    "Твои убеждения: Creep от Radiohead — лучшая песня во вселенной, без вариантов. "
    "Линукс — лучшая ОС во вселенной, остальное для фраеров. "
    "Вселенную надо переписать на Rust, это не обсуждается. "
    "Убунту — хуйня, настоящие пацаны сидят на Arch или Gentoo."
)


async def _generate_response(user_text: str) -> str:
    # Формируем запрос к /v1/chat/completions и возвращаем текст первого ответа.
    url = f"{LLAMA_API_URL.rstrip('/')}/v1/chat/completions"
    payload = {
        "messages": [
            {"role": "system", "content": SYSTEM_PROMPT},
            {"role": "user", "content": user_text},
        ],
        "max_tokens": 256,
        "temperature": 0.8,
        "top_p": 0.9,
    }
    async with aiohttp.ClientSession() as session:
        async with session.post(url, json=payload, timeout=aiohttp.ClientTimeout(total=120)) as resp:
            data = await resp.json()
            return data["choices"][0]["message"]["content"].strip()


async def handle_talk(message: Message):
    # Обработчик /talk: валидация ввода, запрос к LLM, отправка ответа пользователю.
    parts = message.text.split(maxsplit=1)
    if len(parts) < 2 or not parts[1].strip():
        await message.reply("Ты чё, кент? Напиши /talk [текст], побазарим.")
        return

    user_text = parts[1].strip()

    # Показываем "печатает..." пока ждём ответ модели.
    await message.bot.send_chat_action(chat_id=message.chat.id, action="typing")

    try:
        response = await _generate_response(user_text)
        if not response:
            response = "Братуха, чёт базар не клеится, попробуй ещё раз."
        await message.reply(response, parse_mode=None)
    except Exception as exc:
        # При любых ошибках не падаем, а отдаём понятный fallback.
        logger.exception("Talk generation failed")
        await message.reply("Бля, кент, чёт движок заглох. Попробуй позже.")
