
"""
bot/handlers/test.py
--------------------
دریافت اکانت تست توسط کاربران
"""

from __future__ import annotations

import html
import logging

from aiogram import F, Router
from aiogram.types import CallbackQuery

import config

from bot.keyboards.main_menu import CB_TEST_ACCOUNT
from database import crud
from database.database import get_session

router = Router(name="test_account")

logger = logging.getLogger(__name__)


@router.callback_query(F.data == CB_TEST_ACCOUNT)
async def handle_test_account(
    callback: CallbackQuery,
):
    user_telegram_id = callback.from_user.id

    async with get_session() as session:

        # ----------------------------------------------------
        # پیدا کردن کاربر
        # ----------------------------------------------------

        user = await crud.get_user_by_telegram_id(
            session=session,
            telegram_id=user_telegram_id,
        )

        if not user:
            await callback.answer(
                "❌ اطلاعات کاربری شما پیدا نشد.",
                show_alert=True,
            )
            return

        # ----------------------------------------------------
        # بررسی اینکه کاربر قبلاً تست گرفته یا نه
        # ----------------------------------------------------

        if user.test_account_used_count >= config.TEST_ACCOUNT_LIMIT:
            await callback.answer(
                "⚠️ شما قبلاً اکانت تست خود را دریافت کرده‌اید.",
                show_alert=True,
            )
            return

        # ----------------------------------------------------
        # بررسی موجودی تست
        # ----------------------------------------------------

        available_count = await crud.get_available_test_config_count(
            session
        )

        if available_count <= 0:
            await callback.answer(
                "😔 در حال حاضر اکانت تست موجود نیست.",
                show_alert=True,
            )
            return

        # ----------------------------------------------------
        # مصرف اولین کانفیگ آزاد
        #
        # خود CRUD کانفیگ آزاد را پیدا می‌کند و:
        # - آن را مصرف‌شده می‌کند
        # - کاربر را ثبت می‌کند
        # - test_account_used_count را افزایش می‌دهد
        # ----------------------------------------------------

        used_config = await crud.use_test_config(
            session=session,
            user_id=user.id,
        )

        if not used_config:
            await callback.answer(
                "❌ دریافت اکانت تست انجام نشد. دوباره تلاش کنید.",
                show_alert=True,
            )
            return

        # ----------------------------------------------------
        # موجودی باقی‌مانده
        # ----------------------------------------------------

        remaining_count = await crud.get_available_test_config_count(
            session
        )

    # --------------------------------------------------------
    # ارسال کانفیگ تست به کاربر
    # --------------------------------------------------------

    await callback.message.answer(
        "🎉 <b>اکانت تست شما آماده شد!</b>\n\n"
        "🧪 <b>نوع:</b> اکانت تست\n"
        f"⏱ <b>مدت تست:</b> {config.TEST_ACCOUNT_DURATION_HOURS} ساعت\n"
        f"💾 <b>حجم:</b> {config.TEST_ACCOUNT_VOLUME_GB} گیگ\n\n"
        "🔐 <b>کانفیگ:</b>\n"
        f"<pre>{html.escape(str(used_config.config_text))}</pre>\n\n"
        "⚠️ این اکانت تست فقط یک‌بار برای هر کاربر قابل دریافت است."
    )

    await callback.answer(
        "✅ اکانت تست با موفقیت دریافت شد."
    )

    # --------------------------------------------------------
    # هشدار کمبود موجودی
    # --------------------------------------------------------

    if remaining_count == 3:

        for admin_id in config.ADMIN_IDS:

            try:
                await callback.bot.send_message(
                    chat_id=admin_id,
                    text=(
                        "⚠️ <b>موجودی اکانت تست به ۳ رسید!</b>\n\n"
                        "🧪 پیشنهاد می‌شود کانفیگ‌های تست جدید "
                        "به Pool اضافه کنید.\n\n"
                        f"📦 موجودی فعلی: <b>{remaining_count}</b>\n\n"
                        "برای افزودن کانفیگ:\n"
                        "<code>/testconfigs</code>\n\n"
                        "برای مشاهده موجودی:\n"
                        "<code>/teststock</code>"
                    ),
                )

            except Exception:
                logger.exception(
                    "Could not notify admin about low test stock | admin_id=%s",
                    admin_id,
                )
