"""Global error handling that never exposes secrets or stack traces to users."""

from __future__ import annotations

import logging

from aiogram import Router
from aiogram.types import ErrorEvent

from app.errors import (
    AppError,
    BlockedUserError,
    MediaError,
    MembershipUnavailableError,
    NotFoundError,
    PermissionDeniedError,
    PublishError,
    RateLimitedError,
    TokenError,
    ValidationError,
)

logger = logging.getLogger(__name__)
router = Router(name="errors")


def _friendly(exc: BaseException) -> str:
    if isinstance(exc, RateLimitedError):
        return f"⏳ {exc} لطفاً {exc.retry_after} ثانیه صبر کنید."
    if isinstance(
        exc,
        (
            AppError,
            ValidationError,
            MediaError,
            MembershipUnavailableError,
            NotFoundError,
            PermissionDeniedError,
            PublishError,
            TokenError,
            BlockedUserError,
        ),
    ):
        return f"⚠️ {exc}"
    return "⚠️ خطای غیرمنتظره‌ای رخ داد. جزئیات فنی فقط در لاگ ثبت شد."


@router.error()
async def handle_error(event: ErrorEvent) -> bool:
    exc = event.exception
    logger.error(
        "unhandled update error: %s",
        type(exc).__name__,
        exc_info=(type(exc), exc, exc.__traceback__),
    )
    update = event.update
    text = _friendly(exc)
    try:
        if update.callback_query:
            await update.callback_query.answer(text[:190], show_alert=True)
        elif update.message:
            await update.message.answer(text)
    except Exception:
        logger.debug("could not deliver error message to user", exc_info=True)
    return True
