import asyncio
import logging
import html
import re
import aiosqlite
from aiogram import Bot, Dispatcher, F, Router
from aiogram.types import (
    Message, 
    ChatJoinRequest, 
    InlineKeyboardMarkup, 
    InlineKeyboardButton, 
    CallbackQuery,
    ReplyKeyboardMarkup,     
    KeyboardButton,          
    ReplyKeyboardRemove,
    ChatMemberUpdated
)
from aiogram.fsm.context import FSMContext
from aiogram.fsm.state import State, StatesGroup
from aiogram.fsm.storage.base import StorageKey
from aiogram.exceptions import TelegramForbiddenError
from aiogram.filters import CommandStart, StateFilter, Command  

# ================= تنظیمات اصلی =================
BOT_TOKEN = "8352319687:AAF7tVa3XT2OA498442OqQVWULzM9UHyojI"
GROUP_ID = -1004388033591  # آیدی عددی گروه اصلی (گروهی که کاربران جوین میدهند)
ADMIN_GROUP_ID = -1003896645188  # 🔴 آیدی عددی گروه ادمین‌ها
ADMIN_IDS = [8534072839, 6766127763, 5127954521, 8385110596, 6692457036, 5331003106, 6546088166]

logging.basicConfig(level=logging.WARNING)

# ================= قوانین =================

TOS_TEXT = (
    "💫 <b>چندتا قانون کوچیک برای اینکه کنار هم بیشتر خوش بگذره</b> 💫\n\n"
    "1️⃣ با هم مهربون باشیم؛ احترام، پایه‌ی رفاقتمونه 🤍\n"
    "2️⃣ بی‌احترامی، توهین و مسخره‌کردن همدیگه جایی توی گپ نداره 🚫\n"
    "3️⃣ دعوا و حاشیه رو بذاریم کنار؛ اومدیم خوش بگذرونیم 😌✨\n"
    "4️⃣ اسپم و پیام‌های پشت‌سرهم نفرستیم تا گپ شلوغ و آزاردهنده نشه 📵\n"
    "5️⃣ تبلیغات رو فقط با هماهنگی ادمین‌ها انجام بدیم 📢\n"
    "6️⃣ حریم شخصی همدیگه رو جدی بگیریم و بدون اجازه چیزی از کسی منتشر نکنیم 🔐\n"
    "7️⃣ بحث‌های سیاسی و موضوعات تنش‌زا رو وارد گپ نکنیم 🕊️\n"
    "8️⃣ اگه با کسی مشکلی پیش اومد، به‌جای دعوا با ادمین‌ها درمیون بذاریم 🤝\n"
    "9️⃣ هوای ممبرهای جدید رو داشته باشیم؛ یه سلام ساده می‌تونه شروع یه رفاقت قشنگ باشه 🫶\n"
    "🔟 مهم‌تر از همه: خودت باش، خوش بگذرون و بذار بقیه هم کنار تو احساس راحتی کنن 💙\n\n"
    "✨ اینجا قرار نیست فقط یه گپ باشه؛ قراره یه جمع صمیمی و دوست‌داشتنی باشه.\n"
    "خوشحالیم که کنارمون هستی 🌱"
)

router = Router()


cancel_kb = ReplyKeyboardMarkup(
    keyboard=[[KeyboardButton(text="❌ انصراف از ثبت‌نام")]],
    resize_keyboard=True
)

form_kb = ReplyKeyboardMarkup(
    keyboard=[
        [KeyboardButton(text="🔙 بازگشت به مرحله قبل")],
        [KeyboardButton(text="❌ انصراف از ثبت‌نام")]
    ],
    resize_keyboard=True
)

# ================= 0. توابع پیشرفته دیتابیس (Asynchronous) =================
async def init_db():
    async with aiosqlite.connect("bot_database.sqlite") as db:
        await db.execute('''
            CREATE TABLE IF NOT EXISTS users (
                user_id INTEGER PRIMARY KEY,
                status TEXT,
                join_date DATETIME DEFAULT CURRENT_TIMESTAMP,
                age TEXT,
                location TEXT,
                bio TEXT,
                discovery TEXT,
                interest TEXT,
                activities TEXT,
                lgbtq TEXT,
                position TEXT,
                referrer_id INTEGER,
                first_name TEXT,       -- 🔴 اضافه شدن ذخیره نام کاربر
                approved_date DATETIME -- 🔴 اضافه شدن تاریخ تایید ادمین
            )
        ''')
        # آپدیت دیتابیس فعلی شما بدون پاک شدن اطلاعات قبلی
        try: await db.execute("ALTER TABLE users ADD COLUMN referrer_id INTEGER")
        except Exception: pass 
        try: await db.execute("ALTER TABLE users ADD COLUMN first_name TEXT")
        except Exception: pass 
        try: await db.execute("ALTER TABLE users ADD COLUMN approved_date DATETIME")
        except Exception: pass 
            
        await db.execute('CREATE INDEX IF NOT EXISTS idx_status ON users(status)')
        await db.execute('CREATE INDEX IF NOT EXISTS idx_referrer ON users(referrer_id)')
        await db.commit()

async def add_pending_user(user_id: int, first_name: str = None):
    async with aiosqlite.connect("bot_database.sqlite") as db:
        async with db.execute("SELECT user_id FROM users WHERE user_id = ?", (user_id,)) as cursor:
            exists = await cursor.fetchone()
        
        if exists:
            if first_name:
                await db.execute('UPDATE users SET status = "pending", join_date = CURRENT_TIMESTAMP, first_name = ? WHERE user_id = ?', (first_name, user_id))
            else:
                await db.execute('UPDATE users SET status = "pending", join_date = CURRENT_TIMESTAMP WHERE user_id = ?', (user_id,))
        else:
            try:
                # تلاش برای ثبت کاربر جدید
                if first_name:
                    await db.execute('INSERT INTO users (user_id, status, join_date, first_name) VALUES (?, "pending", CURRENT_TIMESTAMP, ?)', (user_id, first_name))
                else:
                    await db.execute('INSERT INTO users (user_id, status, join_date) VALUES (?, "pending", CURRENT_TIMESTAMP)', (user_id,))
            except Exception:
                # 🔴 مهار ارورِ تداخل همزمان (Race Condition):
                # اگر کاربر در همین میلی‌ثانیه ساخته شده بود، به جای کرش کردن، آپدیتش کن
                if first_name:
                    await db.execute('UPDATE users SET status = "pending", join_date = CURRENT_TIMESTAMP, first_name = ? WHERE user_id = ?', (first_name, user_id))
                else:
                    await db.execute('UPDATE users SET status = "pending", join_date = CURRENT_TIMESTAMP WHERE user_id = ?', (user_id,))
        
        await db.commit()

async def update_status(user_id: int, status: str):
    async with aiosqlite.connect("bot_database.sqlite") as db:
        await db.execute('UPDATE users SET status = ? WHERE user_id = ?', (status, user_id))
        await db.commit()

async def save_form_data(user_id: int, data: dict):
    async with aiosqlite.connect("bot_database.sqlite") as db:
        await db.execute('''
            UPDATE users 
            SET status = "completed", 
                age = ?, location = ?, bio = ?, discovery = ?, interest = ?, activities = ?, lgbtq = ?, position = ?
            WHERE user_id = ?
        ''', (
            data.get('age', ''), data.get('location', ''), data.get('bio', ''), 
            data.get('discovery', ''), data.get('interest', ''), data.get('activities', ''), 
            data.get('lgbtq', ''), data.get('position', ''), user_id
        ))
        await db.commit()

async def get_user_status(user_id: int):
    """دریافت وضعیت فعلی کاربر از دیتابیس"""
    async with aiosqlite.connect("bot_database.sqlite") as db:
        async with db.execute("SELECT status FROM users WHERE user_id = ?", (user_id,)) as cursor:
            row = await cursor.fetchone()
            return row[0] if row else None

async def get_pending_users():
    """دریافت لیست کسانی که فرمشان ناقص مانده"""
    async with aiosqlite.connect("bot_database.sqlite") as db:
        async with db.execute('SELECT user_id FROM users WHERE status IN ("pending", "reminded")') as cursor:
            users = await cursor.fetchall()
    return [u[0] for u in users]

# ================= وظیفه پس‌زمینه (حذف خودکار و یادآور) =================
async def timeout_checker(bot: Bot, dispatcher: Dispatcher):
    while True:
        try:
            async with aiosqlite.connect("bot_database.sqlite") as db:
                # ۱. ارسال یادآور بعد از ۱ ساعت (هوشمند)
                async with db.execute('''
                    SELECT user_id, status FROM users 
                    WHERE status IN ('pending', 'started', 'reading_tos') 
                    AND datetime(join_date) <= datetime('now', '-1 hours')
                ''') as cursor:
                    pending_users = await cursor.fetchall()
                
                for user_id, status in pending_users:
                    await update_status(user_id, "reminded")
                    try:
                        if status == "pending":
                            msg = "⚠️ <b>یادآوری:</b>\nشما در حال ثبت‌نام بودید اما هنوز فرم خود را کامل نکرده‌اید! لطفاً برای ادامه، به سوال ربات پاسخ دهید."
                        else:
                            msg = "⚠️ <b>یادآوری:</b>\nشما ربات را استارت زدید اما مراحل ثبت‌نام را شروع نکردید. برای ورود به گروه لطفاً قوانین را تایید کرده و فرم را پر کنید."
                            
                        await bot.send_message(chat_id=user_id, text=msg, parse_mode="HTML")
                    except Exception:
                        pass
                    await asyncio.sleep(0.05)
                
                # ۲. لغو درخواست بعد از ۲۴ ساعت
                async with db.execute('''
                    SELECT user_id, status FROM users 
                    WHERE status IN ('pending', 'reminded', 'completed', 'pending_admin') 
                    AND datetime(join_date) <= datetime('now', '-24 hours')
                ''') as cursor:
                    expired_users = await cursor.fetchall()
                    
                for user_id, status in expired_users:
                    await update_status(user_id, "expired")
                    
                    # 🔴 آپدیت منطقی: فقط اگر کاربر ریکوئست تلگرامی داده بود، لغوش کن
                    if status == "pending_admin":
                        try:
                            await bot.decline_chat_join_request(chat_id=GROUP_ID, user_id=user_id)
                        except Exception:
                            pass
                            
                    try:
                        await bot.send_message(
                            chat_id=user_id, 
                            text="⏳ زمان ۲۴ ساعته شما برای تکمیل فرم به پایان رسید و درخواست شما لغو شد.\nدر صورت تمایل می‌توانید مجدداً اقدام کنید."
                        )
                        state_in_pv = FSMContext(
                            storage=dispatcher.storage,
                            key=StorageKey(bot_id=bot.id, user_id=user_id, chat_id=user_id, destiny='default')
                        )
                        await state_in_pv.clear()
                    except Exception:
                        pass
                    await asyncio.sleep(0.05) 
        except Exception as e:
            logging.error(f"خطا در چک کننده تایم‌اوت: {e}")
        
        await asyncio.sleep(600)

# ================= رویداد روشن شدن ربات =================
async def on_startup(bot: Bot, dispatcher: Dispatcher):
    print("🟢 Bot is starting... Checking database...")
    await init_db()  
    asyncio.create_task(timeout_checker(bot, dispatcher))
    
    # 🔴 جلوگیری از اسپم: فقط پاک کردن استیت کاربران ناقص بدون ارسال پیام
    pending_users = await get_pending_users()  
    for user_id in pending_users:
        try:
            state_in_pv = FSMContext(
                storage=dispatcher.storage,
                key=StorageKey(bot_id=bot.id, user_id=user_id, chat_id=user_id, destiny='default')
            )
            await state_in_pv.clear()
            # وضعیت در دیتابیس را به cancelled تغییر می‌دهیم تا از لیست در حال بررسی خارج شوند
            await update_status(user_id, "cancelled")
        except Exception:
            pass

# ================= تعریف مراحل فرم =================
class JoinForm(StatesGroup):
    q1_age = State()
    q2_location = State()
    q3_bio = State()
    q4_discovery = State()
    q5_interest = State()
    q6_activities = State()
    q7_lgbtq = State()
    q8_position = State()  


# ================= تابع بررسی متن استاندارد (ضد فونت فانتزی) =================
def is_valid_text(text: str) -> bool:
    pattern = re.compile(r'^[\u0600-\u06FF\u0698\u067E\u0686\u06AF\u200C\sA-Za-z0-9۰-۹.,!?;:\'\"()\[\]{}_\-+=*&^%$#@~`\\|/<>]+$')
    return bool(pattern.match(text))

# ================= 1. هندلر استارت =================
@router.message(CommandStart(), StateFilter("*"))
async def cmd_start(message: Message, state: FSMContext):
    await state.clear()
    args = message.text.split()
    referrer_id = None
    if len(args) > 1 and args[1].startswith("ref_"):
        try:
            referrer_id = int(args[1].split("_")[1])
            if referrer_id == message.from_user.id:
                referrer_id = None
        except ValueError:
            pass
            
    safe_first_name = message.from_user.first_name
    async with aiosqlite.connect("bot_database.sqlite") as db:
        async with db.execute("SELECT user_id FROM users WHERE user_id = ?", (message.from_user.id,)) as cursor:
            exists = await cursor.fetchone()
        
        if exists:
            await db.execute('UPDATE users SET first_name = ? WHERE user_id = ?', (safe_first_name, message.from_user.id))
            if referrer_id:
                await db.execute('UPDATE users SET referrer_id = ? WHERE user_id = ? AND status != "approved"', (referrer_id, message.from_user.id))
        else:
            await db.execute('INSERT INTO users (user_id, status, referrer_id, first_name) VALUES (?, "started", ?, ?)', (message.from_user.id, referrer_id, safe_first_name))
        await db.commit()
    
    welcome_text = (
        "🌟 <b>به سیستم احراز هویت گروه خوش آمدید!</b> 🌟\n\n"
        "برای حفظ امنیت و فضای صمیمی گروه، ورود اعضای جدید نیازمند تایید قوانین و تکمیل فرم است.\n\n"
        "👇 <b>برای شروع مراحل، روی دکمه زیر کلیک کنید:</b>"
    )
    keyboard = InlineKeyboardMarkup(inline_keyboard=[
        [InlineKeyboardButton(text="🚀 شروع ثبت‌نام", callback_data="start_reg")]
    ])
    await message.answer(text=welcome_text, reply_markup=keyboard, parse_mode="HTML")

# ================= 2. دکمه شروع ثبت نام (ارسال قوانین) =================
@router.callback_query(F.data == "start_reg")
async def start_reg_handler(call: CallbackQuery):
    user_id = call.from_user.id
    
    # 🔴 آپدیت جدید: تغییر وضعیت کاربر به "در حال خواندن قوانین"
    await update_status(user_id, "reading_tos")
    
    keyboard = InlineKeyboardMarkup(inline_keyboard=[
        [InlineKeyboardButton(text="✅ قوانین رو می‌پذیرم", callback_data=f"tos_accept_{user_id}")],
        [InlineKeyboardButton(text="❌ نمی‌پذیرم", callback_data=f"tos_decline_{user_id}")]
    ])
    
    await call.message.edit_text(TOS_TEXT, reply_markup=keyboard, parse_mode="HTML")

# ================= 3. پردازش تایید یا رد قوانین =================
@router.callback_query(F.data.startswith("tos_accept_") | F.data.startswith("tos_decline_"))
async def tos_decision(call: CallbackQuery, bot: Bot, state: FSMContext):  
    action, user_id_str = call.data.split("_")[1], call.data.split("_")[2]
    target_user_id = int(user_id_str)
    
    if call.from_user.id != target_user_id:
        await call.answer("این دکمه مربوط به شما نیست!", show_alert=True)
        return

    if action == "accept":
        try:
            current_status = await get_user_status(target_user_id)
            if current_status == "approved":
                await call.message.edit_text("✅ <b>شما قبلاً احراز هویت شده‌اید!</b>\nنیازی به ثبت‌نام مجدد نیست.", parse_mode="HTML")
                return
        except Exception:
            pass

        await call.message.edit_text("✅ <b>قوانین پذیرفته شد!</b>\n\n⏳ <i>لطفاً به سوالات فرم پاسخ دهید:</i>", parse_mode="HTML")
        await add_pending_user(target_user_id, call.from_user.first_name) 
        await state.set_state(JoinForm.q1_age)
        
        await bot.send_message(
            chat_id=target_user_id,
            text="1️⃣ چند سال سن دارید؟ (اختیاری - می‌توانید بنویسید '-')",
            reply_markup=cancel_kb
        )
            
    elif action == "decline":
        await call.message.edit_text("❌ <b>شما قوانین را نپذیرفتید. مراحل عضویت لغو شد.</b>", parse_mode="HTML")
        await update_status(target_user_id, "rejected")

# ================= 4. لغو فرم توسط کاربر =================
@router.message(Command("cancel"))
@router.message(F.text == "❌ انصراف از ثبت‌نام")
async def cancel_form(message: Message, state: FSMContext, bot: Bot):
    current_state = await state.get_state()
    if current_state is None:
        return
    
    user_id = message.from_user.id
    await state.clear()
    
    current_status = await get_user_status(user_id)
    await update_status(user_id, "cancelled")
    
    if current_status == "pending_admin":
        try:
            await bot.decline_chat_join_request(chat_id=GROUP_ID, user_id=user_id)
        except Exception as e:
            logging.error(f"خطا در رد درخواست جوین هنگام انصراف: {e}")
            pass
        
    await message.answer(
        "❌ مراحل ثبت‌نام با موفقیت لغو شد و درخواست ورود شما به گروه نیز (در صورت وجود) رد شد.\nهر زمان آماده بودید می‌توانید مجدداً اقدام کنید.", 
        reply_markup=ReplyKeyboardRemove()
    )

# ================= 🔴 دکمه بازگشت به مرحله قبل =================
@router.message(F.text == "🔙 بازگشت به مرحله قبل", StateFilter(JoinForm))
async def back_step(message: Message, state: FSMContext):
    current_state = await state.get_state()
    user_data = await state.get_data() # گرفتن جواب‌های قبلی کاربر
    
    # تابعی برای ساخت پیام همراه با جواب قبلی کاربر
    def build_text(question, field_name):
        prev_ans = user_data.get(field_name, "ثبت نشده")
        return f"{question}\n\n📝 <i>جواب قبلی شما:</i> <b>{html.escape(prev_ans)}</b>\n\n(اگر می‌خواهید تغییر کند، جواب جدید را تایپ کنید. اگر می‌خواهید همین بماند، دوباره همان را بفرستید)"

    if current_state == JoinForm.q2_location.state:
        await state.set_state(JoinForm.q1_age)
        await message.answer(build_text("1️⃣ چند سال سن دارید؟ (اختیاری - می‌توانید بنویسید '-')", "age"), reply_markup=cancel_kb, parse_mode="HTML")
    elif current_state == JoinForm.q3_bio.state:
        await state.set_state(JoinForm.q2_location)
        await message.answer(build_text("2️⃣ کجا زندگی میکنید؟ (اختیاری - می‌توانید بنویسید '-')", "location"), reply_markup=form_kb, parse_mode="HTML")
    elif current_state == JoinForm.q4_discovery.state:
        await state.set_state(JoinForm.q3_bio)
        await message.answer(build_text("3️⃣ خودتان را مختصر معرفی کنید:", "bio"), reply_markup=form_kb, parse_mode="HTML")
    elif current_state == JoinForm.q5_interest.state:
        await state.set_state(JoinForm.q4_discovery)
        await message.answer(build_text("4️⃣ چگونه با گروه آشنا شدید؟", "discovery"), reply_markup=form_kb, parse_mode="HTML")
    elif current_state == JoinForm.q6_activities.state:
        await state.set_state(JoinForm.q5_interest)
        await message.answer(build_text("5️⃣ چه چیزی در مورد این گروه برای شما جالب است؟", "interest"), reply_markup=form_kb, parse_mode="HTML")
    elif current_state == JoinForm.q7_lgbtq.state:
        await state.set_state(JoinForm.q6_activities)
        await message.answer(build_text("6️⃣ به چه فعالیت‌هایی علاقه دارید؟", "activities"), reply_markup=form_kb, parse_mode="HTML")
    elif current_state == JoinForm.q8_position.state:
        await state.set_state(JoinForm.q7_lgbtq)
        await message.answer(build_text("7️⃣ نظرتون راجب جامعه LGBTQIA+ چیه؟", "lgbtq"), reply_markup=form_kb, parse_mode="HTML")
    else:
        await message.answer("شما در مرحله اول هستید. در صورت تمایل به خروج، گزینه انصراف را بزنید.", reply_markup=cancel_kb)

# ================= 5. پردازش فرم و سوالات =================
@router.message(StateFilter(JoinForm), ~F.text)
async def invalid_form_input(message: Message):
    await message.answer("⚠️ لطفاً فقط از پیام‌های متنی (Text) استفاده کنید. ارسال عکس، استیکر، گیف یا ویس در فرم مجاز نیست.")

@router.message(JoinForm.q1_age, F.text)
async def process_q1(message: Message, state: FSMContext):
    if not is_valid_text(message.text):
        await message.answer("⚠️ <b>اخطار فونت غیرمجاز:</b>\nلطفاً از کیبورد استاندارد استفاده کنید. استفاده از فونت‌های فانتزی مجاز نیست.", parse_mode="HTML")
        return
    await state.update_data(age=message.text)
    # 🔴 تغییر کیبورد به فرم‌دار از سوال دوم
    await message.answer("2️⃣ کجا زندگی میکنید؟ (اختیاری - می‌توانید بنویسید '-')", reply_markup=form_kb)
    await state.set_state(JoinForm.q2_location)

@router.message(JoinForm.q2_location, F.text)
async def process_q2(message: Message, state: FSMContext):
    if not is_valid_text(message.text):
        await message.answer("⚠️ <b>اخطار فونت غیرمجاز:</b>\nلطفاً از کیبورد استاندارد استفاده کنید. استفاده از فونت‌های فانتزی مجاز نیست.", parse_mode="HTML")
        return
    await state.update_data(location=message.text)
    await message.answer("3️⃣ خودتان را مختصر معرفی کنید:", reply_markup=form_kb)
    await state.set_state(JoinForm.q3_bio)

@router.message(JoinForm.q3_bio, F.text)
async def process_q3(message: Message, state: FSMContext):
    if not is_valid_text(message.text):
        await message.answer("⚠️ <b>اخطار فونت غیرمجاز:</b>\nلطفاً از کیبورد استاندارد استفاده کنید. استفاده از فونت‌های فانتزی مجاز نیست.", parse_mode="HTML")
        return
    await state.update_data(bio=message.text)
    await message.answer("4️⃣ چگونه با گروه آشنا شدید؟", reply_markup=form_kb)
    await state.set_state(JoinForm.q4_discovery)

@router.message(JoinForm.q4_discovery, F.text)
async def process_q4(message: Message, state: FSMContext):
    if not is_valid_text(message.text):
        await message.answer("⚠️ <b>اخطار فونت غیرمجاز:</b>\nلطفاً از کیبورد استاندارد استفاده کنید. استفاده از فونت‌های فانتزی مجاز نیست.", parse_mode="HTML")
        return
    await state.update_data(discovery=message.text)
    await message.answer("5️⃣ چه چیزی در مورد این گروه برای شما جالب است؟", reply_markup=form_kb)
    await state.set_state(JoinForm.q5_interest)

@router.message(JoinForm.q5_interest, F.text)
async def process_q5(message: Message, state: FSMContext):
    if not is_valid_text(message.text):
        await message.answer("⚠️ <b>اخطار فونت غیرمجاز:</b>\nلطفاً از کیبورد استاندارد استفاده کنید. استفاده از فونت‌های فانتزی مجاز نیست.", parse_mode="HTML")
        return
    await state.update_data(interest=message.text)
    await message.answer("6️⃣ به چه فعالیت‌هایی علاقه دارید؟", reply_markup=form_kb)
    await state.set_state(JoinForm.q6_activities)

@router.message(JoinForm.q6_activities, F.text)
async def process_q6(message: Message, state: FSMContext):
    if not is_valid_text(message.text):
        await message.answer("⚠️ <b>اخطار فونت غیرمجاز:</b>\nلطفاً از کیبورد استاندارد استفاده کنید. استفاده از فونت‌های فانتزی مجاز نیست.", parse_mode="HTML")
        return
    await state.update_data(activities=message.text)
    await message.answer("7️⃣ نظرتون راجب جامعه LGBTQIA+ چیه؟", reply_markup=form_kb)
    await state.set_state(JoinForm.q7_lgbtq)

@router.message(JoinForm.q7_lgbtq, F.text)
async def process_q7(message: Message, state: FSMContext):
    if not is_valid_text(message.text):
        await message.answer("⚠️ <b>اخطار فونت غیرمجاز:</b>\nلطفاً از کیبورد استاندارد استفاده کنید. استفاده از فونت‌های فانتزی مجاز نیست.", parse_mode="HTML")
        return
    await state.update_data(lgbtq=message.text)
    await message.answer("8️⃣ پوز (گرایش) شما چیست؟", reply_markup=form_kb)
    await state.set_state(JoinForm.q8_position)

@router.message(JoinForm.q8_position, F.text)
async def process_q8(message: Message, state: FSMContext, bot: Bot):
    if not is_valid_text(message.text):
        await message.answer("⚠️ <b>اخطار فونت غیرمجاز:</b>\nلطفاً از کیبورد استاندارد استفاده کنید. استفاده از فونت‌های فانتزی مجاز نیست.", parse_mode="HTML")
        return
        
    user_id = message.from_user.id
    user_data = await state.get_data()
    user_data['position'] = message.text
    
    await save_form_data(user_id, user_data)  
    await state.clear()
    
    temp_msg = await message.answer("⏳", reply_markup=ReplyKeyboardRemove())
    try:
        await temp_msg.delete()
    except Exception:
        pass
    
    try:
        chat = await bot.get_chat(chat_id=GROUP_ID)
        invite_link = chat.invite_link
        if not invite_link:
            invite_link = await bot.export_chat_invite_link(chat_id=GROUP_ID)
            
        text = (
            "✅ <b>فرم شما با موفقیت تکمیل شد!</b>\n\n"
            "برای ارسال این فرم به تیم مدیریت، لطفاً روی دکمه زیر کلیک کنید و در صفحه گروه، دکمه <b>Request to Join</b> را بزنید.\n\n"
            "⏳ <i>به محض ارسال درخواست، فرم شما برای ادمین‌ها ارسال می‌شود.</i>"
        )
        keyboard = InlineKeyboardMarkup(inline_keyboard=[
            [InlineKeyboardButton(text="🔗 درخواست ورود به گروه", url=invite_link)]
        ])
        
        await message.answer(text, reply_markup=keyboard, parse_mode="HTML")
        
    except Exception as e:
        logging.error(f"خطا در تولید لینک: {e}")
        await message.answer("⚠️ فرم ثبت شد اما در ساخت لینک ورود به گروه مشکلی پیش آمد.")

# ================= 6. دریافت درخواست جوین و ارسال فرم به ادمین =================
@router.chat_join_request(F.chat.id == GROUP_ID)
async def handle_join_request(update: ChatJoinRequest, bot: Bot):
    user_id = update.from_user.id
    
    try:
        current_status = await get_user_status(user_id)
        
        if current_status in ["approved", "left"]:
            try:
                await bot.approve_chat_join_request(chat_id=GROUP_ID, user_id=user_id)
                await update_status(user_id, "approved") 
                await bot.send_message(chat_id=user_id, text="🎉 <b>خوش برگشتی!</b>\nشما قبلاً احراز هویت شده بودید، بنابراین درخواست ورودتان به صورت خودکار تایید شد.", parse_mode="HTML")
            except Exception: pass
            return  
            
        elif current_status == "completed":
            await update_status(user_id, "pending_admin")
            
            async with aiosqlite.connect("bot_database.sqlite") as db:
                async with db.execute("SELECT age, location, bio, discovery, interest, activities, lgbtq, position, referrer_id FROM users WHERE user_id = ?", (user_id,)) as cursor:
                    row = await cursor.fetchone()
                    
            if not row: return
            
            age, location, bio, discovery, interest, activities, lgbtq, position, ref_id = row
            
            referrer_name_text = "ندارد (عضویت مستقیم / لینک عمومی)"
            if ref_id:
                try:
                    async with aiosqlite.connect("bot_database.sqlite") as db:
                        async with db.execute("SELECT first_name FROM users WHERE user_id = ?", (ref_id,)) as cursor:
                            ref_info = await cursor.fetchone()
                    
                    if ref_info and ref_info[0]:
                        ref_name = html.escape(ref_info[0])
                        referrer_name_text = f"<a href='tg://user?id={ref_id}'>{ref_name}</a> (<code>{ref_id}</code>)"
                    else:
                        referrer_name_text = f"کاربر (<code>{ref_id}</code>)"
                    
                    safe_invited_name = html.escape(update.from_user.first_name)
                    await bot.send_message(
                        chat_id=ref_id, 
                        text=(
                            f"⏳ <b>زیرمجموعه جدید در انتظار تایید!</b>\n\n"
                            f"کاربر <a href='tg://user?id={user_id}'>{safe_invited_name}</a> با لینک شما ثبت‌نام کرد و درخواست عضویت داد.\n"
                            f"<i>به محض تایید ادمین، به آمار قطعی شما اضافه خواهد شد.</i>"
                        ), 
                        parse_mode="HTML"
                    )
                except Exception as e: 
                    logging.error(f"خطا در رفرال سیستم حین ریکوئست: {e}")

            keyboard = InlineKeyboardMarkup(inline_keyboard=[
                [InlineKeyboardButton(text="✅ تایید عضویت", callback_data=f"approve_{user_id}"), InlineKeyboardButton(text="❌ رد درخواست", callback_data=f"reject_{user_id}")]
            ])

            safe_name = html.escape(update.from_user.first_name)
            safe_username = html.escape(f"@{update.from_user.username}") if update.from_user.username else "ندارد"

            admin_text = (
                f"📝 <b>درخواست عضویت جدید</b>\n\n"
                f"👤 کاربر: <a href='tg://user?id={user_id}'>{safe_name}</a>\n"
                f"🆔 یوزرنیم: {safe_username}\n"
                f"🫂 <b>دعوت شده توسط:</b> {referrer_name_text}\n\n"
                f"1️⃣ سن: {html.escape(age)}\n2️⃣ محل زندگی: {html.escape(location)}\n"
                f"3️⃣ معرفی: {html.escape(bio)}\n4️⃣ آشنایی: {html.escape(discovery)}\n"
                f"5️⃣ جذابیت: {html.escape(interest)}\n6️⃣ فعالیت‌ها: {html.escape(activities)}\n"
                f"7️⃣ نظر LGBTQIA+: {html.escape(lgbtq)}\n8️⃣ پوز: {html.escape(position)}"
            )
            
            await bot.send_message(chat_id=ADMIN_GROUP_ID, text=admin_text, reply_markup=keyboard, parse_mode="HTML")
            await bot.send_message(chat_id=user_id, text="✅ درخواست شما با موفقیت برای تیم مدیریت ارسال گردید. لطفاً منتظر تایید بمانید.")

        else:
            try: await bot.decline_chat_join_request(chat_id=GROUP_ID, user_id=user_id)
            except Exception: pass
            await bot.send_message(chat_id=user_id, text="⚠️ <b>درخواست شما رد شد!</b>\nشما هنوز فرم ثبت‌نام را به طور کامل پر نکرده‌اید. لطفاً به ربات مراجعه کنید و به تمام سوالات پاسخ دهید.", parse_mode="HTML")
            
    except Exception as e:
        logging.error(f"خطا در پردازش ریکوئست: {e}")

# ================= 3. پردازش تصمیم ادمین =================
@router.callback_query(F.data.startswith("approve_") | F.data.startswith("reject_"))
async def admin_decision(call: CallbackQuery, bot: Bot):
    if call.from_user.id not in ADMIN_IDS:
        await call.answer("⛔️ شما ادمین نیستید و دسترسی ندارید!", show_alert=True)
        return

    try:
        await call.answer()
    except Exception:
        pass

    action, user_id_str = call.data.split("_")
    target_user_id = int(user_id_str)

    try:
        if action == "approve":
            try:
                await bot.approve_chat_join_request(chat_id=GROUP_ID, user_id=target_user_id)
            except Exception as e:
                if "USER_ALREADY_PARTICIPANT" not in str(e):
                    raise e
            
            await call.message.edit_text(call.message.html_text + f"\n\n🟢 <b>وضعیت: تایید شد (توسط {html.escape(call.from_user.first_name)})</b>", parse_mode="HTML")
            
            # 🔴 آپدیت جدید: تغییر وضعیت به همراه ثبت تاریخ دقیق تایید
            async with aiosqlite.connect("bot_database.sqlite") as db:
                await db.execute("UPDATE users SET status = 'approved', approved_date = CURRENT_TIMESTAMP WHERE user_id = ?", (target_user_id,))
                await db.commit()
            
            # 🔴 === اطلاع رسانی به شخصی که زیرمجموعه آورده ===
            try:
                async with aiosqlite.connect("bot_database.sqlite") as db:
                    async with db.execute("SELECT referrer_id FROM users WHERE user_id = ?", (target_user_id,)) as cursor:
                        row = await cursor.fetchone()
                        referrer_id = row[0] if row else None
                
                if referrer_id:
                    try:
                        invited_user_info = await bot.get_chat(target_user_id)
                        safe_invited_name = html.escape(invited_user_info.first_name)
                        await bot.send_message(
                            chat_id=referrer_id,
                            text=f"🎉 <b>تبریک!</b>\nکاربر {safe_invited_name} با لینک دعوت شما وارد گروه شد و توسط ادمین تایید شد!\n✅ یک نفر به آمار زیرمجموعه‌های شما اضافه شد.",
                            parse_mode="HTML"
                        )
                    except Exception as e:
                        logging.error(f"Failed to notify referrer: {e}")
            except Exception as e:
                logging.error(f"Referral DB Error: {e}")
            # ===============================================
            
            try:
                await bot.send_message(chat_id=target_user_id, text="🎉 تبریک! درخواست عضویت شما توسط ادمین تایید شد.")
            except Exception:
                pass
            
            try:
                user_info = await bot.get_chat(target_user_id)
                safe_name = html.escape(user_info.first_name)
                mention = f"<a href='tg://user?id={target_user_id}'>{safe_name}</a>"
                
                welcome_text = (
                    f"عضو جدید✨\n"
                    f"{mention}\n"
                    f"خوش اومدی امیدواریم اینجا رو دوست داشته باشی🌈"
                )
                await bot.send_message(chat_id=GROUP_ID, text=welcome_text, parse_mode="HTML")
            except Exception as e:
                logging.error(f"Welcome message error: {e}")
            
        elif action == "reject":
            try:
                await bot.decline_chat_join_request(chat_id=GROUP_ID, user_id=target_user_id)
            except Exception:
                pass 
                
            await call.message.edit_text(call.message.html_text + f"\n\n🔴 <b>وضعیت: رد شد (توسط {html.escape(call.from_user.first_name)})</b>", parse_mode="HTML")
            await update_status(target_user_id, "rejected") 
            
            # 🔴 === اطلاع رسانی به شخصی که زیرمجموعه آورده (در صورت رد شدن) ===
            try:
                async with aiosqlite.connect("bot_database.sqlite") as db:
                    async with db.execute("SELECT referrer_id FROM users WHERE user_id = ?", (target_user_id,)) as cursor:
                        row = await cursor.fetchone()
                        referrer_id = row[0] if row else None
                
                if referrer_id:
                    try:
                        invited_user_info = await bot.get_chat(target_user_id)
                        safe_invited_name = html.escape(invited_user_info.first_name)
                        await bot.send_message(
                            chat_id=referrer_id,
                            text=f"❌ <b>رد درخواست زیرمجموعه</b>\nکاربر {safe_invited_name} که با لینک شما ثبت‌نام کرده بود، توسط مدیریت تایید نشد و به آمار زیرمجموعه‌های شما اضافه نگردید.",
                            parse_mode="HTML"
                        )
                    except Exception as e:
                        logging.error(f"Failed to notify referrer about rejection: {e}")
            except Exception as e:
                logging.error(f"Referral DB Error (Reject): {e}")
            # ===============================================

            try:
                await bot.send_message(chat_id=target_user_id, text="❌ متاسفانه درخواست عضویت شما رد شد.")
            except Exception:
                pass
            
    except Exception as e:
        logging.error(f"Admin action error: {e}")
        try:
            await call.message.answer("⚠️ وضعيت اين فرم ثبت شد، اما خطايی در ارتباط با تلگرام رخ داد.")
        except:
            pass
# ================= 5. هندلر خروج کاربر از گروه (آپدیت آمار) =================
@router.chat_member(F.chat.id == GROUP_ID)
async def handle_user_leave(update: ChatMemberUpdated, bot: Bot):
    # بررسی می‌کنیم که آیا کاربر لفت داده (left) یا توسط ادمین اخراج شده (kicked)
    if update.new_chat_member.status in ["left", "kicked"]:
        left_user_id = update.new_chat_member.user.id
        
        try:
            async with aiosqlite.connect("bot_database.sqlite") as db:
                # بررسی اینکه آیا این شخص زیرمجموعه کسی بوده و وضعیتش تایید شده است؟
                async with db.execute("SELECT referrer_id FROM users WHERE user_id = ? AND status = 'approved'", (left_user_id,)) as cursor:
                    row = await cursor.fetchone()
                    referrer_id = row[0] if row else None
                
                if referrer_id:
                    # تغییر وضعیت کاربر به left (با این کار اتوماتیک از لیست /top و /myref حذف می‌شود)
                    await db.execute("UPDATE users SET status = 'left' WHERE user_id = ?", (left_user_id,))
                    await db.commit()
                    
                    # ارسال نوتیفیکیشن به شخصی که او را دعوت کرده بود
                    safe_name = html.escape(update.new_chat_member.user.first_name)
                    text = (
                        f"⚠️ <b>کاهش آمار زیرمجموعه:</b>\n\n"
                        f"کاربر <b>{safe_name}</b> که با لینک شما عضو گروه شده بود، از گروه خارج شد.\n"
                        f"➖ <i>یک نفر از آمار زیرمجموعه‌های موفق شما کسر گردید.</i>"
                    )
                    try:
                        await bot.send_message(chat_id=referrer_id, text=text, parse_mode="HTML")
                    except Exception:
                        pass  # در صورتی که دعوت‌کننده ربات را بلاک کرده باشد
                        
        except Exception as e:
            logging.error(f"خطا در پردازش خروج کاربر: {e}")

# ================= سیستم زیرمجموعه گیری (لینک و آمار) =================

# 🔴 اضافه شدن فیلتر F.chat.type == "private"
@router.message(Command("ref"), F.chat.type == "private", StateFilter("*"))
async def generate_ref_link(message: Message, bot: Bot):
    if message.from_user.id == 1087968824 or message.sender_chat:
        await message.answer("⚠️ شما به عنوان 'ادمین ناشناس' یا 'کانال' پیام داده‌اید. لطفاً با اکانت واقعی خود این دستور را بفرستید.")
        return

    bot_info = await bot.get_me()
    bot_username = bot_info.username
    ref_link = f"https://t.me/{bot_username}?start=ref_{message.from_user.id}"
    
    text = (
        "🔗 <b>لینک دعوت اختصاصی شما:</b>\n\n"
        f"<code>{ref_link}</code>\n\n"
        "⚠️ <b>توجه بسیار مهم:</b>\n"
        "دوستان شما <b>حتماً باید روی این لینک کلیک کنند</b> و ربات را استارت بزنند تا زیرمجموعه شما حساب شوند. اگر لینک خود گروه را به آن‌ها بدهید، در آمار شما ثبت نخواهند شد! 🎯"
    )
    await message.answer(text, parse_mode="HTML")

@router.message(Command("top"), StateFilter("*"))
async def top_referrals(message: Message, bot: Bot):
    async with aiosqlite.connect("bot_database.sqlite") as db:
        # 🔴 آپدیت: استخراج همزمان آیدی، نام و تعداد زیرمجموعه از دیتابیس بدون نیاز به ریکوئست تلگرام
        async with db.execute('''
            SELECT u1.referrer_id, COUNT(*) as c, (SELECT first_name FROM users WHERE user_id = u1.referrer_id)
            FROM users u1
            WHERE u1.status = 'approved' AND u1.referrer_id IS NOT NULL 
            GROUP BY u1.referrer_id 
            ORDER BY c DESC 
            LIMIT 20
        ''') as cursor:
            rows = await cursor.fetchall()
    
    if not rows:
        await message.answer("هنوز هیچ زیرمجموعه‌گیری موفقی (تایید شده) در سیستم ثبت نشده است.")
        return
        
    text = "🏆 <b>۲۰ نفر برتر در دعوت کاربران:</b>\n\n"
    medals = ["🥇", "🥈", "🥉"] + ["🏅"] * 17
    
    for i, (ref_id, count, fname) in enumerate(rows):
        # 🔴 آپدیت: خواندن مستقیم نام از خروجی دیتابیس
        if fname:
            name = html.escape(fname)
        else:
            name = f"کاربر ناشناس (ID: {ref_id})"
        
        medal = medals[i] if i < len(medals) else "🏅"
        text += f"{medal} <a href='tg://user?id={ref_id}'>{name}</a> : <b>{count} نفر</b>\n"
        
    await message.answer(text, parse_mode="HTML")

# ================= آمارگیری برای ادمین‌ها (پنل پیشرفته) =================

@router.message(Command("stats"), F.chat.id == ADMIN_GROUP_ID, StateFilter("*"))
async def admin_panel_start(message: Message):
    keyboard = InlineKeyboardMarkup(inline_keyboard=[
        [InlineKeyboardButton(text="📊 آمار کلی فرم‌ها", callback_data="admin_stats_general")],
        [InlineKeyboardButton(text="🫂 آمار کلی رفرال‌گیری", callback_data="admin_stats_referrals")],
        [InlineKeyboardButton(text="🔍 استعلام زیرمجموعه یک فرد", callback_data="admin_stats_guide")]
    ])
    await message.answer("⚙️ <b>پنل مدیریت سیستم احراز هویت</b>\n\nلطفاً بخش مورد نظر خود را انتخاب کنید:", reply_markup=keyboard, parse_mode="HTML")

@router.callback_query(F.data.startswith("admin_stats_"))
async def admin_panel_callbacks(call: CallbackQuery, bot: Bot):
    if call.from_user.id not in ADMIN_IDS:
        await call.answer("⛔️ شما ادمین نیستید!", show_alert=True)
        return

    action = call.data.split("_")[2]
    
    # دکمه بازگشت به منوی اصلی
    back_kb = InlineKeyboardMarkup(inline_keyboard=[
        [InlineKeyboardButton(text="🔙 بازگشت به منو", callback_data="admin_stats_main")]
    ])

    try:
        if action == "main":
            keyboard = InlineKeyboardMarkup(inline_keyboard=[
                [InlineKeyboardButton(text="📊 آمار کلی فرم‌ها", callback_data="admin_stats_general")],
                [InlineKeyboardButton(text="🫂 آمار کلی رفرال‌گیری", callback_data="admin_stats_referrals")],
                [InlineKeyboardButton(text="🔍 استعلام زیرمجموعه یک فرد", callback_data="admin_stats_guide")]
            ])
            await call.message.edit_text("⚙️ <b>پنل مدیریت سیستم احراز هویت</b>\n\nلطفاً بخش مورد نظر خود را انتخاب کنید:", reply_markup=keyboard, parse_mode="HTML")
            
        elif action == "general":
            async with aiosqlite.connect("bot_database.sqlite") as db:
                # ۱. دریافت آمار کلی
                async with db.execute("SELECT status, COUNT(*) FROM users GROUP BY status") as cursor:
                    rows = await cursor.fetchall()
                
                # ۲. دریافت لیست کسانی که فرمشان ناقص است (حداکثر ۳۰ نفر برای جلوگیری از طولانی شدن پیام)
                async with db.execute("SELECT user_id, status FROM users WHERE status IN ('pending', 'reminded', 'started') LIMIT 30") as cursor:
                    incomplete_users = await cursor.fetchall()
            
            if not rows:
                await call.message.edit_text("هیچ کاربری در دیتابیس ثبت نشده است.", reply_markup=back_kb)
                return

            status_translate = {
                "started": "استارت اولیه (دکمه ثبت‌نام را نزدند)", # 🔴 تفکیک شد
                "reading_tos": "در حال خواندن قوانین (تایید نکردند)", # 🔴 اضافه شد
                "pending": "فرم ناقص (در حال پاسخ به سوالات)",
                "reminded": "یادآوری شده (فرم ناقص)",
                "completed": "فرم تکمیل شده (منتظر زدن ریکوئست)",
                "pending_admin": "منتظر تایید ادمین",
                "approved": "تایید شده",
                "rejected": "رد شده",
                "blocked": "ربات را بلاک کرده‌اند",
                "expired": "منقضی شده (۲۴ ساعت)",
                "cancelled": "انصراف داده‌اند",
                "left": "لفت داده / اخراج شده"
            }
            
            stats_text = "📊 <b>آمار لحظه‌ای سیستم احراز هویت:</b>\n\n"
            total = 0
            for status, count in rows:
                fa_status = status_translate.get(status, status)
                stats_text += f"🔹 {fa_status}: <b>{count}</b> نفر\n"
                total += count
                
            stats_text += f"\n👥 کل درخواست‌های ثبت شده: <b>{total}</b>\n"
            
            # 🔴 اضافه شدن لیست افراد با فرم ناقص به انتهای پیام
            if incomplete_users:
                stats_text += "\n⚠️ <b>لیست افرادی که ثبت‌نامشان ناقص مانده:</b>\n"
                for uid, stat in incomplete_users:
                    stat_fa = status_translate.get(stat, stat)
                    stats_text += f"🔸 <a href='tg://user?id={uid}'>پروفایل کاربر</a> | <code>{uid}</code> <i>({stat_fa})</i>\n"
                
                if len(incomplete_users) == 30:
                    stats_text += "\n<i>... (به دلیل طولانی نشدن پیام، فقط ۳۰ نفر اول نمایش داده شدند)</i>"

            await call.message.edit_text(stats_text, reply_markup=back_kb, parse_mode="HTML")

        elif action == "referrals":
            async with aiosqlite.connect("bot_database.sqlite") as db:
                async with db.execute("SELECT COUNT(*) FROM users WHERE referrer_id IS NOT NULL AND status = 'approved'") as cursor:
                    total_referred = (await cursor.fetchone())[0]
                async with db.execute("SELECT COUNT(DISTINCT referrer_id) FROM users WHERE referrer_id IS NOT NULL AND status = 'approved'") as cursor:
                    total_referrers = (await cursor.fetchone())[0]
                    
            text = (
                "🫂 <b>آمار کلی سیستم زیرمجموعه‌گیری:</b>\n\n"
                f"🔹 کل افراد دعوت شده (موفق): <b>{total_referred} نفر</b>\n"
                f"🔹 تعداد کاربران دعوت‌کننده: <b>{total_referrers} نفر</b>\n\n"
                "<i>* این آمار فقط شامل کسانی است که فرم آن‌ها تایید نهایی شده و در گروه حضور دارند.</i>"
            )
            await call.message.edit_text(text, reply_markup=back_kb, parse_mode="HTML")
            
        elif action == "guide":
            text = (
                "🔍 <b>راهنمای استعلام کاربر (چکر رفرال):</b>\n\n"
                "برای اینکه ببینید یک شخص خاص <b>چه کسانی را دعوت کرده</b> یا <b>خودش توسط چه کسی دعوت شده</b>، کافیست دستور زیر را در همین گروه ارسال کنید:\n\n"
                "<code>/checkref آیدی‌عددی</code>\n\n"
                "📌 <i>مثال استعلام:</i>\n<code>/checkref 123456789</code>"
            )
            await call.message.edit_text(text, reply_markup=back_kb, parse_mode="HTML")

    except Exception as e:
        logging.error(f"خطا در پنل ادمین: {e}")
        await call.answer("⚠️ خطایی رخ داد!", show_alert=True)

# ================= دستور چک کردن زیرمجموعه‌های یک شخص خاص =================
@router.message(Command("checkref"), F.chat.id == ADMIN_GROUP_ID, StateFilter("*"))
async def admin_check_referral(message: Message, bot: Bot):
    args = message.text.split()
    if len(args) != 2 or not args[1].isdigit():
        await message.answer("⚠️ <b>خطا در دستور!</b>\nلطفاً آیدی عددی کاربر را به درستی وارد کنید.\nمثال:\n<code>/checkref 123456789</code>", parse_mode="HTML")
        return
        
    target_id = int(args[1])
    
    async with aiosqlite.connect("bot_database.sqlite") as db:
        # ۱. پیدا کردن اطلاعات خود شخص (نام و تاریخ تاییدش)
        async with db.execute("SELECT first_name, approved_date, referrer_id FROM users WHERE user_id = ?", (target_id,)) as cursor:
            target_info = await cursor.fetchone()
            
        invited_by = target_info[2] if target_info else None
        target_name = html.escape(target_info[0]) if target_info and target_info[0] else "کاربر ناشناس"
        target_approved_date = target_info[1] if target_info and target_info[1] else "ثبت نشده"
            
        # ۲. پیدا کردن لیست کسانی که این شخص دعوت کرده (با نام‌هایشان)
        async with db.execute("SELECT user_id, status, first_name, approved_date FROM users WHERE referrer_id = ?", (target_id,)) as cursor:
            invited_users = await cursor.fetchall()
    
    text = f"🔍 <b>پرونده رفرال کاربر:</b> <a href='tg://user?id={target_id}'>{target_name}</a>\n"
    text += f"📅 <b>تاریخ تایید ایشان در گروه:</b> <code>{target_approved_date} (UTC)</code>\n\n"
    
    # بخش اول: توسط چه کسی دعوت شده؟
    if invited_by:
        async with aiosqlite.connect("bot_database.sqlite") as db:
            async with db.execute("SELECT first_name FROM users WHERE user_id = ?", (invited_by,)) as cursor:
                ref_info = await cursor.fetchone()
                ref_name = html.escape(ref_info[0]) if ref_info and ref_info[0] else "کاربر ناشناس"
        text += f"🫂 <b>دعوت شده توسط:</b> <a href='tg://user?id={invited_by}'>{ref_name}</a> (<code>{invited_by}</code>)\n\n"
    else:
        text += "🫂 <b>دعوت شده توسط:</b> <i>مستقیم (بدون لینک دعوت)</i>\n\n"
        
    # بخش دوم: چه کسانی را دعوت کرده؟
    text += "👇 <b>لیست زیرمجموعه‌های این شخص:</b>\n"
    if not invited_users:
        text += "<i>این کاربر هنوز هیچکس را دعوت نکرده است.</i>"
    else:
        approved_count = 0
        # 🔴 آپدیت جدید: نمایش فقط 30 نفر برای جلوگیری از ارور طولانی شدن پیام
        for i, (uid, status, fname, app_date) in enumerate(invited_users[:30]):
            safe_fname = html.escape(fname) if fname else "ناشناس"
            
            if status == "approved":
                approved_count += 1
                text += f"✅ <a href='tg://user?id={uid}'>{safe_fname}</a> (تایید شده)\n"
            elif status == "left":
                text += f"❌ <a href='tg://user?id={uid}'>{safe_fname}</a> (لفت داده / اخراج)\n"
            elif status in ["pending", "completed", "reminded", "started"]:
                text += f"⏳ <a href='tg://user?id={uid}'>{safe_fname}</a> (در حال بررسی)\n"
            else:
                text += f"⛔️ <a href='tg://user?id={uid}'>{safe_fname}</a> (رد شده / انصراف)\n"
                
        if len(invited_users) > 30:
            text += f"\n<i>... و {len(invited_users) - 30} نفر دیگر</i>\n"
            
        # محاسبه واقعی تعداد تایید شده‌ها (حتی آن‌هایی که در لیست 30 نفره چاپ نشدند)
        total_approved = sum(1 for u in invited_users if u[1] == "approved")
        text += f"\n📊 کل زیرمجموعه‌های موفق و حاضر در گروه: <b>{total_approved} نفر</b>"
        
    await message.answer(text, parse_mode="HTML")

# 🔴 اضافه شدن فیلتر F.chat.type == "private"
@router.message(Command("myref"), F.chat.type == "private", StateFilter("*"))
async def my_referrals(message: Message, bot: Bot):
    user_id = message.from_user.id
    async with aiosqlite.connect("bot_database.sqlite") as db:
        # ۱. دریافت لیست کامل کاربرانی که تایید شده‌اند
        async with db.execute("SELECT user_id FROM users WHERE referrer_id = ? AND status = 'approved'", (user_id,)) as cursor:
            approved_users = await cursor.fetchall()
            
        # ۲. 🔴 آپدیت ضد-باگ: محاسبه دقیق کسانی که واقعاً در حال بررسی هستند
        # وضعیت‌های رد شده (rejected)، انصراف (cancelled) و منقضی (expired) نباید شمرده شوند.
        async with db.execute("SELECT COUNT(*) FROM users WHERE referrer_id = ? AND status IN ('pending', 'reminded', 'completed', 'pending_admin', 'started')", (user_id,)) as cursor:
            pending_count = (await cursor.fetchone())[0]

    approved_count = len(approved_users)

    text = (
        "📊 <b>آمار زیرمجموعه‌های شما:</b>\n\n"
        f"✅ <b>تایید شده و موفق:</b> {approved_count} نفر\n"
        f"⏳ <b>در حال بررسی / فرم ناقص:</b> {pending_count} نفر\n\n"
    )

    # نمایش لیست آیدی‌ها و لینک پروفایل کسانی که جوین شده‌اند
    if approved_count > 0:
        text += "🌟 <b>لیست افراد تایید شده (توسط لینک شما):</b>\n"
        # نمایش حداکثر 30 نفر آخر برای جلوگیری از طولانی شدن بیش از حد پیام
        for i, (ref_user_id,) in enumerate(approved_users[:30]):
            text += f"🔹 <a href='tg://user?id={ref_user_id}'>مشاهده پروفایل اکانت</a> (آیدی: <code>{ref_user_id}</code>)\n"
        
        if approved_count > 30:
            text += f"<i>... و {approved_count - 30} نفر دیگر</i>\n"

    text += "\n<i>* فقط افراد تایید شده در مسابقه نفرات برتر محاسبه می‌شوند. تقلب در سیستم امکان‌پذیر نیست.</i>"
    
    await message.answer(text, parse_mode="HTML")

# ================= اجرای ربات =================
async def main():
    bot = Bot(token=BOT_TOKEN)
    dp = Dispatcher()
    dp.include_router(router)
    
    # ثبت کردن رویدادها
    dp.startup.register(on_startup)
    
    try:
        await dp.start_polling(bot)
    finally:
        await bot.session.close()

if __name__ == "__main__":
    try:
        asyncio.run(main())
    except KeyboardInterrupt:
        print("\n🔴 ربات با موفقیت متوقف شد.")