"""
Payment Handlers
"""
import html
from aiogram import Router, F
from aiogram.types import CallbackQuery, InlineKeyboardButton, InlineKeyboardMarkup
from database.db_manager import UserManager, TransactionManager, OrderManager, PlansManager, UISettingsManager
from utils.messages import MessageTemplates
from utils.crypto_utils import CryptoWallet, PriceConverter
from utils.keyboard_builder import AdvancedKeyboard
from config.settings import (
    USERS_DB,
    TRANSACTIONS_DB,
    ORDERS_DB,
    PLANS_DB,
    UI_SETTINGS_DB,
    ADMIN_ID,
    EMOJI_FIRE,
    EMOJI_WARNING,
    EMOJI_GIFT,
    EMOJI_USERS,
)
import uuid

router = Router()
user_manager = UserManager(USERS_DB)
transaction_manager = TransactionManager(TRANSACTIONS_DB)
order_manager = OrderManager(ORDERS_DB)
plans_manager = PlansManager(PLANS_DB)
ui_settings_manager = UISettingsManager(UI_SETTINGS_DB)

user_payment_context = {}  # Store payment info temporarily
pending_order_proof = {}  # user_id -> order_id waiting for receipt/proof


def _admin_order_card(title: str, order: dict, tg_user, extra: str = "") -> str:
    """Build styled premium-emoji admin order card."""
    username = f"@{tg_user.username}" if tg_user and tg_user.username else "ندارد"
    full_name = tg_user.full_name if tg_user else "نامشخص"
    default_tpl = (
        f'<tg-emoji emoji-id="{EMOJI_FIRE}">🔥</tg-emoji> <b>{title}</b>\n\n'
        f'<tg-emoji emoji-id="{EMOJI_USERS}">👤</tg-emoji> آیدی عددی: <code>{{user_id}}</code>\n'
        f'👤 نام: <code>{{full_name}}</code>\n'
        f'🔹 یوزرنیم: <code>{{username}}</code>\n\n'
        f'<tg-emoji emoji-id="{EMOJI_GIFT}">🎁</tg-emoji> سفارش: <code>#{{order_id}}</code>\n'
        f'📦 نوع سفارش: <code>{{order_type}}</code>\n'
        f'💱 روش/ارز: <code>{{currency}}</code>\n'
        f'💰 مبلغ/مصرف: <code>{{amount}}</code>\n'
        f'🧩 پلن: <code>{{plan_id}}</code>\n\n'
        f'{{extra}}'
    )
    key_map = {
        'سفارش جدید پرداختی': 'admin_order_paid',
        'سفارش جدید (پرداخت از کیف پول)': 'admin_order_wallet',
        'رسید کاربر دریافت شد': 'admin_order_receipt',
    }
    key = key_map.get(title, 'admin_order_paid')
    template = ui_settings_manager.get_text_template(key, default_tpl)

    context = {
        'user_id': order.get('user_id', ''),
        'full_name': full_name,
        'username': username,
        'order_id': order.get('id', ''),
        'order_type': order.get('order_type', ''),
        'currency': order.get('currency', ''),
        'amount': order.get('amount', ''),
        'plan_id': order.get('plan_id', ''),
        'extra': extra,
    }
    text = template
    for k, v in context.items():
        text = text.replace(f"{{{k}}}", html.escape(str(v)))
    return text


@router.callback_query(F.data.startswith("pay_toman_"))
async def pay_toman(callback: CallbackQuery):
    """Handle Toman payment"""
    plan_id = callback.data.split("_")[-1]
    plan = plans_manager.get_plan(plan_id)
    if not plan:
        await callback.answer("پلن نامعتبر", show_alert=True)
        return

    store_context = callback.message.message_id
    user_payment_context[callback.from_user.id] = {
        'method': 'toman',
        'msg_id': store_context,
        'plan_id': plan_id,
        'amount': float(plan.get('price_toman', 0)),
    }
    
    text = """
    💳 <b>پرداخت از طریق درگاه ملی</b>
    
    درگاه پرداخت امن ایرانی
    
    برای ادامه درگاه را می‌بندیم.
    
    <i>توجه: در حال حاضر این درگاه در حالت تست است.</i>
    """
    
    kb = InlineKeyboardMarkup(inline_keyboard=[
        [InlineKeyboardButton(text="💳 رفتن به درگاه", url="https://example.com/payment")],
        [InlineKeyboardButton(text="✅ تایید پرداخت", callback_data="confirm_payment")],
        [InlineKeyboardButton(text="❌ انصراف", callback_data="cancel_payment")]
    ])
    
    await callback.message.edit_text(text, reply_markup=kb, parse_mode="HTML")
    await callback.answer()


@router.callback_query(F.data.startswith("pay_usdt_"))
async def pay_usdt(callback: CallbackQuery):
    """Handle USDT payment"""
    plan_id = callback.data.split("_")[-1]
    plan = plans_manager.get_plan(plan_id)
    if not plan:
        await callback.answer("پلن نامعتبر", show_alert=True)
        return

    user_payment_context[callback.from_user.id] = {
        'method': 'usdt',
        'msg_id': callback.message.message_id,
        'plan_id': plan_id,
        'amount': float(plan.get('price_usdt', 0)),
    }
    
    wallet = CryptoWallet.get_usdt_wallet()
    amount_usdt = float(plan.get('price_usdt', 0))
    
    text = f"""
    💳 <b>پرداخت با تتر (USDT)</b>
    
    شبکه: {wallet['network']}
    آدرس کیف پول:
    <code>{wallet['address']}</code>
    
    مبلغ: <code>${amount_usdt}</code>
    
    ⚠️ <b>مهم:</b>
    • آدرس را کپی کنید
    • حتماً TRC-20 استفاده کنید
    • بعد از انتقال تایید کنید
    """
    
    kb = InlineKeyboardMarkup(inline_keyboard=[
        [InlineKeyboardButton(text="📋 کپی آدرس", callback_data="copy_usdt_address")],
        [InlineKeyboardButton(text="✅ تایید انتقال", callback_data="confirm_payment")],
        [InlineKeyboardButton(text="❌ انصراف", callback_data="cancel_payment")]
    ])
    
    await callback.message.edit_text(text, reply_markup=kb, parse_mode="HTML")
    await callback.answer()


@router.callback_query(F.data.startswith("pay_trx_"))
async def pay_trx(callback: CallbackQuery):
    """Handle TRX payment"""
    plan_id = callback.data.split("_")[-1]
    plan = plans_manager.get_plan(plan_id)
    if not plan:
        await callback.answer("پلن نامعتبر", show_alert=True)
        return

    trx_amount = round(float(plan.get('price_usdt', 0)) * 6.666, 2)
    user_payment_context[callback.from_user.id] = {
        'method': 'trx',
        'msg_id': callback.message.message_id,
        'plan_id': plan_id,
        'amount': trx_amount,
    }
    
    wallet = CryptoWallet.get_trx_wallet()
    amount_trx = trx_amount
    
    text = f"""
    💳 <b>پرداخت با ترون (TRX)</b>
    
    شبکه: {wallet['network']}
    آدرس کیف پول:
    <code>{wallet['address']}</code>
    
    مبلغ: <code>{amount_trx} TRX</code>
    
    ⚠️ <b>مهم:</b>
    • آدرس را کپی کنید
    • بعد از انتقال تایید کنید
    • از بالانس کافی اطمینان حاصل کنید
    """
    
    kb = InlineKeyboardMarkup(inline_keyboard=[
        [InlineKeyboardButton(text="📋 کپی آدرس", callback_data="copy_trx_address")],
        [InlineKeyboardButton(text="✅ تایید انتقال", callback_data="confirm_payment")],
        [InlineKeyboardButton(text="❌ انصراف", callback_data="cancel_payment")]
    ])
    
    await callback.message.edit_text(text, reply_markup=kb, parse_mode="HTML")
    await callback.answer()


@router.callback_query(F.data.startswith("pay_wallet_"))
async def pay_wallet(callback: CallbackQuery):
    """Pay with user's toman wallet balance."""
    plan_id = callback.data.split("_")[-1]
    plan = plans_manager.get_plan(plan_id)
    if not plan:
        await callback.answer("پلن نامعتبر", show_alert=True)
        return

    user = user_manager.get_user(callback.from_user.id)
    if not user:
        await callback.answer("کاربر یافت نشد", show_alert=True)
        return

    price = float(plan.get('price_toman', 0))
    balance = float(user.get('balance_toman', 0))
    if balance < price:
        await callback.answer("موجودی کیف پول کافی نیست", show_alert=True)
        return

    user_manager.update_user(callback.from_user.id, {'balance_toman': balance - price})
    transaction_manager.log_transaction(
        user_id=callback.from_user.id,
        transaction_type='purchase_wallet',
        amount=price,
        currency='toman_wallet',
        plan_id=plan_id,
        status='completed'
    )

    order = order_manager.create_order(
        user_id=callback.from_user.id,
        order_type='paid_wallet',
        amount=price,
        currency='toman_wallet',
        plan_id=plan_id,
        note='Wallet paid order requires admin delivery of config/filter link',
    )

    text = (
        "✅ <b>خرید از کیف پول ثبت شد</b>\n\n"
        f"شماره سفارش: <code>{order['id']}</code>\n"
        "ادمین لینک کانفیگ/فیلتر را برای شما ارسال می‌کند."
    )
    kb = InlineKeyboardMarkup(inline_keyboard=[[InlineKeyboardButton(text="🔙 بازگشت", callback_data="back_main")]])
    await callback.message.edit_text(text, reply_markup=kb, parse_mode="HTML")

    try:
        await callback.bot.send_message(
            ADMIN_ID,
            _admin_order_card(
                "سفارش جدید (پرداخت از کیف پول)",
                order,
                callback.from_user,
                "برای تکمیل: پنل ادمین ← مدیریت سفارشات",
            ),
            parse_mode="HTML",
        )
    except Exception:
        pass

    await callback.answer("سفارش ثبت شد")


@router.callback_query(F.data == "confirm_payment")
async def confirm_payment(callback: CallbackQuery):
    """Confirm payment"""
    user_id = callback.from_user.id
    
    if user_id in user_payment_context:
        payment_info = user_payment_context[user_id]
        method = payment_info['method']
        plan_id = str(payment_info.get('plan_id', '1'))
        amount = float(payment_info.get('amount', 0))
        
        # Log transaction
        transaction_manager.log_transaction(
            user_id=user_id,
            transaction_type='purchase',
            amount=amount,
            currency=method,
            plan_id=plan_id,
            status='pending'
        )

        order = order_manager.create_order(
            user_id=user_id,
            order_type='paid',
            amount=amount,
            currency=method,
            plan_id=plan_id,
            note='Paid order requires admin delivery of config/filter link',
        )
        
        text = (
            MessageTemplates.transaction_pending()
            + f"\n\n🧾 <b>شماره سفارش:</b> <code>{order['id']}</code>"
            + "\nادمین بعد از بررسی، لینک کانفیگ/فیلتر را برای شما ارسال می‌کند."
            + "\n\n📎 لطفاً رسید پرداخت را به صورت عکس یا متن ارسال کنید."
        )
        
        kb = InlineKeyboardMarkup(inline_keyboard=[
            [InlineKeyboardButton(text="🔙 بازگشت", callback_data="back_main")]
        ])
        
        await callback.message.edit_text(text, reply_markup=kb, parse_mode="HTML")
        pending_order_proof[user_id] = str(order['id'])
        try:
            await callback.bot.send_message(
                ADMIN_ID,
                _admin_order_card(
                    "سفارش جدید پرداختی",
                    order,
                    callback.from_user,
                    "برای تکمیل: پنل ادمین ← مدیریت سفارشات",
                ),
                parse_mode="HTML",
            )
        except Exception:
            pass
        # Clean up context
        del user_payment_context[user_id]
    
    await callback.answer()


@router.message(lambda m: m.from_user and m.from_user.id in pending_order_proof)
async def receive_payment_proof(message):
    """Receive user's payment proof (text/photo/document) and send full info to admin."""
    user_id = message.from_user.id
    order_id = pending_order_proof.get(user_id)
    if not order_id:
        return

    order = order_manager.get_order(order_id)
    if not order:
        pending_order_proof.pop(user_id, None)
        return

    summary = _admin_order_card(
        "رسید کاربر دریافت شد",
        order,
        message.from_user,
        f'<tg-emoji emoji-id="{EMOJI_WARNING}">⚠️</tg-emoji> وضعیت: در انتظار بررسی رسید',
    )

    try:
        await message.bot.send_message(ADMIN_ID, summary, parse_mode="HTML")
        await message.copy_to(ADMIN_ID)
    except Exception:
        pass

    pending_order_proof.pop(user_id, None)
    await message.answer(
        "✅ رسید شما ثبت شد و برای مدیریت ارسال شد.\n"
        "بعد از تایید، لینک کانفیگ/فیلتر برای شما ارسال می‌شود.",
        parse_mode="HTML",
    )


@router.callback_query(F.data == "cancel_payment")
async def cancel_payment(callback: CallbackQuery):
    """Cancel payment"""
    user_id = callback.from_user.id
    
    if user_id in user_payment_context:
        del user_payment_context[user_id]
    
    text = "❌ پرداخت لغو شد. دوباره سعی کنید."
    
    kb = InlineKeyboardMarkup(inline_keyboard=[
        [InlineKeyboardButton(text="🛍️ بازگشت به فروشگاه", callback_data="shop")]
    ])
    
    await callback.message.edit_text(text, reply_markup=kb, parse_mode="HTML")
    await callback.answer("پرداخت لغو شد", show_alert=True)


@router.callback_query(F.data == "copy_usdt_address")
async def copy_usdt_address(callback: CallbackQuery):
    """Copy USDT address"""
    wallet = CryptoWallet.get_usdt_wallet()
    await callback.answer(
        f"آدرس کپی شد: {wallet['address']}",
        show_alert=False
    )


@router.callback_query(F.data == "copy_trx_address")
async def copy_trx_address(callback: CallbackQuery):
    """Copy TRX address"""
    wallet = CryptoWallet.get_trx_wallet()
    await callback.answer(
        f"آدرس کپی شد: {wallet['address']}",
        show_alert=False
    )


@router.callback_query(F.data == "confirm_redeem")
async def confirm_redeem(callback: CallbackQuery):
    """Confirm redeem coins"""
    user_id = callback.from_user.id
    user = user_manager.get_user(user_id)
    
    if user and user['balance_coin'] >= 1000:
        # Deduct coins
        user_manager.deduct_coin(user_id, 1000)
        
        # Add free config
        user = user_manager.get_user(user_id)
        user['active_configs'].append({
            'type': 'free',
            'config': 'vless://example@example.com',
            'created': __import__('datetime').datetime.now().isoformat()
        })
        user_manager.update_user(user_id, {'active_configs': user['active_configs']})
        
        text = """
        ✅ <b>تبدیل موفق</b>
        
        کافیگ رایگان شما ایجاد شد.
        <code>vless://example@example.com</code>
        
        از این کافیگ برای اتصال استفاده کنید.
        """
    else:
        text = "❌ سکه کافی ندارید"
    
    kb = InlineKeyboardMarkup(inline_keyboard=[[InlineKeyboardButton(text="🔙 بازگشت", callback_data="back_main")]])
    await callback.message.edit_text(text, reply_markup=kb, parse_mode="HTML")
    await callback.answer()
