# -*- coding: utf-8 -*-
import json
import logging
import jdatetime
from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update
from telegram.ext import ContextTypes

from config import INITIAL_SUPER_ADMIN
from database import (
    register_user, get_setting, set_setting, is_admin, add_admin, 
    remove_admin, get_all_admins, set_user_favorite, get_user_favorite_status,
    get_total_users_count, get_all_user_ids, add_auto_channel, remove_auto_channel,
    get_all_auto_channels, get_auto_channel_by_id, toggle_channel_status, update_channel_times
)
from api_service import fetch_gold_prices, fetch_api_raw, parse_prices, generate_price_message
from keyboards import (
    get_main_menu, get_price_sub_menu, get_back_button, 
    get_back_to_admin, get_admin_panel_menu, get_channels_list_keyboard,
    get_single_channel_keyboard, get_channel_ad_btn_menu
)

async def check_force_join(user_id: int, bot) -> bool:
    channel = get_setting("forced_channel").strip()
    if not channel:
        return True
    try:
        member = await bot.get_chat_member(chat_id=channel, user_id=user_id)
        return member.status in ["member", "administrator", "creator"]
    except Exception as e:
        logging.error(f"Force Join Check Error: {e}")
        return True

async def start_handler(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_id = update.effective_user.id
    register_user(user_id)

    if get_setting("sleep_mode") == "on" and not is_admin(user_id):
        sleep_msg = "🌙 ربات در حال حاضر در حالت خواب (تعمیرات موقت) قرار دارد. لطفاً بعداً مراجعه کنید."
        if update.message:
            await update.message.reply_text(sleep_msg)
        elif update.callback_query:
            await update.callback_query.message.edit_text(sleep_msg)
        return

    if not is_admin(user_id) and not await check_force_join(user_id, context.bot):
        channel = get_setting("forced_channel")
        clean_channel = channel.replace("@", "")
        kb = [
            [InlineKeyboardButton("📢 عضویت در کانال", url=f"https://t.me/{clean_channel}")],
            [InlineKeyboardButton("✅ عضو شدم و تایید", callback_data="btn_main_menu")]
        ]
        text = f"🔒 جهت استفاده از ربات، ابتدا باید در کانال زیر عضو شوید:\n\n👉 {channel}\n\nپس از عضویت، روی دکمه تایید کلیک کنید."
        if update.message:
            await update.message.reply_text(text, reply_markup=InlineKeyboardMarkup(kb))
        elif update.callback_query:
            await update.callback_query.message.edit_text(text, reply_markup=InlineKeyboardMarkup(kb))
        return

    welcome_text = (
        "🤖 ربات فوق‌حرفه‌ای قیمت طلا\n"
        "━━━━━━━━━━━━━━━━━━━\n"
        "به ربات تخصصی قیمت‌های لحظه‌ای خوش آمدید!\n\n"
        "امکانات:\n"
        "📌 قیمت طلا به صورت دسته‌بندی شده\n"
        "⭐ لیست علاقه‌مندی‌ها\n"
        "📈 پیش‌بینی روند\n"
        "📊 نمودار متنی قیمت‌ها\n\n"
        "لطفاً یکی از گزینه‌ها را انتخاب کنید:"
    )
    if update.message:
        await update.message.reply_text(welcome_text, reply_markup=get_main_menu())
    elif update.callback_query:
        await update.callback_query.message.edit_text(welcome_text, reply_markup=get_main_menu())

async def button_handler(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    user_id = query.from_user.id
    data = query.data

    context.user_data.pop("awaiting_input", None)

    if get_setting("sleep_mode") == "on" and not is_admin(user_id):
        await query.answer("🌙 ربات در حالت تعمیرات و خواب است.", show_alert=True)
        return

    if data == "btn_main_menu":
        await query.answer()
        await start_handler(update, context)
        return

    if data == "btn_price_gold":
        await query.answer("در حال دریافت قیمت‌های لحظه‌ای...")
        api_data = await fetch_gold_prices()
        if not api_data:
            await query.answer("❌ خطا در دریافت قیمت طلا. لطفاً بعداً تلاش کنید.", show_alert=True)
            return

        prices = parse_prices(api_data)
        text = generate_price_message(prices)
        try:
            await query.message.edit_text(text, reply_markup=get_price_sub_menu())
        except Exception:
            pass

    elif data == "btn_favorites":
        await query.answer()
        if not get_user_favorite_status(user_id):
            text = "⭐ **لیست علاقه‌مندی‌های شما خالی است.**\n\nبرای افزودن اقلام، به منوی «قیمت طلا» رفته و «⭐ افزودن همه به علاقه‌مندی» را انتخاب کنید."
            await query.message.edit_text(text, parse_mode="Markdown", reply_markup=get_back_button())
            return

        api_data = await fetch_gold_prices()
        prices = parse_prices(api_data) if api_data else {k: "-" for k in ["gold_18", "coin_emami", "coin_half", "coin_quarter"]}
        text = (
            "⭐ **لیست علاقه‌مندی‌های شما:**\n\n"
            f"🔸 طلای ۱۸ عیار: {prices['gold_18']}\n"
            f"🔸 سکه امامی: {prices['coin_emami']}\n"
            f"🔸 نیم سکه: {prices['coin_half']}\n"
            f"🔸 ربع سکه: {prices['coin_quarter']}"
        )
        await query.message.edit_text(text, parse_mode="Markdown", reply_markup=get_back_button())

    elif data == "btn_forecast":
        await query.answer()
        text = (
            "📈 **پیش‌بینی روند قیمت طلا و سکه:**\n\n"
            "• **طلا ۱۸ عیار:** بازار در فاز تثبیت همراه با تمایلات صعودی قرار دارد.\n"
            "• **سکه امامی:** مقاومت‌های روزانه در حال تست هستند و حباب در حال تعدیل است.\n\n"
            "⚠️ _توجه: این تحلیل‌ها جنبه آموزشی دارد و سیگنال مالی نیست._"
        )
        await query.message.edit_text(text, parse_mode="Markdown", reply_markup=get_back_button())

    elif data == "btn_chart":
        await query.answer()
        text = (
            "📊 **نمودار متنی تغییرات و نوسانات هفتگی:**\n\n"
            "شنبه     | ▇▇▇▇▇▇▇ (کف قیمتی)\n"
            "یکشنبه   | ▇▇▇▇▇▇▇▇\n"
            "دوشنبه   | ▇▇▇▇▇▇▇▇▇\n"
            "سه‌شنبه   | ▇▇▇▇▇▇▇▇▇▇ (سقف نوسان)\n"
            "چهارشنبه | ▇▇▇▇▇▇▇▇\n\n"
            "📌 برای قیمت زنده، گزینه «🥇 قیمت طلا» را بزنید."
        )
        await query.message.edit_text(text, parse_mode="Markdown", reply_markup=get_back_button())

    elif data == "btn_guide":
        await query.answer()
        text = (
            "ℹ️ **راهنمای کار با ربات:**\n\n"
            "۱. **قیمت طلا:** مشاهده آنی نرخ‌ها و شرایط خرید اقساطی.\n"
            "۲. **لیست علاقه‌مندی:** ذخیره اقلام مورد نظر شما.\n"
            "۳. **پیش‌بینی قیمت:** مرور وضعیت تحلیل تکنیکال بازار.\n\n"
            "📞 پشتیبانی: 05136015020"
        )
        await query.message.edit_text(text, parse_mode="Markdown", reply_markup=get_back_button())

    elif data == "btn_add_favorites":
        set_user_favorite(user_id, 1)
        await query.answer("⭐ به لیست علاقه‌مندی‌ها اضافه شد.", show_alert=True)

    # ----- منوی اصلی ادمین -----
    elif data == "btn_admin":
        if not is_admin(user_id):
            await query.answer("⛔ دسترسی فقط برای ادمین‌ها مجاز است.", show_alert=True)
            return
        await query.answer()
        await query.message.edit_text("⚙️ **پنل مدیریت ربات**\n\nیکی از گزینه‌ها را انتخاب کنید:", parse_mode="Markdown", reply_markup=get_admin_panel_menu())

    elif data == "adm_auto_channels":
        if not is_admin(user_id): return
        channels = get_all_auto_channels()
        text = "📢 **مدیریت کانال‌های ارسال خودکار قیمت:**\n\nروی کانال مورد نظر جهت ویرایش ساعت‌ها یا وضعیت کلیک کنید:" if channels else "📢 **هیچ کانالی برای ارسال خودکار ثبت نشده است.**\n\nبرای افزودن، دکمه زیر را لمس کنید:"
        await query.message.edit_text(text, parse_mode="Markdown", reply_markup=get_channels_list_keyboard(channels))

    elif data == "adm_add_channel":
        if not is_admin(user_id): return
        context.user_data["awaiting_input"] = "add_channel_step1"
        await query.answer()
        await query.message.edit_text(
            "📢 لطفاً **آیدی عمومی کانال** (مثلاً `@mygoldchannel`) یا **شناسه عددی کانال** (مثلاً `-100123456789`) را ارسال فرمایید:\n\n_(مطمئن شوید ربات در کانال ادمین با دسترسی ارسال پیام است)_",
            parse_mode="Markdown",
            reply_markup=get_back_to_admin()
        )

    elif data.startswith("manage_ch_"):
        if not is_admin(user_id): return
        ch_db_id = int(data.split("_")[2])
        ch_info = get_auto_channel_by_id(ch_db_id)
        if not ch_info:
            await query.answer("کانال پیدا نشد.", show_alert=True)
            return
        _, channel_id, times, status = ch_info
        status_text = "🟢 فعال" if status == "on" else "🔴 غیرفعال"
        text = f"⚙️ **مدیریت کانال:** `{channel_id}`\n\nوضعیت ارسال: **{status_text}**\n🕒 ساعت‌های ارسال: `{times}`"
        await query.message.edit_text(text, parse_mode="Markdown", reply_markup=get_single_channel_keyboard(ch_db_id, status))

    elif data.startswith("ch_toggle_"):
        if not is_admin(user_id): return
        ch_db_id = int(data.split("_")[2])
        toggle_channel_status(ch_db_id)
        await query.answer("وضعیت کانال تغییر یافت.")
        ch_info = get_auto_channel_by_id(ch_db_id)
        _, channel_id, times, status = ch_info
        status_text = "🟢 فعال" if status == "on" else "🔴 غیرفعال"
        text = f"⚙️ **مدیریت کانال:** `{channel_id}`\n\nوضعیت ارسال: **{status_text}**\n🕒 ساعت‌های ارسال: `{times}`"
        await query.message.edit_text(text, parse_mode="Markdown", reply_markup=get_single_channel_keyboard(ch_db_id, status))

    elif data.startswith("ch_times_"):
        if not is_admin(user_id): return
        ch_db_id = int(data.split("_")[2])
        context.user_data["awaiting_input"] = f"edit_times_{ch_db_id}"
        await query.answer()
        await query.message.edit_text(
            "🕒 لطفاً ساعت‌های ارسال را به فرمت ۲۴ ساعته و جداشده با کاما ارسال کنید:\n\nمثال: `11:00, 14:30, 18:00`",
            parse_mode="Markdown",
            reply_markup=get_back_to_admin()
        )

    elif data.startswith("ch_del_"):
        if not is_admin(user_id): return
        ch_db_id = int(data.split("_")[2])
        remove_auto_channel(ch_db_id)
        await query.answer("کانال حذف گردید.", show_alert=True)
        channels = get_all_auto_channels()
        text = "📢 **مدیریت کانال‌های ارسال خودکار قیمت:**" if channels else "📢 **هیچ کانالی برای ارسال خودکار ثبت نشده است.**"
        await query.message.edit_text(text, parse_mode="Markdown", reply_markup=get_channels_list_keyboard(channels))

    elif data == "adm_channel_ad_btn":
        if not is_admin(user_id): return
        cur_status = get_setting("channel_ad_btn_status")
        status_text = "🟢 روشن (زیر پست‌های کانال قرار می‌گیرد)" if cur_status == "on" else "🔴 خاموش (دکمه‌ای ارسال نمی‌شود)"
        btn_name = get_setting("channel_ad_btn_name")
        btn_link = get_setting("channel_ad_btn_link")
        
        text = (
            f"🔘 **تنظیمات دکمه شیشه‌ای تبلیغات کانال:**\n\n"
            f"• وضعیت دکمه: **{status_text}**\n"
            f"• نام روی دکمه: `{btn_name}`\n"
            f"• آیدی / لینک کانال تبلیغات: `{btn_link}`\n\n"
            f"_(این دکمه فقط در پست‌های ارسالی داخل کانال‌ها قرار می‌گیرد)_"
        )
        await query.message.edit_text(text, parse_mode="Markdown", reply_markup=get_channel_ad_btn_menu())

    elif data == "toggle_channel_ad_btn":
        if not is_admin(user_id): return
        cur = get_setting("channel_ad_btn_status")
        new_state = "off" if cur == "on" else "on"
        set_setting("channel_ad_btn_status", new_state)
        await query.answer("وضعیت دکمه تغییر کرد.")
        
        status_text = "🟢 روشن (زیر پست‌های کانال قرار می‌گیرد)" if new_state == "on" else "🔴 خاموش (دکمه‌ای ارسال نمی‌شود)"
        btn_name = get_setting("channel_ad_btn_name")
        btn_link = get_setting("channel_ad_btn_link")
        text = (
            f"🔘 **تنظیمات دکمه شیشه‌ای تبلیغات کانال:**\n\n"
            f"• وضعیت دکمه: **{status_text}**\n"
            f"• نام روی دکمه: `{btn_name}`\n"
            f"• آیدی / لینک کانال تبلیغات: `{btn_link}`\n\n"
            f"_(این دکمه فقط در پست‌های ارسالی داخل کانال‌ها قرار می‌گیرد)_"
        )
        await query.message.edit_text(text, parse_mode="Markdown", reply_markup=get_channel_ad_btn_menu())

    elif data == "edit_ch_ad_btn_name":
        if not is_admin(user_id): return
        context.user_data["awaiting_input"] = "set_ch_ad_btn_name"
        await query.answer()
        await query.message.edit_text("✏️ لطفاً **نام جدید دکمه تبلیغات** را ارسال کنید (مثلاً: `عضویت در کانال VIP`):", reply_markup=get_back_to_admin())

    elif data == "edit_ch_ad_btn_link":
        if not is_admin(user_id): return
        context.user_data["awaiting_input"] = "set_ch_ad_btn_link"
        await query.answer()
        await query.message.edit_text("🔗 لطفاً **آیدی کانال تبلیغات (همراه با @)** یا لینک مستقیم آن را ارسال کنید:\nمثال: `@my_ad_channel` یا `https://t.me/my_ad_channel`", reply_markup=get_back_to_admin())

    elif data == "adm_ad_settings":
        if not is_admin(user_id): return
        ad_text = get_setting("ad_text")
        kb = [
            [InlineKeyboardButton("✏️ ویرایش متن تبلیغات", callback_data="edit_ad_text")],
            [InlineKeyboardButton("🔙 بازگشت به پنل مدیریت", callback_data="btn_admin")]
        ]
        await query.message.edit_text(f"📢 **متن فعلی تبلیغات متنی انتهای پیام:**\n\n`{ad_text}`", parse_mode="Markdown", reply_markup=InlineKeyboardMarkup(kb))

    elif data == "edit_ad_text":
        if not is_admin(user_id): return
        context.user_data["awaiting_input"] = "set_ad_text"
        await query.answer()
        await query.message.edit_text("📝 لطفاً متن جدید تبلیغات متنی را ارسال کنید:", reply_markup=get_back_to_admin())

    elif data == "adm_sleep_mode":
        if not is_admin(user_id): return
        cur = get_setting("sleep_mode")
        status_text = "🟢 فعال (ربات در دسترس نیست)" if cur == "on" else "🔴 غیرفعال (ربات آنلاین است)"
        kb = [
            [InlineKeyboardButton("تغییر وضعیت حالت خواب", callback_data="toggle_sleep_mode")],
            [InlineKeyboardButton("🔙 بازگشت به پنل مدیریت", callback_data="btn_admin")]
        ]
        await query.message.edit_text(f"🌙 **مدیریت حالت خواب (تعمیرات):**\n\nوضعیت کنونی: **{status_text}**", parse_mode="Markdown", reply_markup=InlineKeyboardMarkup(kb))

    elif data == "toggle_sleep_mode":
        if not is_admin(user_id): return
        cur = get_setting("sleep_mode")
        new_state = "off" if cur == "on" else "on"
        set_setting("sleep_mode", new_state)
        await query.answer("حالت خواب تغییر کرد.")
        status_text = "🟢 فعال (ربات در دسترس نیست)" if new_state == "on" else "🔴 غیرفعال (ربات آنلاین است)"
        kb = [
            [InlineKeyboardButton("تغییر وضعیت حالت خواب", callback_data="toggle_sleep_mode")],
            [InlineKeyboardButton("🔙 بازگشت به پنل مدیریت", callback_data="btn_admin")]
        ]
        await query.message.edit_text(f"🌙 **مدیریت حالت خواب (تعمیرات):**\n\nوضعیت کنونی: **{status_text}**", parse_mode="Markdown", reply_markup=InlineKeyboardMarkup(kb))

    elif data == "adm_test_api":
        if not is_admin(user_id): return
        await query.answer("در حال تست اتصال...")
        try:
            res = await fetch_api_raw()
            if res.status_code == 200:
                text = f"✅ **تست اتصال موفقیت‌آمیز بود!**\n\n🌐 وضعیت: `{res.status_code} OK`\n⚡ وب‌سرویس در دسترس است."
            else:
                text = f"⚠️ **پاسخ سرور:** `{res.status_code}`\n\nمتن: `{res.text[:200]}`"
        except Exception as e:
            text = f"❌ **خطا در اتصال:**\n\n`{str(e)}`"
        await query.message.edit_text(text, parse_mode="Markdown", reply_markup=get_back_to_admin())

    elif data == "adm_raw_api":
        if not is_admin(user_id): return
        await query.answer("در حال دریافت اطلاعات خام...")
        try:
            res = await fetch_api_raw()
            try:
                raw_json = json.dumps(res.json(), indent=2, ensure_ascii=False)
            except Exception:
                raw_json = res.text
            preview = raw_json[:3500]
            text = f"🔍 **پاسخ خام سرور (کد {res.status_code}):**\n\n```json\n{preview}\n```"
        except Exception as e:
            text = f"❌ خطا در خواندن پاسخ خام: `{str(e)}`"
        await query.message.edit_text(text, parse_mode="Markdown", reply_markup=get_back_to_admin())

    elif data == "adm_manage_admins":
        if not is_admin(user_id): return
        admins = get_all_admins()
        admin_list_str = "\n".join([f"• `{adm}`" for adm in admins])
        kb = [
            [InlineKeyboardButton("➕ افزودن ادمین جدید", callback_data="adm_add_admin_action")],
            [InlineKeyboardButton("➖ حذف ادمین", callback_data="adm_del_admin_action")],
            [InlineKeyboardButton("🔙 بازگشت به پنل مدیریت", callback_data="btn_admin")]
        ]
        await query.message.edit_text(f"👥 **لیست ادمین‌های ربات:**\n\n{admin_list_str}", parse_mode="Markdown", reply_markup=InlineKeyboardMarkup(kb))

    elif data == "adm_add_admin_action":
        if not is_admin(user_id): return
        context.user_data["awaiting_input"] = "add_admin_id"
        await query.answer()
        await query.message.edit_text("👤 **شناسه عددی (User ID)** فرد را بفرستید:", reply_markup=get_back_to_admin())

    elif data == "adm_del_admin_action":
        if not is_admin(user_id): return
        context.user_data["awaiting_input"] = "del_admin_id"
        await query.answer()
        await query.message.edit_text("👤 **شناسه عددی (User ID)** ادمین جهت حذف را بفرستید:", reply_markup=get_back_to_admin())

    elif data == "adm_forced_join":
        if not is_admin(user_id): return
        ch = get_setting("forced_channel")
        ch_text = ch if ch else "غیرفعال"
        kb = [
            [InlineKeyboardButton("✏️ تنظیم آیدی کانال", callback_data="adm_set_channel")],
            [InlineKeyboardButton("❌ غیرفعال کردن جوین اجباری", callback_data="adm_disable_channel")],
            [InlineKeyboardButton("🔙 بازگشت به پنل مدیریت", callback_data="btn_admin")]
        ]
        await query.message.edit_text(f"🔒 **مدیریت جوین اجباری:**\n\nکانال فعلی: **{ch_text}**", parse_mode="Markdown", reply_markup=InlineKeyboardMarkup(kb))

    elif data == "adm_set_channel":
        if not is_admin(user_id): return
        context.user_data["awaiting_input"] = "set_forced_channel"
        await query.answer()
        await query.message.edit_text("📢 آیدی کانال را همراه با @ بفرستید (مثال: `@mychannel`):", reply_markup=get_back_to_admin())

    elif data == "adm_disable_channel":
        if not is_admin(user_id): return
        set_setting("forced_channel", "")
        await query.answer("غیرفعال شد.", show_alert=True)
        await query.message.edit_text("✅ جوین اجباری غیرفعال گردید.", reply_markup=get_back_to_admin())

    elif data == "adm_user_stats":
        if not is_admin(user_id): return
        total_users = get_total_users_count()
        text = f"📊 **آمار کاربران ربات:**\n\n👤 کل کاربران ثبت شده: `{total_users}` نفر\n🕒 تاریخ: `{jdatetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')}`"
        await query.message.edit_text(text, parse_mode="Markdown", reply_markup=get_back_to_admin())

    elif data == "adm_broadcast":
        if not is_admin(user_id): return
        context.user_data["awaiting_input"] = "broadcast_message"
        await query.answer()
        await query.message.edit_text("📢 متن پیام همگانی را بفرستید:", reply_markup=get_back_to_admin())

async def text_handler(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_id = update.effective_user.id
    if not is_admin(user_id):
        return

    action = context.user_data.get("awaiting_input")
    if not action:
        return

    text = update.message.text.strip()

    if action == "set_ch_ad_btn_name":
        set_setting("channel_ad_btn_name", text)
        context.user_data.pop("awaiting_input", None)
        await update.message.reply_text(f"✅ نام دکمه تبلیغات بر روی `{text}` تنظیم شد.", parse_mode="Markdown", reply_markup=get_channel_ad_btn_menu())

    elif action == "set_ch_ad_btn_link":
        set_setting("channel_ad_btn_link", text)
        context.user_data.pop("awaiting_input", None)
        await update.message.reply_text(f"✅ لینک کانال تبلیغات با موفقیت بر روی `{text}` تنظیم شد.", parse_mode="Markdown", reply_markup=get_channel_ad_btn_menu())

    elif action == "add_channel_step1":
        context.user_data["temp_channel_id"] = text
        context.user_data["awaiting_input"] = "add_channel_step2"
        await update.message.reply_text(
            f"✅ آیدی کانال `{text}` ثبت شد.\n\n🕒 حالا ساعت‌های ارسال در طول روز را به صورت ۲۴ ساعته وارد کنید (جداشده با کاما):\nمثال: `11:00, 14:00, 18:30`",
            parse_mode="Markdown"
        )

    elif action == "add_channel_step2":
        channel_id = context.user_data.pop("temp_channel_id", None)
        context.user_data.pop("awaiting_input", None)
        if channel_id:
            add_auto_channel(channel_id, text)
            channels = get_all_auto_channels()
            await update.message.reply_text(
                f"✅ کانال `{channel_id}` با ساعت‌های `{text}` با موفقیت افزوده شد!",
                parse_mode="Markdown",
                reply_markup=get_channels_list_keyboard(channels)
            )

    elif action.startswith("edit_times_"):
        ch_db_id = int(action.split("_")[2])
        context.user_data.pop("awaiting_input", None)
        update_channel_times(ch_db_id, text)
        ch_info = get_auto_channel_by_id(ch_db_id)
        _, channel_id, times, status = ch_info
        status_text = "🟢 فعال" if status == "on" else "🔴 غیرفعال"
        await update.message.reply_text(
            f"✅ ساعت‌های کانال `{channel_id}` با موفقیت بروزرسانی شد:\n`{text}`",
            parse_mode="Markdown",
            reply_markup=get_single_channel_keyboard(ch_db_id, status)
        )

    elif action == "set_ad_text":
        set_setting("ad_text", text)
        context.user_data.pop("awaiting_input", None)
        await update.message.reply_text("✅ متن تبلیغات متنی ذخیره شد.", reply_markup=get_admin_panel_menu())

    elif action == "add_admin_id":
        if text.isdigit():
            add_admin(int(text))
            context.user_data.pop("awaiting_input", None)
            await update.message.reply_text(f"✅ ادمین `{text}` افزوده شد.", parse_mode="Markdown", reply_markup=get_admin_panel_menu())
        else:
            await update.message.reply_text("❌ لطفاً یک شناسه عددی معتبر بفرستید:")

    elif action == "del_admin_id":
        if text.isdigit():
            if int(text) == INITIAL_SUPER_ADMIN:
                await update.message.reply_text("❌ حذف ادمین اصلی ممکن نیست.", reply_markup=get_admin_panel_menu())
                context.user_data.pop("awaiting_input", None)
                return
            remove_admin(int(text))
            context.user_data.pop("awaiting_input", None)
            await update.message.reply_text(f"✅ ادمین `{text}` حذف شد.", parse_mode="Markdown", reply_markup=get_admin_panel_menu())
        else:
            await update.message.reply_text("❌ لطفاً شناسه عددی معتبر بفرستید:")

    elif action == "set_forced_channel":
        if text.startswith("@"):
            set_setting("forced_channel", text)
            context.user_data.pop("awaiting_input", None)
            await update.message.reply_text(f"✅ کانال بر روی {text} تنظیم شد.", reply_markup=get_admin_panel_menu())
        else:
            await update.message.reply_text("❌ نام کانال باید با @ شروع شود:")

    elif action == "broadcast_message":
        context.user_data.pop("awaiting_input", None)
        users = get_all_user_ids()
        sent_count = 0
        status_msg = await update.message.reply_text(f"⏳ در حال ارسال به {len(users)} کاربر...")

        for uid in users:
            try:
                await context.bot.send_message(chat_id=uid, text=text)
                sent_count += 1
            except Exception:
                pass

        await status_msg.edit_text(
            f"✅ **ارسال به پایان رسید.**\nتحویل موفق: `{sent_count}` از `{len(users)}`",
            parse_mode="Markdown",
            reply_markup=get_admin_panel_menu()
        )