import html
from aiogram import Router, F
from contextlib import suppress
from aiogram.filters import CommandStart, Command
from aiogram.types import Message, InlineKeyboardMarkup, InlineKeyboardButton, CallbackQuery
from aiogram.utils.keyboard import InlineKeyboardBuilder
from aiogram.fsm.context import FSMContext
from aiogram.exceptions import TelegramBadRequest
from sqlalchemy import func, select

from database.database import AsyncSessionLocal
from database.crud import get_user_by_telegram_id, create_user, get_setting, ensure_runtime_admin
from database.models import Category, Product
from core.config import config
from core.emojis import p_em


router = Router()

DEFAULT_UNVERIFIED_TPL = (
    "سلام <b>{full_name}</b> عزیز! 👋\n"
    "به فروشگاه محصولات دیجیتال خوش آمدید 💫\n"
    "〰️〰️〰️〰️〰️〰️〰️\n"
    "🔒 <b>توجه:</b> برای استفاده از امکانات ربات، مشاهده قیمت‌ها و ثبت سفارش، لطفاً ابتدا فرآیند <b>احراز هویت</b> را تکمیل کنید.\n\n"
    "🟢 <b>وضعیت سیستم:</b> فعال و آماده پردازش"
)

DEFAULT_VERIFIED_TPL = (
    "سلام <b>{full_name}</b> عزیز، {greeting}! 👋\n"
    "به فروشگاه دیجیتال ما خوش آمدید 🌟\n"
    "〰️〰️〰️〰️〰️〰️〰️\n"
    "👤 <b>مشخصات شما:</b>\n"
    "├─ 🆔 آیدی عددی: <code>{telegram_id}</code>\n"
    "├─ 💳 موجودی کیف پول: {wallet_balance} تومان\n"
    "└─ 🔒 وضعیت حساب: تایید شده و فعال ✅\n\n"
    "📈 <b>آمار فروشگاه:</b>\n"
    "├─ 📦 دسته‌بندی‌ها: {cat_count} بخش\n"
    "└─ 🛍 کل محصولات: {prod_count} مورد\n\n"
    "🟢 <b>وضعیت سیستم:</b> آماده دریافت سفارش\n\n"
    "👇 لطفاً برای خرید یا مدیریت حساب خود از دکمه‌های زیر استفاده کنید:"
)

def safe_format(template: str, **kwargs) -> str:
    try:
        return template.format(**kwargs)
    except Exception:
        return template

def get_greeting() -> str:
    from datetime import datetime
    hour = datetime.now().hour
    if 5 <= hour < 12:
        return "صبح بخیر ☀️"
    elif 12 <= hour < 17:
        return "ظهر بخیر 🌤"
    elif 17 <= hour < 21:
        return "عصر بخیر 🌅"
    else:
        return "شب بخیر 🌙"

from core.utils import check_user_membership

@router.callback_query(F.data == "check_membership")
async def process_check_membership_global(callback: CallbackQuery, state: FSMContext):
    async with AsyncSessionLocal() as session:
        is_member, unjoined_links = await check_user_membership(callback.bot, callback.from_user.id, session)
        if is_member:
            await callback.answer("✅ شما عضو هستید! منوی اصلی باز می‌شود...", show_alert=True)
            return await cmd_start(callback.message, state)
        else:
            await callback.answer("❌ هنوز عضو تمام کانال‌ها نشده‌اید.", show_alert=True)
            from core.utils import get_join_required_markup
            from core.emojis import p_em
            text = p_em(
                "🛑 <b>دسترسی محدود است!</b>\n\n"
                "برای استفاده از امکانات ربات، باید در کانال(های) زیر عضو باشید:\n\n"
                "👇 لطفاً پس از عضویت، روی <b>بررسی مجدد عضویت</b> کلیک کنید:"
            )
            return await callback.message.edit_text(text, reply_markup=get_join_required_markup(unjoined_links))

@router.message(CommandStart())
async def cmd_start(message: Message, state: FSMContext = None):
    if state:
        await state.clear()
    
    # Check if the message is sent by the bot (e.g. redirected from a callback)
    user_id = message.from_user.id if message.from_user else message.chat.id
    if message.from_user and message.from_user.is_bot:
        user_id = message.chat.id
        
    # اتصال به دیتابیس برای بررسی کاربر
    async with AsyncSessionLocal() as session:
        user = await get_user_by_telegram_id(session, user_id)
        if not user:
            # Detect username and full name safely
            username = message.from_user.username if (message.from_user and not message.from_user.is_bot) else message.chat.username
            
            if message.from_user and not message.from_user.is_bot:
                full_name = message.from_user.full_name
            else:
                chat_title = message.chat.first_name or ""
                if message.chat.last_name:
                    chat_title += f" {message.chat.last_name}"
                full_name = chat_title.strip() or "کاربر"
                
            # ثبت کاربر جدید
            user = await create_user(
                session, 
                telegram_id=user_id,
                username=username,
                full_name=full_name
            )

        is_admin = await ensure_runtime_admin(session, user_id)

        # تایید هویت خودکار ادمین‌ها
        if is_admin and not user.is_verified:
            user.is_verified = True
            await session.commit()

        # بررسی احراز هویت شماره موبایل (ادمین‌ها معاف هستند)
        kyc_req = await get_setting(session, "kyc_required", "false")
        if kyc_req == "true" and not user.phone and not is_admin:
            from aiogram.types import ReplyKeyboardMarkup, KeyboardButton
            from handlers.kyc_flow import KYCState
            kb = ReplyKeyboardMarkup(
                keyboard=[[KeyboardButton(text="📱 ارسال شماره موبایل (تایید خودکار)", request_contact=True)]],
                resize_keyboard=True,
                one_time_keyboard=True
            )
            # دریافت متن پویای خوش‌آمدگویی
            unverified_text_tpl = await get_setting(session, "start_text_unverified", DEFAULT_UNVERIFIED_TPL)
            unverified_text = safe_format(
                unverified_text_tpl,
                full_name=html.escape(user.full_name or "کاربر"),
                telegram_id=user.telegram_id
            )
            await message.answer(
                p_em(unverified_text + "\n\n👇 لطفاً از دکمه زیر برای تایید شماره موبایل استفاده کنید یا آن را تایپ کنید:"),
                reply_markup=kb
            )
            if state:
                await state.set_state(KYCState.waiting_for_phone)
            return

        if is_admin:
            from handlers.admin_panel import admin_dashboard
            return await admin_dashboard(message)

        # دریافت آمار پویای فروشگاه
        cat_count = await session.scalar(select(func.count(Category.id))) or 0
        prod_count = await session.scalar(select(func.count(Product.id))) or 0

        # دریافت متن پویای خوش‌آمدگویی
        greeting = get_greeting()
        verified_text_tpl = await get_setting(session, "start_text_verified", DEFAULT_VERIFIED_TPL)
        verified_text = safe_format(
            verified_text_tpl,
            full_name=html.escape(user.full_name or "کاربر"),
            greeting=greeting,
            telegram_id=user.telegram_id,
            wallet_balance=f"{user.wallet_balance:,.0f}",
            cat_count=cat_count,
            prod_count=prod_count
        )
        support_id = await get_setting(session, "support_id", "Support")

        # کاربر احراز هویت شده است (منوی اصلی)
        builder = InlineKeyboardBuilder()
        builder.button(text="🛒 خرید محصولات", callback_data="shop_menu", style="success")
        builder.button(text="💳 کیف پول", callback_data="wallet_menu", style="primary")
        builder.button(text="📦 سفارش‌های من", callback_data="my_orders", style="primary")
        builder.button(text="👤 پروفایل کاربری", callback_data="my_profile", style="primary")
        
        has_kyc_btn = (kyc_req == "true" and not user.is_verified)
        if has_kyc_btn:
            builder.button(text="🔒 احراز هویت", callback_data="start_doc_kyc", style="danger")
            
        builder.button(text="📚 قوانین و راهنما", callback_data="rules_menu", style="primary")
        builder.button(text="پشتیبانی 👨‍💻", url=f"https://t.me/{support_id.lstrip('@')}", style="primary")
        
        if not has_kyc_btn:
            builder.adjust(1, 2, 2, 1)
        else:
            builder.adjust(1, 2, 2, 2)

        await message.answer(p_em(verified_text), reply_markup=builder.as_markup())

@router.message(Command("cancel"))
async def cmd_cancel(message: Message, state: FSMContext = None):
    if state:
        await state.clear()
    await cmd_start(message, state)

@router.callback_query(F.data == "back_to_main")
async def back_to_main(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)
        
        if not user:
            await callback.answer("کاربر یافت نشد!", show_alert=True)
            return

        is_admin = await ensure_runtime_admin(session, user_id)

        # تایید هویت خودکار ادمین‌ها
        if is_admin and not user.is_verified:
            user.is_verified = True
            await session.commit()

        # بررسی احراز هویت شماره موبایل (ادمین‌ها معاف هستند)
        kyc_req = await get_setting(session, "kyc_required", "false")
        if kyc_req == "true" and not user.phone and not is_admin:
            await callback.answer("⚠️ شماره تماس شما تایید نشده است. لطفاً دستور /start را ارسال کنید.", show_alert=True)
            return

        # دریافت آمار پویای فروشگاه
        cat_count = await session.scalar(select(func.count(Category.id))) or 0
        prod_count = await session.scalar(select(func.count(Product.id))) or 0

        # دریافت متن پویای خوش‌آمدگویی
        greeting = get_greeting()
        verified_text_tpl = await get_setting(session, "start_text_verified", DEFAULT_VERIFIED_TPL)
        verified_text = safe_format(
            verified_text_tpl,
            full_name=html.escape(callback.from_user.full_name),
            greeting=greeting,
            telegram_id=user.telegram_id,
            wallet_balance=f"{user.wallet_balance:,.0f}",
            cat_count=cat_count,
            prod_count=prod_count
        )
        support_id = await get_setting(session, "support_id", "Support")

    builder = InlineKeyboardBuilder()
    builder.button(text="🛒 خرید محصولات", callback_data="shop_menu", style="success")
    builder.button(text="💳 کیف پول", callback_data="wallet_menu", style="primary")
    builder.button(text="📦 سفارش‌های من", callback_data="my_orders", style="primary")
    builder.button(text="👤 پروفایل کاربری", callback_data="my_profile", style="primary")
    
    has_kyc_btn = (kyc_req == "true" and not user.is_verified)
    if has_kyc_btn:
        builder.button(text="🔒 احراز هویت با مدارک", callback_data="start_doc_kyc", style="danger")
        
    builder.button(text="📚 قوانین و راهنما", callback_data="rules_menu", style="primary")
    builder.button(text="پشتیبانی 👨‍💻", url=f"https://t.me/{support_id.lstrip('@')}", style="primary")
    
    if is_admin:
        builder.button(text="👑 پنل مدیریت", callback_data="admin_dashboard_back", style="danger")
        builder.adjust(1, 2, 2, 2)
    else:
        if not has_kyc_btn:
            builder.adjust(1, 2, 2, 1)
        else:
            builder.adjust(1, 2, 2, 2)

    try:
        if callback.message.text:
            await callback.message.edit_text(p_em(verified_text), reply_markup=builder.as_markup())
        else:
            with suppress(TelegramBadRequest):
                await callback.message.delete()
            await callback.message.answer(p_em(verified_text), reply_markup=builder.as_markup())
    except TelegramBadRequest as e:
        if "message is not modified" not in str(e) and "there is no text in the message to edit" not in str(e):
            raise
            
    with suppress(TelegramBadRequest):
        await callback.answer()

@router.callback_query(F.data == "rules_menu")
async def show_rules(callback: CallbackQuery):
    builder = InlineKeyboardBuilder()
    builder.button(text="🔙 بازگشت", callback_data="back_to_main", style="danger")
    
    rules_text = (
        "📚 <b>قوانین و راهنمای استفاده از فروشگاه</b>\n"
        "〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️\n\n"
        "🟢 <b>قوانین عمومی:</b>\n"
        "۱. برای ثبت سفارش و استفاده از خدمات، تایید احراز هویت الزامی است.\n"
        "۲. اطلاعات ارسالی شما جهت احراز هویت کاملاً محرمانه بوده و نزد ما محفوظ است.\n\n"
        "🛒 <b>راهنمای خرید و تحویل:</b>\n"
        "🔹 گیفت کارت‌ها بلافاصله پس از خرید به صورت خودکار تحویل داده می‌شوند.\n"
        "🔹 محصولات شارژ با آیدی (مانند UC پابجی) معمولاً بین ۵ الی ۳۰ دقیقه فعال خواهند شد.\n"
        "🔹 لطفاً در وارد کردن آیدی بازی یا اطلاعات اکانت دقت فرمایید. مسئولیت وارد کردن اطلاعات اشتباه بر عهده خریدار می‌باشد.\n\n"
        "💳 <b>کیف پول و پرداخت:</b>\n"
        "🔸 امکان شارژ کیف پول به صورت ریالی (کارت به کارت) و رمز ارز (USDT) فراهم است.\n"
        "🔸 مبالغ کیف پول قابل نقد کردن نیست و فقط برای خرید از فروشگاه قابل استفاده است.\n\n"
        "👨‍💻 در صورت بروز هرگونه مشکل یا سوال، پشتیبانی ۲۴ ساعته ربات آماده پاسخگویی به شماست."
    )
    await callback.message.edit_text(p_em(rules_text), reply_markup=builder.as_markup())
    await callback.answer()

@router.callback_query(F.data == "my_profile")
async def show_profile(callback: CallbackQuery):
    user_id = callback.from_user.id
    async with AsyncSessionLocal() as session:
        user = await get_user_by_telegram_id(session, user_id)
        
    builder = InlineKeyboardBuilder()
    builder.button(text="🔙 بازگشت", callback_data="back_to_main", style="danger")
    
    await callback.message.edit_text(
        p_em(f"👤 <b>پروفایل کاربری شما</b>\n"
        f"〰️〰️〰️〰️〰️〰️〰️\n\n"
        f"🔸 <b>نام:</b> {user.full_name}\n"
        f"🔸 <b>آیدی عددی:</b> <code>{user.telegram_id}</code>\n"
        f"🔸 <b>وضعیت احراز هویت:</b> {'تایید شده ✅' if user.is_verified else 'تایید نشده ❌'}\n"
        f"🔸 <b>موجودی کیف پول:</b> {user.wallet_balance:,.0f} تومان\n\n"
        f"📅 <b>تاریخ ثبت نام:</b> {user.created_at.strftime('%Y-%m-%d')}"),
        reply_markup=builder.as_markup()
    )

from sqlalchemy import select
from database.models import Order
from services.midasbuy_service import midasbuy_status_label

@router.callback_query(F.data == "my_orders")
async def show_orders(callback: CallbackQuery):
    user_id = callback.from_user.id
    async with AsyncSessionLocal() as session:
        user = await get_user_by_telegram_id(session, user_id)
        stmt = select(Order).where(Order.user_id == user.id).order_by(Order.id.desc()).limit(5)
        orders = (await session.execute(stmt)).scalars().all()
        
    builder = InlineKeyboardBuilder()
    builder.button(text="🔙 بازگشت", callback_data="back_to_main", style="danger")
    
    if not orders:
        await callback.message.edit_text(
            p_em("📦 <b>سفارش‌های من</b>\n\nشما هنوز هیچ سفارشی ثبت نکرده‌اید."),
            reply_markup=builder.as_markup()
        )
        return
        
    text = "📦 <b>۵ سفارش آخر شما:</b>\n\n"
    for o in orders:
        status_emoji = "✅" if o.status == "completed" else "❌" if o.status in ["rejected", "refunded"] else "⏳"
        payment_status = midasbuy_status_label(getattr(o, "midasbuy_status", None))
        text += f"🔹 شماره سفارش: <code>{o.id}</code> | مبلغ: {o.amount:,.0f}T | وضعیت: {status_emoji} {payment_status}\n"
        
    await callback.message.edit_text(p_em(text), reply_markup=builder.as_markup())
