from aiogram import Router, F
from aiogram.types import CallbackQuery, Message, InlineKeyboardButton
from aiogram.fsm.context import FSMContext
from aiogram.fsm.state import State, StatesGroup
from aiogram.utils.keyboard import InlineKeyboardBuilder

from database.database import AsyncSessionLocal
from database.crud import get_user_by_telegram_id, get_setting
from core.config import config
from core.emojis import p_em
from sqlalchemy import select
from database.models import Transaction


router = Router()

class WalletState(StatesGroup):
    waiting_for_rial_amount = State()
    waiting_for_receipt_photo = State()

@router.callback_query(F.data == "wallet_menu")
async def show_wallet(callback: CallbackQuery, state: FSMContext = None):
    if state:
        await state.clear()
    user_id = callback.from_user.id
    
    async with AsyncSessionLocal() as session:
        user = await get_user_by_telegram_id(session, user_id)
        
    # بررسی وضعیت درگاه‌ها
    from services.nowpayments_service import is_nowpayments_enabled
    usdt_enabled = await is_nowpayments_enabled()
    
    builder = InlineKeyboardBuilder()
    builder.button(text="💳 شارژ ریالی", callback_data="charge_rial", style="success")
    if usdt_enabled:
        builder.button(text="🪙 شارژ تتری (USDT)", callback_data="charge_usdt", style="success")
    builder.button(text="📜 تاریخچه تراکنش‌ها", callback_data="tx_history_1", style="primary")
    builder.button(text="🔙 بازگشت به منوی اصلی", callback_data="back_to_main", style="danger")
    if usdt_enabled:
        builder.adjust(2, 1, 1)
    else:
        builder.adjust(1, 1, 1)
    
    from aiogram.exceptions import TelegramBadRequest
    try:
        await callback.message.edit_text(
            p_em(f"💳 <b>کیف پول کاربری شما</b>\n"
            f"〰️〰️〰️〰️〰️〰️〰️\n"
            f"💰 <b>موجودی فعلی:</b> {user.wallet_balance:,.0f} تومان\n\n"
            f"👇 برای افزایش موجودی حساب، یکی از روش‌های پرداخت زیر را انتخاب کنید:"),
            reply_markup=builder.as_markup()
        )
    except TelegramBadRequest:
        pass

@router.callback_query(F.data == "charge_rial")
async def request_rial_charge(callback: CallbackQuery, state: FSMContext):
    builder = InlineKeyboardBuilder()
    builder.button(text="❌ انصراف", callback_data="back_to_main", style="danger")
    await callback.message.edit_text(
        p_em("💳 <b>شارژ ریالی حساب (کارت به کارت)</b>\n"
        "〰️〰️〰️〰️〰️〰️〰️\n"
        "👇 لطفاً مبلغ مورد نظر خود را برای شارژ به <b>تومان</b> وارد کنید:\n\n"
        "<i>(مثال: برای ۵۰ هزار تومان، عدد 50000 را بفرستید)</i>"),
        reply_markup=builder.as_markup()
    )
    await state.set_state(WalletState.waiting_for_rial_amount)

@router.message(WalletState.waiting_for_rial_amount)
async def process_rial_amount(message: Message, state: FSMContext):
    amount_text = message.text
    if not amount_text.isdigit() or int(amount_text) < 10000:
        builder = InlineKeyboardBuilder()
        builder.button(text="❌ انصراف", callback_data="back_to_main", style="danger")
        await message.answer(p_em("⚠️ مبلغ نامعتبر است. حداقل مبلغ شارژ 10,000 تومان می‌باشد. لطفاً مجدداً وارد کنید:"), reply_markup=builder.as_markup())
        return
        
    amount = int(amount_text)
    await state.update_data(charge_amount=amount)
    
    # اطلاعات کارت از تنظیمات دیتابیس
    async with AsyncSessionLocal() as session:
        card_number = await get_setting(session, "card_number", "تنظیم نشده")
        card_name = await get_setting(session, "card_name", "تنظیم نشده")
    
    builder = InlineKeyboardBuilder()
    builder.button(text="❌ انصراف", callback_data="back_to_main", style="danger")
    await message.answer(
        p_em(f"✅ درخواست شارژ به مبلغ <b>{amount:,.0f} تومان</b> ثبت شد.\n"
        f"〰️〰️〰️〰️〰️〰️〰️\n"
        f"💳 <b>شماره کارت جهت واریز:</b>\n"
        f"<code>{card_number}</code>\n"
        f"👤 <b>به نام:</b> {card_name}\n\n"
        f"📸 <b>توجه:</b> لطفاً پس از واریز، <b>تصویر فیش واریزی</b> خود را مستقیماً همینجا ارسال کنید تا بررسی شود."),
        reply_markup=builder.as_markup()
    )
    await state.set_state(WalletState.waiting_for_receipt_photo)

@router.message(WalletState.waiting_for_receipt_photo, F.photo)
async def process_receipt(message: Message, state: FSMContext):
    data = await state.get_data()
    amount = data.get("charge_amount")
    photo_file_id = message.photo[-1].file_id
    user_id = message.from_user.id
    
    # ارسال فیش برای ادمین
    builder = InlineKeyboardBuilder()
    builder.button(text="✅ تایید و شارژ", callback_data=f"approve_receipt_{user_id}_{amount}", style="success")
    builder.button(text="❌ رد کردن", callback_data=f"reject_receipt_{user_id}", style="danger")
    
    admin_caption = p_em(
        f"💰 <b>درخواست شارژ ریالی</b>\n\n"
        f"👤 کاربر: {message.from_user.full_name}\n"
        f"🆔 آیدی: <code>{user_id}</code>\n"
        f"💵 مبلغ درخواستی: {amount:,.0f} تومان"
    )
    
    try:
        async with AsyncSessionLocal() as db_session:
            from database.crud import get_group_id
            admin_group_id = await get_group_id(db_session, "receipts", config.admin_group_id)
            
        await message.bot.send_photo(
            chat_id=admin_group_id,
            photo=photo_file_id,
            caption=admin_caption,
            reply_markup=builder.as_markup()
        )
        await message.answer(p_em("⏳ رسید شما ارسال شد. پس از تایید ادمین، کیف پول شما شارژ خواهد شد."))
    except Exception:
        await message.answer(p_em("❌ مشکلی پیش آمد. با پشتیبانی تماس بگیرید."))
        
    await state.clear()
    from handlers.user_panel import cmd_start
    await cmd_start(message, state)

@router.message(WalletState.waiting_for_receipt_photo)
async def process_receipt_invalid(message: Message):
    builder = InlineKeyboardBuilder()
    builder.button(text="❌ انصراف", callback_data="back_to_main", style="danger")
    await message.answer(
        p_em("⚠️ لطفاً <b>تصویر فیش واریزی</b> خود را ارسال کنید (متن پذیرفته نیست)."),
        reply_markup=builder.as_markup()
    )

class USDTState(StatesGroup):
    waiting_for_usdt_amount = State()

@router.callback_query(F.data == "charge_usdt")
async def request_usdt_charge(callback: CallbackQuery, state: FSMContext):
    from services.nowpayments_service import is_nowpayments_enabled
    if not await is_nowpayments_enabled():
        return await callback.answer("❌ پرداخت تتری در حال حاضر غیرفعال است.", show_alert=True)

    builder = InlineKeyboardBuilder()
    builder.button(text="❌ انصراف", callback_data="back_to_main", style="danger")
    await callback.message.edit_text(
        p_em("🪙 <b>شارژ تتری اتوماتیک (USDT TRC20)</b>\n"
        "〰️〰️〰️〰️〰️〰️〰️\n"
        "👇 برای ایجاد فاکتور، مبلغ درخواستی خود را به <b>تومان</b> وارد کنید:\n\n"
        "<i>(ربات مبلغ شما را با نرخ روز به تتر تبدیل کرده و لینک پرداخت ایمن ارائه می‌دهد)</i>"),
        reply_markup=builder.as_markup()
    )
    await state.set_state(USDTState.waiting_for_usdt_amount)

@router.message(USDTState.waiting_for_usdt_amount)
async def process_usdt_amount(message: Message, state: FSMContext):
    amount_text = message.text
    if not amount_text.isdigit() or int(amount_text) < 50000:
        builder = InlineKeyboardBuilder()
        builder.button(text="❌ انصراف", callback_data="back_to_main", style="danger")
        return await message.answer(p_em("مبلغ باید بیشتر از ۵۰,۰۰۰ تومان باشد. مجدداً وارد کنید:"), reply_markup=builder.as_markup())
        
    amount_toman = int(amount_text)
    # نرخ فرضی تتر 60,000 تومان
    from database.database import AsyncSessionLocal
    async with AsyncSessionLocal() as session:
        usdt_rate = float(await get_setting(session, "usdt_rate", "60000"))
    usd_amount = round(amount_toman / usdt_rate, 2)
    
    from services.nowpayments_service import create_invoice
    order_id = f"charge_{message.from_user.id}_{amount_toman}"
    
    result = await create_invoice(usd_amount, order_id, "Wallet Charge")
    
    if result["status"]:
        payment_id = result["payment_id"]
        builder = InlineKeyboardBuilder()
        builder.button(text="💳 پرداخت فاکتور", url=result["invoice_url"])
        builder.button(text="🔄 بررسی وضعیت پرداخت", callback_data=f"check_usdt_{payment_id}_{amount_toman}", style="primary")
        builder.adjust(1)
        
        await message.answer(
            p_em(f"✅ <b>فاکتور پرداخت شما آماده است!</b>\n"
            f"〰️〰️〰️〰️〰️〰️〰️\n"
            f"💵 <b>مبلغ فاکتور:</b> {amount_toman:,.0f} تومان\n"
            f"🪙 <b>معادل تتری:</b> {usd_amount} USDT\n\n"
            f"⚡️ لطفاً از طریق دکمه زیر وارد درگاه شده و پرداخت را انجام دهید. پس از تکمیل تراکنش، برای تایید روی «بررسی وضعیت» کلیک کنید."),
            reply_markup=builder.as_markup()
        )
    else:
        await message.answer(p_em("❌ مشکلی در ایجاد فاکتور پیش آمد. لطفاً به ادمین اطلاع دهید."))
        
    await state.clear()

@router.callback_query(F.data.startswith("check_usdt_"))
async def verify_usdt_payment(callback: CallbackQuery):
    _, _, payment_id, amount_toman_str = callback.data.split("_")
    amount_toman = int(amount_toman_str)
    
    from services.nowpayments_service import check_payment_status
    status = await check_payment_status(payment_id)
    
    if status == "finished" or status == "confirmed":
        from services.wallet_service import charge_wallet
        async with AsyncSessionLocal() as session:
            success = await charge_wallet(session, callback.from_user.id, amount_toman, charge_type='usdt_charge')
        
        if success:
            builder = InlineKeyboardBuilder()
            builder.button(text="🔙 بازگشت به کیف پول", callback_data="wallet_menu", style="danger")
            await callback.message.edit_text(
                p_em(f"✅ پرداخت شما تایید شد!\nمبلغ {amount_toman:,.0f} تومان به کیف پول شما اضافه شد."),
                reply_markup=builder.as_markup()
            )
        else:
            await callback.answer("خطا در شارژ کیف پول.", show_alert=True)
            
    elif status == "waiting" or status == "confirming" or status == "sending":
        await callback.answer("⏳ پرداخت شما هنوز تایید نهایی نشده است. لطفاً چند دقیقه دیگر امتحان کنید.", show_alert=True)
    else:
        await callback.answer(f"وضعیت فاکتور: {status} ❌", show_alert=True)

@router.callback_query(F.data.startswith("tx_history_"))
async def transaction_history(callback: CallbackQuery):
    user_id = callback.from_user.id
    page = int(callback.data.split("_")[2])
    per_page = 10
    
    async with AsyncSessionLocal() as session:
        user = await get_user_by_telegram_id(session, user_id)
        stmt = select(Transaction).where(Transaction.user_id == user.id).order_by(Transaction.id.desc())
        txs = (await session.execute(stmt)).scalars().all()
        
    if not txs:
        return await callback.answer("هیچ تراکنشی یافت نشد.", show_alert=True)
        
    total_pages = (len(txs) + per_page - 1) // per_page
    start = (page - 1) * per_page
    end = start + per_page
    current_txs = txs[start:end]
    
    text = f"📜 <b>تاریخچه تراکنش‌های شما (صفحه {page}/{total_pages})</b>\n〰️〰️〰️〰️〰️〰️〰️\n\n"
    for tx in current_txs:
        date_str = tx.created_at.strftime('%Y-%m-%d %H:%M')
        if tx.amount > 0:
            text += f"🟢 <b>واریز:</b> +{tx.amount:,.0f}T\n   بابت: {tx.type} | 🕒 {date_str}\n\n"
        else:
            text += f"🔴 <b>برداشت:</b> {tx.amount:,.0f}T\n   بابت: خرید از فروشگاه | 🕒 {date_str}\n\n"
            
    builder = InlineKeyboardBuilder()
    nav_buttons = []
    if page > 1:
        nav_buttons.append(InlineKeyboardButton(text="⬅️ قبلی", callback_data=f"tx_history_{page-1}", style="primary"))
    if page < total_pages:
        nav_buttons.append(InlineKeyboardButton(text="بعدی ➡️", callback_data=f"tx_history_{page+1}", style="primary"))
        
    if nav_buttons:
        builder.row(*nav_buttons)
    builder.row(InlineKeyboardButton(text="🔙 بازگشت به کیف پول", callback_data="wallet_menu", style="danger"))
    
    await callback.message.edit_text(p_em(text), reply_markup=builder.as_markup())
