from aiogram import Router, F
from pathlib import Path

from aiogram.types import CallbackQuery, Message, ReplyKeyboardMarkup, KeyboardButton, ReplyKeyboardRemove, FSInputFile
from aiogram.fsm.context import FSMContext
from aiogram.fsm.state import State, StatesGroup
from aiogram.utils.keyboard import InlineKeyboardBuilder

from core.config import config
from database.database import AsyncSessionLocal
from database.crud import get_user_by_telegram_id, create_user
from core.emojis import p_em

router = Router()
BASE_DIR = Path(__file__).resolve().parent.parent

KYC_TYPES = {
    "irani": {
        "title": "ایرانی",
        "image": BASE_DIR / "irani.jpg",
        "media": "photo",
        "prompt": "لطفاً عکس احراز هویت خود را طبق نمونه و متن بالا ارسال کنید.",
        "invalid": "⚠️ لطفاً عکس احراز هویت خود را ارسال کنید. برای کاربران ایرانی، فقط عکس پذیرفته می‌شود.",
        "success": "⏳ <b>مدارک شما با موفقیت ارسال شد!</b>\n\nعکس احراز هویت شما جهت بررسی برای تیم پشتیبانی ارسال شد. پس از تایید توسط ادمین، نتیجه به شما اطلاع داده خواهد شد.",
        "text": (
            "📝 کارت بانکی و کارت شناسایی خودتون رو بزارید روی کاغذ و این متن رو بنویسید:\n\n\n"
            "✅ اینجانب …، فرزند....، با آیدی عددی … و شماره تماس….،  رضایت کامل خود را نسبت به خرید 🪙 یوسی (UC)، 🎮 سی‌پی (CP) و سایر آیتم‌های بازی از فروشگاه سلسو شاپ اعلام می‌نمایم.\n"
            "امضا \n"
            "✨✨✨✨✨✨✨✨✨✨✨\n"
            "لطفا در زمان ارسال احراز هویت حتما \n"
            "تاریخ انقضا و Cvv2 کارت \n"
            "رو بپوشونید \n"
            " \n"
            "اگر دسترسی به کارت بانکی ندارید لطفا فقط شماره کارت رو در انتهای متن بنویسید\n\n\n"
            "📋 کارت شناسایی می‌تونه \n"
            "یکی از این‌ها باشه هر کدوم در دسترس داشتین فرقی نمیکنه \n"
            "شناسنامه  _ کارت ملی _ رسید کارت ملی _ گواهینامه _ کارت پایان خدمت _  کارت دانشجویی ‌‌‌‌‌"
        ),
    },
    "atba": {
        "title": "اتباع",
        "image": BASE_DIR / "atba.jpg",
        "media": "video",
        "prompt": "لطفاً ویدئوی سلفی احراز هویت خود را طبق نمونه و متن بالا ارسال کنید.",
        "invalid": "⚠️ لطفاً ویدئوی سلفی احراز هویت خود را ارسال کنید. برای اتباع، فقط ویدئو پذیرفته می‌شود.",
        "success": "⏳ <b>ویدئوی احراز هویت شما با موفقیت ارسال شد!</b>\n\nویدئوی شما جهت بررسی برای تیم پشتیبانی ارسال شد. پس از تایید توسط ادمین، نتیجه به شما اطلاع داده خواهد شد.",
        "text": (
            "یک زحمت بکش لطفاً \n"
            "کارت بانکی رو بگیر کنار صورتت یک ویدئو سلفی بگیر\n"
            "خودتو معرفی کن و بگو از خرید خودم از فروشگاه سلسوشاپ رضایت دارم و بفرست."
        ),
    },
}

class KYCState(StatesGroup):
    waiting_for_phone = State()
    waiting_for_national_id_photo = State()

@router.callback_query(F.data == "start_kyc")
async def start_kyc_process(callback: CallbackQuery, state: FSMContext):
    # This callback can be triggered if a user clicks start phone verification
    # Show a reply keyboard requesting phone contact
    kb = ReplyKeyboardMarkup(
        keyboard=[[KeyboardButton(text="📱 ارسال شماره موبایل (تایید خودکار)", request_contact=True)]],
        resize_keyboard=True,
        one_time_keyboard=True
    )
    await callback.message.answer(
        p_em("📝 <b>شروع فرآیند تایید شماره تماس</b>\n\n"
        "برای شروع، لطفاً شماره موبایل خود را تایید کنید.\n\n"
        "👇 می‌توانید از دکمه زیر جهت ارسال شماره موبایل خود استفاده کنید یا شماره را به صورت دستی تایپ و ارسال نمایید:"),
        reply_markup=kb
    )
    await state.set_state(KYCState.waiting_for_phone)
    await callback.answer()

def normalize_phone(phone_str: str) -> str | None:
    if not phone_str:
        return None
    # Convert Persian/Arabic digits to English digits
    persian_digits = "۰۱۲۳۴۵۶۷۸۹"
    arabic_digits = "٠١٢٣٤٥٦٧٨٩"
    for i in range(10):
        phone_str = phone_str.replace(persian_digits[i], str(i)).replace(arabic_digits[i], str(i))
    
    # Remove all non-digit characters
    cleaned = "".join([c for c in phone_str if c.isdigit()])
    
    # Standardize Iranian phone formats
    if cleaned.startswith("0098") and len(cleaned) == 14:
        cleaned = cleaned[2:]
    elif cleaned.startswith("09") and len(cleaned) == 11:
        cleaned = "98" + cleaned[1:]
    elif cleaned.startswith("9") and len(cleaned) == 10:
        cleaned = "98" + cleaned
        
    # Standard check: starts with 989 and has 12 digits
    if cleaned.startswith("989") and len(cleaned) == 12:
        return cleaned
        
    # Fallback check for reasonable lengths
    if 10 <= len(cleaned) <= 15:
        return cleaned
        
    return None

@router.message(KYCState.waiting_for_phone)
async def process_phone(message: Message, state: FSMContext):
    phone = None
    if message.contact:
        phone = normalize_phone(message.contact.phone_number)
    elif message.text:
        phone = normalize_phone(message.text)
            
    if not phone:
        kb = ReplyKeyboardMarkup(
            keyboard=[[KeyboardButton(text="📱 ارسال شماره موبایل (تایید خودکار)", request_contact=True)]],
            resize_keyboard=True,
            one_time_keyboard=True
        )
        await message.answer(
            p_em("⚠️ شماره موبایل نامعتبر است. لطفاً شماره خود را به صورت دستی ارسال کنید (مانند 09123456789) یا از دکمه زیر برای ارسال استفاده کنید:"),
            reply_markup=kb
        )
        return
        
    # ذخیره شماره تماس در دیتابیس
    async with AsyncSessionLocal() as session:
        user = await get_user_by_telegram_id(session, message.from_user.id)
        if not user:
            user = await create_user(
                session,
                telegram_id=message.from_user.id,
                username=message.from_user.username,
                full_name=message.from_user.full_name
            )
        user.phone = phone
        await session.commit()
            
    await message.answer(
        p_em("✅ شماره موبایل شما با موفقیت تایید شد. وارد منوی اصلی می‌شوید..."),
        reply_markup=ReplyKeyboardRemove()
    )
    await state.clear()
    
    # انتقال به منوی اصلی
    from handlers.user_panel import cmd_start
    await cmd_start(message, state)

@router.callback_query(F.data == "start_doc_kyc")
async def start_doc_kyc_process(callback: CallbackQuery, state: FSMContext):
    await state.clear()
    builder = InlineKeyboardBuilder()
    builder.button(text="🇮🇷 ایرانی هستم", callback_data="kyc_type_irani", style="primary")
    builder.button(text="🇦🇫 اتباع هستم", callback_data="kyc_type_atba", style="primary")
    builder.button(text="❌ انصراف", callback_data="back_to_main", style="danger")
    builder.adjust(1)
    
    await callback.message.edit_text(
        p_em(
            "📝 <b>احراز هویت</b>\n\n"
            "لطفاً نوع احراز هویت خود را انتخاب کنید تا راهنمای مخصوص همان حالت برای شما ارسال شود:"
        ),
        reply_markup=builder.as_markup()
    )
    await callback.answer()

@router.callback_query(F.data.startswith("kyc_type_"))
async def select_doc_kyc_type(callback: CallbackQuery, state: FSMContext):
    kyc_type = callback.data.removeprefix("kyc_type_")
    kyc_info = KYC_TYPES.get(kyc_type)
    if not kyc_info:
        await callback.answer("نوع احراز هویت نامعتبر است.", show_alert=True)
        return

    await state.update_data(kyc_type=kyc_type)

    builder = InlineKeyboardBuilder()
    builder.button(text="❌ انصراف", callback_data="back_to_main", style="danger")

    image_path = kyc_info["image"]
    caption = p_em(
        f"📝 <b>راهنمای احراز هویت {kyc_info['title']}</b>\n\n"
        f"{kyc_info['text']}\n\n"
        f"{kyc_info['prompt']}"
    )

    try:
        await callback.message.delete()
    except Exception:
        pass

    if image_path.exists():
        await callback.message.answer_photo(
            photo=FSInputFile(str(image_path)),
            caption=caption,
            reply_markup=builder.as_markup()
        )
    else:
        await callback.message.answer(caption, reply_markup=builder.as_markup())

    await state.set_state(KYCState.waiting_for_national_id_photo)
    await callback.answer()

async def send_kyc_to_admin(message: Message, state: FSMContext, file_id: str, media_type: str):
    data = await state.get_data()
    kyc_type = data.get("kyc_type", "irani")
    kyc_info = KYC_TYPES.get(kyc_type, KYC_TYPES["irani"])
    
    async with AsyncSessionLocal() as session:
        user = await get_user_by_telegram_id(session, message.from_user.id)
        phone = user.phone if user else "نامشخص"
        
    builder = InlineKeyboardBuilder()
    builder.button(text="✅ تایید", callback_data=f"approve_kyc_{message.from_user.id}", style="success")
    builder.button(text="❌ رد", callback_data=f"reject_kyc_{message.from_user.id}", style="danger")
    
    admin_caption = p_em(
        f"🚨 <b>درخواست احراز هویت جدید</b>\n\n"
        f"👤 کاربر: {message.from_user.full_name}\n"
        f"🆔 آیدی: <code>{message.from_user.id}</code>\n"
        f"📱 شماره تماس: <code>{phone}</code>\n"
        f"🧾 نوع احراز: <b>{kyc_info['title']}</b>"
    )
    
    try:
        async with AsyncSessionLocal() as db_session:
            from database.crud import get_group_id
            admin_group_id = await get_group_id(db_session, "kyc", config.admin_group_id)

        if media_type == "video":
            await message.bot.send_video(
                chat_id=admin_group_id,
                video=file_id,
                caption=admin_caption,
                reply_markup=builder.as_markup()
            )
        else:
            await message.bot.send_photo(
                chat_id=admin_group_id,
                photo=file_id,
                caption=admin_caption,
                reply_markup=builder.as_markup()
            )
        
        await message.answer(p_em(kyc_info["success"]))
    except Exception as e:
        print(f"Error sending kyc media: {e}")
        await message.answer(p_em("❌ مشکلی در ارسال اطلاعات پیش آمد. لطفاً به پشتیبانی پیام دهید."))
        
    await state.clear()
    from handlers.user_panel import cmd_start
    await cmd_start(message, state)

@router.message(KYCState.waiting_for_national_id_photo, F.photo)
async def process_national_id_photo(message: Message, state: FSMContext):
    data = await state.get_data()
    kyc_info = KYC_TYPES.get(data.get("kyc_type", "irani"), KYC_TYPES["irani"])
    if kyc_info["media"] != "photo":
        await process_national_id_invalid(message, state)
        return

    await send_kyc_to_admin(message, state, message.photo[-1].file_id, "photo")

@router.message(KYCState.waiting_for_national_id_photo, F.video)
async def process_national_id_video(message: Message, state: FSMContext):
    data = await state.get_data()
    kyc_info = KYC_TYPES.get(data.get("kyc_type", "atba"), KYC_TYPES["atba"])
    if kyc_info["media"] != "video":
        await process_national_id_invalid(message, state)
        return

    await send_kyc_to_admin(message, state, message.video.file_id, "video")

@router.message(KYCState.waiting_for_national_id_photo)
async def process_national_id_invalid(message: Message, state: FSMContext):
    data = await state.get_data()
    kyc_info = KYC_TYPES.get(data.get("kyc_type", "irani"), KYC_TYPES["irani"])
    builder = InlineKeyboardBuilder()
    builder.button(text="❌ انصراف", callback_data="back_to_main", style="danger")
    await message.answer(
        p_em(kyc_info["invalid"]),
        reply_markup=builder.as_markup()
    )
