"""
bot/handlers/referral.py
------------------------
نمایش بخش زیرمجموعه‌گیری و لینک دعوت کاربر
"""

from __future__ import annotations

import html
from urllib.parse import quote

from aiogram import F, Router
from aiogram.types import CallbackQuery, InlineKeyboardButton, InlineKeyboardMarkup
from sqlalchemy.ext.asyncio import AsyncSession

import config
from bot.keyboards.common import back_to_main_menu_keyboard
from bot.keyboards.main_menu import CB_REFERRAL
from database import crud

router = Router(name="referral")


@router.callback_query(F.data == CB_REFERRAL)
async def handle_referral(
    callback: CallbackQuery,
    session: AsyncSession,
):
    user = await crud.get_user_by_telegram_id(
        session=session,
        telegram_id=callback.from_user.id,
    )

    if not user:
        await callback.answer(
            "❌ اطلاعات کاربری شما پیدا نشد.",
            show_alert=True,
        )
        return

    total_referrals, successful_referrals = (
        await crud.get_referral_stats(
            session=session,
            user_id=user.id,
        )
    )

    discount_percent = await crud.get_referral_discount_percent(
        session=session,
        user_id=user.id,
    )

    max_discount = crud.REFERRAL_MAX_DISCOUNT
    discount_per_referral = crud.REFERRAL_DISCOUNT_PER_SUCCESSFUL_REFERRAL

    max_successful_referrals = int(
        max_discount / discount_per_referral
    )

    remaining_successful_referrals = max(
        0,
        max_successful_referrals - successful_referrals,
    )

    # ========================================================
    # گرفتن Username ربات
    # ========================================================

    bot_username = config.BOT_USERNAME

    if not bot_username:
        try:
            bot_info = await callback.bot.get_me()
            bot_username = bot_info.username
        except Exception:
            bot_username = None

    if not bot_username:
        await callback.answer(
            "❌ لینک دعوت در حال حاضر قابل ایجاد نیست.",
            show_alert=True,
        )
        return

    bot_username = bot_username.lstrip("@")

    # ========================================================
    # ساخت لینک دعوت
    # ========================================================

    referral_link = (
        f"https://t.me/{bot_username}"
        f"?start={user.telegram_id}"
    )

    # ========================================================
    # لینک اشتراک‌گذاری در تلگرام
    # ========================================================

    share_text = (
        "🎁 بیا از این ربات اشتراک VPN بگیر 👇"
    )

    share_url = (
        "https://t.me/share/url"
        f"?url={quote(referral_link)}"
        f"&text={quote(share_text)}"
    )

    # ========================================================
    # وضعیت تخفیف
    # ========================================================

    if discount_percent >= max_discount:
        discount_status = (
            "🎉 <b>به سقف تخفیف ۵٪ رسیدی!</b>"
        )
    else:
        discount_status = (
            "📈 "
            "برای رسیدن به سقف تخفیف، "
            f"<b>{remaining_successful_referrals}</b> "
            "زیرمجموعه موفق دیگر نیاز داری."
        )

    # ========================================================
    # کیبورد Referral
    # ========================================================

    referral_keyboard = InlineKeyboardMarkup(
        inline_keyboard=[
            [
                InlineKeyboardButton(
                    text="📤 دعوت دوستان",
                    url=share_url,
                )
            ],
            [
                InlineKeyboardButton(
                    text="🔙 بازگشت به منوی اصلی",
                    callback_data="main_menu",
                )
            ],
        ]
    )

    # ========================================================
    # متن Referral
    # ========================================================

    text = (
        "🎁 <b>زیرمجموعه‌گیری</b>\n\n"

        "با دعوت دوستانت می‌تونی از خریدهای خودت "
        "تخفیف بگیری.\n\n"

        f"👥 <b>کل دعوت‌شده‌ها:</b> "
        f"{total_referrals} نفر\n"

        f"✅ <b>زیرمجموعه‌های موفق:</b> "
        f"{successful_referrals} نفر\n\n"

        f"🎯 <b>تخفیف فعلی:</b> "
        f"{discount_percent:g}٪\n"

        f"🔥 <b>سقف تخفیف:</b> "
        f"{max_discount:g}٪\n\n"

        f"{discount_status}\n\n"

        "🔗 <b>لینک دعوت شما:</b>\n"
        f"<code>{html.escape(referral_link)}</code>\n\n"

        "💡 هر شخصی که با لینک تو وارد ربات بشه "
        "و اولین خرید جدیدش رو با موفقیت کامل کنه، "
        f"<b>{discount_per_referral:g}٪</b> "
        "تخفیف به تخفیف تو اضافه می‌شه.\n\n"

        "⚠️ هر کاربر فقط یک‌بار به‌عنوان "
        "زیرمجموعه موفق محاسبه می‌شه."
    )

    await callback.message.edit_text(
        text,
        reply_markup=referral_keyboard,
    )

    await callback.answer()