import aiohttp

from .config import BotSettings


class PlatformaAPIError(Exception):
    pass


async def get_telegram_status(
    settings: BotSettings,
    *,
    telegram_user_id: int,
) -> dict:
    timeout = aiohttp.ClientTimeout(total=10)
    async with aiohttp.ClientSession(timeout=timeout) as session:
        async with session.post(
            f'{settings.backend_api_url}/auth/telegram/bot/status/',
            headers={'X-Telegram-Bot-Token': settings.backend_api_token},
            json={'telegram_user_id': telegram_user_id},
        ) as response:
            payload = await response.json()
            if not response.ok:
                raise PlatformaAPIError(
                    payload.get('detail', 'Не удалось проверить привязку Telegram.')
                )
            return payload


async def link_telegram(
    settings: BotSettings,
    *,
    code: str,
    telegram_user_id: int,
    telegram_username: str,
) -> dict:
    timeout = aiohttp.ClientTimeout(total=10)
    async with aiohttp.ClientSession(timeout=timeout) as session:
        async with session.post(
            f'{settings.backend_api_url}/auth/telegram/bot/link/',
            headers={'X-Telegram-Bot-Token': settings.backend_api_token},
            json={
                'code': code,
                'telegram_user_id': telegram_user_id,
                'telegram_username': telegram_username,
            },
        ) as response:
            payload = await response.json()
            if not response.ok:
                raise PlatformaAPIError(
                    payload.get('detail', 'Не удалось привязать Telegram.')
                )
            return payload


async def update_notification_settings(
    settings: BotSettings,
    *,
    telegram_user_id: int,
    field: str,
    enabled: bool,
) -> dict:
    timeout = aiohttp.ClientTimeout(total=10)
    async with aiohttp.ClientSession(timeout=timeout) as session:
        async with session.patch(
            f'{settings.backend_api_url}/auth/telegram/bot/settings/',
            headers={'X-Telegram-Bot-Token': settings.backend_api_token},
            json={
                'telegram_user_id': telegram_user_id,
                field: enabled,
            },
        ) as response:
            payload = await response.json()
            if not response.ok:
                raise PlatformaAPIError(
                    payload.get('detail', 'Не удалось изменить уведомления.')
                )
            return payload


async def send_ai_message(
    settings: BotSettings,
    *,
    telegram_user_id: int,
    message: str,
) -> dict:
    timeout = aiohttp.ClientTimeout(total=90)
    async with aiohttp.ClientSession(timeout=timeout) as session:
        async with session.post(
            f'{settings.backend_api_url}/ai/support-chat/telegram/',
            headers={'X-Telegram-Bot-Token': settings.backend_api_token},
            json={
                'telegram_user_id': telegram_user_id,
                'message': message,
            },
        ) as response:
            try:
                payload = await response.json()
            except (aiohttp.ContentTypeError, ValueError):
                raise PlatformaAPIError('RWL временно недоступна.')
            if not response.ok:
                raise PlatformaAPIError(
                    payload.get('detail', 'Не удалось получить ответ ИИ-ассистента.')
                )
            return payload


async def leave_support_chat(
    settings: BotSettings,
    *,
    telegram_user_id: int,
) -> dict:
    timeout = aiohttp.ClientTimeout(total=10)
    async with aiohttp.ClientSession(timeout=timeout) as session:
        async with session.post(
            f'{settings.backend_api_url}/ai/support-chat/telegram/leave/',
            headers={'X-Telegram-Bot-Token': settings.backend_api_token},
            json={'telegram_user_id': telegram_user_id},
        ) as response:
            payload = await response.json()
            if not response.ok:
                raise PlatformaAPIError(
                    payload.get('detail', 'Не удалось завершить чат с поддержкой.')
                )
            return payload
