"""
bot/handlers/start.py
-----------------------
مدیریت دستور /start ، ثبت کاربر جدید و پشتیبانی از لینک دعوت (Referral).
"""

from __future__ import annotations

import html
import logging

from aiogram import Router
from aiogram.filters import CommandObject, CommandStart
from aiogram.fsm.context import FSMContext
from aiogram.types import Message
from sqlalchemy.ext.asyncio import AsyncSession

from bot.keyboards.main_menu import (
    MAIN_MENU_TEXT,
    main_menu_keyboard,
)
from database import crud
from database.models import User

logger = logging.getLogger(__name__)

router = Router(name="start")


def _parse_referrer_id(
    command: CommandObject,
) -> int | None:

    if not command.args:
        return None

    try:
        return int(
            command.args.strip()
        )
    except ValueError:
        return None


@router.message(CommandStart())
async def handle_start(
    message: Message,
    command: CommandObject,
    state: FSMContext,
    session: AsyncSession,
    db_user: User | None,
):
    await state.clear()

    referrer_telegram_id = None

    # فقط برای کاربر جدید، لینک دعوت را بررسی می‌کنیم.
    if db_user is None:
        referrer_telegram_id = _parse_referrer_id(
            command
        )

    try:

        user, created = await crud.get_or_create_user(
            session=session,
            telegram_id=message.from_user.id,
            username=message.from_user.username,
            first_name=message.from_user.first_name,
            last_name=message.from_user.last_name,
            referred_by_telegram_id=referrer_telegram_id,
        )

    except Exception:

        logger.exception(
            "خطا هنگام ثبت یا دریافت کاربر | telegram_id=%s",
            message.from_user.id,
        )

        await message.answer(
            "❌ هنگام ورود به ربات مشکلی پیش آمد.\n"
            "لطفاً چند لحظه دیگر دوباره دستور /start را بزنید."
        )

        return

    # --------------------------------------------------------
    # USER CREATED
    # --------------------------------------------------------

    if created:

        logger.info(
            "کاربر جدید ثبت شد: %s (%s)",
            user.telegram_id,
            user.username,
        )

        welcome_extra = (
            "\n\n"
            "✨ خوش آمدید!\n"
            "ثبت‌نام شما با موفقیت انجام شد."
        )

        # ----------------------------------------------------
        # NOTIFY REFERRER
        # ----------------------------------------------------

        if user.referred_by_id:

            try:

                referrer = await crud.get_user_by_id(
                    session=session,
                    user_id=user.referred_by_id,
                )

                if referrer:

                    await message.bot.send_message(
                        chat_id=referrer.telegram_id,
                        text=(
                            "🎉 <b>یک نفر با لینک دعوت شما وارد شد!</b>\n\n"
                            "👤 یک نفر به زیرمجموعه‌های شما اضافه شد.\n"
                            "🎁 <b>۰.۵٪ تخفیف</b> برای شما فعال شد.\n\n"
                            "📊 برای مشاهده آمار زیرمجموعه‌ها، "
                            "وارد بخش «🎁 زیرمجموعه‌گیری» شوید."
                        ),
                    )

            except Exception:

                logger.exception(
                    "خطا در اطلاع‌رسانی به معرف | referrer_id=%s",
                    user.referred_by_id,
                )

    else:

        first_name = (
            message.from_user.first_name
            or "دوست عزیز"
        )

        welcome_extra = (
            "\n\n"
            f"👋 خوش برگشتید، "
            f"{html.escape(first_name)}!"
        )

    await message.answer(
        welcome_extra
        + "\n\n"
        + MAIN_MENU_TEXT,
        reply_markup=main_menu_keyboard(),
    )