from aiogram import F, Router, types
from aiogram.fsm.context import FSMContext
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession

from database import get_temporary_data
from database.models import User
from handlers.buttons import MAIN_MENU, PAY_2
from handlers.payments.currency_rates import format_for_user
from handlers.texts import DEFAULT_PAYMENT_MESSAGE
from handlers.utils import edit_or_send_message
from logger import logger
from ..constants import ALLOWED_TEMP_PAYMENT_STATES

from .service import (
    KASSAI_METHODS,
    generate_kassai_payment_link,
    process_callback_pay_kassai,
    router as service_router,
)

router = Router(name="kassai_router")
router.include_router(service_router)


@router.callback_query(F.data == "pay_kassai_cards")
async def handle_pay_kassai_cards(
    callback_query: types.CallbackQuery,
    state: FSMContext,
    session: AsyncSession,
):
    """Обработчик оплаты через KassaI картами."""
    await process_callback_pay_kassai(callback_query, state, session, method_name="cards")


@router.callback_query(F.data == "pay_kassai_sbp")
async def handle_pay_kassai_sbp(
    callback_query: types.CallbackQuery,
    state: FSMContext,
    session: AsyncSession,
):
    """Обработчик оплаты через KassaI СБП."""
    await process_callback_pay_kassai(callback_query, state, session, method_name="sbp")


async def _handle_custom_amount_input_kassai(
    event,
    session: AsyncSession,
    method_name: str,
    pay_button_text: str = PAY_2,
    main_menu_text: str = MAIN_MENU,
):
    """Универсальная функция быстрого потока для KassaI.

    Принимает недостающую сумму и формирует платеж.
    Работает с временными данными из fast_payment_flow для
    создания/продления/подарка.

    Args:
        event: Событие от aiogram
        session: Сессия БД
        method_name: "cards" или "sbp"
        pay_button_text: Текст кнопки оплаты
        main_menu_text: Текст кнопки главного меню
    """
    message = event.message
    from_user = event.from_user
    tg_id = from_user.id

    temp_data = await get_temporary_data(session, tg_id)
    if not temp_data or temp_data["state"] not in ALLOWED_TEMP_PAYMENT_STATES:
        await edit_or_send_message(
            target_message=message,
            text="❌ Не удалось получить данные для оплаты.",
        )
        return

    amount = int(temp_data["data"].get("required_amount", 0))
    if amount <= 0:
        await edit_or_send_message(
            target_message=message,
            text="❌ Не удалось определить сумму оплаты.",
        )
        return

    min_amounts = {"cards": 50, "sbp": 10}
    method_labels = {"cards": "картой", "sbp": "через СБП"}
    min_amount = min_amounts.get(method_name, 10)

    if amount < min_amount:
        method_label = method_labels.get(method_name, "")
        error_msg = f"❌ Минимальная сумма для оплаты {method_label} — {min_amount}₽."
        await edit_or_send_message(
            target_message=message,
            text=error_msg,
        )
        return

    method = KASSAI_METHODS.get(method_name)
    if not method or not method["enable"]:
        method_label = "картами" if method_name == "cards" else "через СБП"
        await edit_or_send_message(
            target_message=message,
            text=f"❌ Оплата {method_label} KassaAI временно недоступна.",
        )
        return

    try:
        payment_url = await generate_kassai_payment_link(amount, tg_id, method)

        if not payment_url or payment_url == "https://fk.life/":
            await edit_or_send_message(
                target_message=message,
                text=("❌ Произошла ошибка при создании платежа. Попробуйте позже или выберите другой способ оплаты."),
            )
            return

        markup = InlineKeyboardMarkup(
            inline_keyboard=[
                [InlineKeyboardButton(text=pay_button_text, url=payment_url)],
                [InlineKeyboardButton(text=main_menu_text, callback_data="profile")],
            ]
        )

        result = await session.execute(select(User.language_code).where(User.tg_id == tg_id))
        language_code = result.scalar_one_or_none()
        amount_text = await format_for_user(
            session,
            tg_id,
            float(amount),
            language_code,
            force_currency="RUB",
        )
        text_out = DEFAULT_PAYMENT_MESSAGE.format(amount=amount_text)

        await edit_or_send_message(target_message=message, text=text_out, reply_markup=markup)
    except Exception as e:
        method_label = "Cards" if method_name == "cards" else "SBP"
        logger.error(f"Ошибка при создании платежа KassaAI {method_label} для пользователя {tg_id}: {e}")
        await edit_or_send_message(
            target_message=message,
            text="Произошла ошибка при создании платежа. Попробуйте позже.",
            reply_markup=InlineKeyboardMarkup(inline_keyboard=[]),
        )


async def handle_custom_amount_input_kassai_cards(
    event,
    session: AsyncSession,
    pay_button_text: str = PAY_2,
    main_menu_text: str = MAIN_MENU,
):
    """Функция быстрого потока для KassaI Cards."""
    await _handle_custom_amount_input_kassai(event, session, "cards", pay_button_text, main_menu_text)


async def handle_custom_amount_input_kassai_sbp(
    event,
    session: AsyncSession,
    pay_button_text: str = PAY_2,
    main_menu_text: str = MAIN_MENU,
):
    """Функция быстрого потока для KassaI SBP."""
    await _handle_custom_amount_input_kassai(event, session, "sbp", pay_button_text, main_menu_text)
