# -*- coding: utf-8 -*-
import asyncio, json, os, time
from rubka.asynco import Robot, Message
from rubka import ChatKeypadBuilder

TOKEN = "CBJDFD0UHPZYXWGEEMMDVYACYNXRIRWQKQQLJTJAXVGGVFSYYLPRZXVATTXBSJPW"
DATA_FILE = "rexma.json"
OWNER_ID = "b068yQ0xwx001ead85b4077fb10adacf"

bot = Robot(TOKEN)

def load_data():
    if os.path.exists(DATA_FILE):
        with open(DATA_FILE, "r") as f:
            data = json.load(f)
            if "users" not in data:
                data["users"] = []
            if "sessions" not in data:
                data["sessions"] = {}
            if "broadcast_data" not in data:
                data["broadcast_data"] = {}
            if "membership_status" not in data:
                data["membership_status"] = {}
            if "admins" not in data:
                data["admins"] = []
            if "sepi_text" not in data:
                data["sepi_text"] = "در حال توسعه 🛠️"
            if "account_text" not in data:
                data["account_text"] = "در حال توسعه 🛠️"
            if "combo_text" not in data:
                data["combo_text"] = "در حال توسعه 🛠️"
            if "combo_khofen_text" not in data:
                data["combo_khofen_text"] = "در حال توسعه 🛠️"
            if "start_text" not in data:
                data["start_text"] = "🔰 سلام به ربات خوش آمدید!\n\nبرای استفاده از ربات باید عضو کانال‌های زیر باشید:\n\n📢 @TST\n\n✅ پس از عضویت، دکمه بررسی عضویت را بزنید."
            return data
    return {"users": [], "sessions": {}, "broadcast_data": {}, "membership_status": {}, "admins": [], "sepi_text": "در حال توسعه 🛠️", "account_text": "در حال توسعه 🛠️", "combo_text": "در حال توسعه 🛠️", "combo_khofen_text": "در حال توسعه 🛠️", "start_text": "🔰 سلام به ربات خوش آمدید!\n\nبرای استفاده از ربات باید عضو کانال‌های زیر باشید:\n\n📢 @TST\n\n✅ پس از عضویت، دکمه بررسی عضویت را بزنید."}

def save_data(data):
    with open(DATA_FILE, "w") as f:
        json.dump(data, f, ensure_ascii=False, indent=2)

def main_kb():
    kb = ChatKeypadBuilder()
    kb.row(kb.button("check_membership", "✨ بررسی عضویت"))
    return kb.build(resize_keyboard=True)

def user_kb():
    kb = ChatKeypadBuilder()
    kb.row(kb.button("سیپی رایگان", "💰 سیپی رایگان"), kb.button("اکانت رایگان", "🎮 اکانت رایگان"))
    kb.row(kb.button("کمبو رایگان", "⚡ کمبو رایگان"), kb.button("کمبو رایگان خفن", "💎 کمبو رایگان خفن"))
    return kb.build(resize_keyboard=True)

def admin_kb():
    kb = ChatKeypadBuilder()
    kb.row(kb.button("stats_btn", "📊 آمار کاربران"))
    kb.row(kb.button("broadcast_btn", "📢 پیام همگانی"))
    kb.row(kb.button("change_buttons_btn", "✏️ تغییر دکمه ها"))
    kb.row(kb.button("change_start_btn", "📝 تغییر متن استارت"))
    kb.row(kb.button("exit_panel", "🔙 خروج از پنل"))
    return kb.build(resize_keyboard=True)

def owner_kb():
    kb = ChatKeypadBuilder()
    kb.row(kb.button("add_admin_btn", "➕ افزودن ادمین"))
    kb.row(kb.button("remove_admin_btn", "➖ حذف ادمین"))
    kb.row(kb.button("list_admins_btn", "📋 لیست ادمین ها"))
    kb.row(kb.button("admin_panel_btn", "👑 پنل ادمین"))
    kb.row(kb.button("exit_owner", "🔙 خروج از پنل مالک"))
    return kb.build(resize_keyboard=True)

def change_buttons_kb():
    kb = ChatKeypadBuilder()
    kb.row(kb.button("change_sepi_btn", "💰 سیپی رایگان"), kb.button("change_account_btn", "🎮 اکانت رایگان"))
    kb.row(kb.button("change_combo_btn", "⚡ کمبو رایگان"), kb.button("change_combo_khofen_btn", "💎 کمبو رایگان خفن"))
    kb.row(kb.button("back_to_admin", "🔙 بازگشت به پنل ادمین"))
    return kb.build(resize_keyboard=True)

def broadcast_kb():
    kb = ChatKeypadBuilder()
    kb.row(kb.button("confirm_broadcast", "✅ تایید و ارسال"))
    kb.row(kb.button("cancel_broadcast", "❌ لغو"))
    return kb.build(resize_keyboard=True)

@bot.on_message()
async def message_handler(bot_obj, message: Message):
    uid = str(message.chat_id)
    txt = (message.text or "").strip()
    data = load_data()
    
    if uid not in data["users"]:
        data["users"].append(uid)
        save_data(data)
    
    session = data["sessions"].get(uid)
    
    if txt == "/start":
        if uid in data["sessions"]:
            del data["sessions"][uid]
            save_data(data)
        
        await message.reply_keypad(
            data.get("start_text", "🔰 سلام به ربات خوش آمدید!"),
            keypad=main_kb()
        )
        return
    
    if session == "waiting_broadcast":
        if txt == "/cancel":
            del data["sessions"][uid]
            if uid in data["broadcast_data"]:
                del data["broadcast_data"][uid]
            save_data(data)
            
            if uid == OWNER_ID:
                await message.reply_keypad("❌ لغو شد", keypad=owner_kb())
            else:
                await message.reply_keypad("❌ لغو شد", keypad=admin_kb())
            return
        
        data["broadcast_data"][uid] = {"chat_id": message.chat_id, "message_id": message.message_id}
        data["sessions"][uid] = "confirm_broadcast"
        save_data(data)
        await message.reply_keypad("✅ پیام ذخیره شد! ارسال کن؟", keypad=broadcast_kb())
        return
    
    if session == "confirm_broadcast":
        if txt in ["✅ تایید و ارسال", "confirm_broadcast"]:
            info = data.get("broadcast_data", {}).get(uid)
            if not info:
                await message.reply("❌ پیامی یافت نشد")
                if uid in data["sessions"]:
                    del data["sessions"][uid]
                save_data(data)
                return
            
            await message.reply("🔄 در حال ارسال به همه کاربران...")
            success, fail = 0, 0
            
            for user in data["users"]:
                if user != uid:
                    try:
                        await bot_obj.forward_message(info["chat_id"], info["message_id"], user)
                        success += 1
                    except:
                        fail += 1
                    await asyncio.sleep(0.3)
            
            if uid in data["sessions"]:
                del data["sessions"][uid]
            if uid in data["broadcast_data"]:
                del data["broadcast_data"][uid]
            save_data(data)
            
            if uid == OWNER_ID:
                await message.reply_keypad(f"✅ ارسال شد:\nموفق: {success}\nناموفق: {fail}", keypad=owner_kb())
            else:
                await message.reply_keypad(f"✅ ارسال شد:\nموفق: {success}\nناموفق: {fail}", keypad=admin_kb())
        
        elif txt in ["❌ لغو", "cancel_broadcast"]:
            if uid in data["sessions"]:
                del data["sessions"][uid]
            if uid in data["broadcast_data"]:
                del data["broadcast_data"][uid]
            save_data(data)
            
            if uid == OWNER_ID:
                await message.reply_keypad("❌ لغو شد", keypad=owner_kb())
            else:
                await message.reply_keypad("❌ لغو شد", keypad=admin_kb())
        return
    
    if session == "waiting_for_sepi_text":
        if txt == "/cancel":
            if uid in data["sessions"]:
                del data["sessions"][uid]
            save_data(data)
            await message.reply_keypad("❌ لغو شد", keypad=change_buttons_kb())
            return
        
        data["sepi_text"] = txt
        if uid in data["sessions"]:
            del data["sessions"][uid]
        save_data(data)
        await message.reply_keypad("✅ متن دکمه سیپی رایگان با موفقیت تغییر کرد!", keypad=change_buttons_kb())
        return
    
    if session == "waiting_for_account_text":
        if txt == "/cancel":
            if uid in data["sessions"]:
                del data["sessions"][uid]
            save_data(data)
            await message.reply_keypad("❌ لغو شد", keypad=change_buttons_kb())
            return
        
        data["account_text"] = txt
        if uid in data["sessions"]:
            del data["sessions"][uid]
        save_data(data)
        await message.reply_keypad("✅ متن دکمه اکانت رایگان با موفقیت تغییر کرد!", keypad=change_buttons_kb())
        return
    
    if session == "waiting_for_combo_text":
        if txt == "/cancel":
            if uid in data["sessions"]:
                del data["sessions"][uid]
            save_data(data)
            await message.reply_keypad("❌ لغو شد", keypad=change_buttons_kb())
            return
        
        data["combo_text"] = txt
        if uid in data["sessions"]:
            del data["sessions"][uid]
        save_data(data)
        await message.reply_keypad("✅ متن دکمه کمبو رایگان با موفقیت تغییر کرد!", keypad=change_buttons_kb())
        return
    
    if session == "waiting_for_combo_khofen_text":
        if txt == "/cancel":
            if uid in data["sessions"]:
                del data["sessions"][uid]
            save_data(data)
            await message.reply_keypad("❌ لغو شد", keypad=change_buttons_kb())
            return
        
        data["combo_khofen_text"] = txt
        if uid in data["sessions"]:
            del data["sessions"][uid]
        save_data(data)
        await message.reply_keypad("✅ متن دکمه کمبو رایگان خفن با موفقیت تغییر کرد!", keypad=change_buttons_kb())
        return
    
    if session == "waiting_for_start_text":
        if txt == "/cancel":
            if uid in data["sessions"]:
                del data["sessions"][uid]
            save_data(data)
            
            if uid == OWNER_ID:
                await message.reply_keypad("❌ لغو شد", keypad=owner_kb())
            else:
                await message.reply_keypad("❌ لغو شد", keypad=admin_kb())
            return
        
        data["start_text"] = txt
        if uid in data["sessions"]:
            del data["sessions"][uid]
        save_data(data)
        
        if uid == OWNER_ID:
            await message.reply_keypad("✅ متن استارت با موفقیت تغییر کرد! این متن ثبت شد ✅", keypad=owner_kb())
        else:
            await message.reply_keypad("✅ متن استارت با موفقیت تغییر کرد! این متن ثبت شد ✅", keypad=admin_kb())
        return
    
    if session == "waiting_for_add_admin":
        if txt == "/cancel":
            if uid in data["sessions"]:
                del data["sessions"][uid]
            save_data(data)
            await message.reply_keypad("❌ افزودن ادمین لغو شد", keypad=owner_kb())
            return
        
        target_uid = txt.strip()
        
        if target_uid not in data["users"]:
            await message.reply_keypad("❌ این کاربر در ربات وجود ندارد! ابتدا کاربر ربات را استارت کند.", keypad=owner_kb())
            if uid in data["sessions"]:
                del data["sessions"][uid]
            save_data(data)
            return
        
        if target_uid in data["admins"]:
            await message.reply_keypad("❌ این کاربر قبلاً ادمین است!", keypad=owner_kb())
            if uid in data["sessions"]:
                del data["sessions"][uid]
            save_data(data)
            return
        
        data["admins"].append(target_uid)
        if uid in data["sessions"]:
            del data["sessions"][uid]
        save_data(data)
        
        await message.reply_keypad(f"✅ کاربر {target_uid} با موفقیت ادمین شد!", keypad=owner_kb())
        await bot_obj.send_message(target_uid, "🎉 به شما مقام ادمین در ربات اعطا شد!\nبرای ورود به پنل ادمین از دستور /panel استفاده کنید.")
        return
    
    if session == "waiting_for_remove_admin":
        if txt == "/cancel":
            if uid in data["sessions"]:
                del data["sessions"][uid]
            save_data(data)
            await message.reply_keypad("❌ حذف ادمین لغو شد", keypad=owner_kb())
            return
        
        target_uid = txt.strip()
        
        if target_uid not in data["admins"]:
            await message.reply_keypad("❌ این کاربر در لیست ادمین‌ها نیست!", keypad=owner_kb())
            if uid in data["sessions"]:
                del data["sessions"][uid]
            save_data(data)
            return
        
        if target_uid == OWNER_ID:
            await message.reply_keypad("❌ شما نمی‌توانید مالک ربات را حذف کنید!", keypad=owner_kb())
            if uid in data["sessions"]:
                del data["sessions"][uid]
            save_data(data)
            return
        
        data["admins"].remove(target_uid)
        if uid in data["sessions"]:
            del data["sessions"][uid]
        save_data(data)
        
        await message.reply_keypad(f"✅ کاربر {target_uid} از لیست ادمین‌ها حذف شد!", keypad=owner_kb())
        await bot_obj.send_message(target_uid, "❌ مقام ادمین شما از ربات گرفته شد!")
        return
    
    if txt == "✨ بررسی عضویت":
        if data.get("membership_status", {}).get(uid) == 1:
            data["membership_status"][uid] = 2
            save_data(data)
            await message.reply("<b>عضویت شما تایید شد حالا می‌توانید از قابلیت های ربات استفاده کنید 😎🔥</b>", parse_mode="HTML")
            await message.reply_keypad("<b>به بخش اصلی خوش آمدید! ⭐</b>", keypad=user_kb(), parse_mode="HTML")
        else:
            data["membership_status"][uid] = 1
            save_data(data)
            await message.reply("<b>درحال بررسی عضویت شما.....⚡</b>", parse_mode="HTML")
            await asyncio.sleep(1)
            await message.reply("<b>شما عضو کانال های بالا نیستید❌👆🏼</b>", parse_mode="HTML")
    
    elif txt == "/id":
        await message.reply(f"🆔 شناسه کاربری شما:\n`{uid}`")
    
    elif txt == "/panel":
        if uid == OWNER_ID:
            await message.reply_keypad("👑 پنل مالک ربات:", keypad=owner_kb())
        elif uid in data.get("admins", []):
            await message.reply_keypad("👑 پنل ادمین:", keypad=admin_kb())
        else:
            await message.reply("❌ شما دسترسی به پنل ندارید!")
    
    elif txt in ["🔙 خروج از پنل", "exit_panel"] and (uid == OWNER_ID or uid in data.get("admins", [])):
        await message.reply_keypad("🔙 از پنل خارج شدید", keypad=user_kb())
    
    elif txt == "👑 پنل ادمین" and uid == OWNER_ID:
        await message.reply_keypad("👑 پنل ادمین:", keypad=admin_kb())
    
    elif txt == "🔙 خروج از پنل مالک" and uid == OWNER_ID:
        await message.reply_keypad("🔙 از پنل مالک خارج شدید", keypad=user_kb())
    
    elif txt in ["➕ افزودن ادمین", "add_admin_btn"] and uid == OWNER_ID:
        data["sessions"][uid] = "waiting_for_add_admin"
        save_data(data)
        await message.reply_keypad(
            "➕ شناسه کاربری کسی میخواهید ادمین کنید ارسال کنید:\n\nلغو: /cancel",
            keypad=owner_kb()
        )
    
    elif txt in ["➖ حذف ادمین", "remove_admin_btn"] and uid == OWNER_ID:
        data["sessions"][uid] = "waiting_for_remove_admin"
        save_data(data)
        await message.reply_keypad(
            "➖ شناسه کاربری کسی میخواهید از ادمین حذف کنید ارسال کنید:\n\nلغو: /cancel",
            keypad=owner_kb()
        )
    
    elif txt in ["📋 لیست ادمین ها", "list_admins_btn"] and uid == OWNER_ID:
        admins_list = data.get("admins", [])
        if admins_list:
            text = "📋 لیست ادمین‌ها:\n\n"
            for i, admin_id in enumerate(admins_list, 1):
                text += f"{i}. `{admin_id}`\n"
            text += f"\n👥 تعداد: {len(admins_list)}"
        else:
            text = "❌ هیچ ادمینی وجود ندارد."
        await message.reply_keypad(text, keypad=owner_kb())
    
    elif txt == "🔑 پنل مالک" and uid == OWNER_ID:
        await message.reply_keypad("👑 پنل مالک ربات:", keypad=owner_kb())
    
    elif txt in ["📊 آمار کاربران", "stats_btn"] and (uid == OWNER_ID or uid in data.get("admins", [])):
        users_count = len(data["users"])
        await message.reply_keypad(
            f"📊 آمار ربات:\n\n👥 تعداد کاربران: {users_count} نفر",
            keypad=admin_kb() if uid in data.get("admins", []) else owner_kb()
        )
    
    elif txt in ["📢 پیام همگانی", "broadcast_btn"] and (uid == OWNER_ID or uid in data.get("admins", [])):
        data["sessions"][uid] = "waiting_broadcast"
        save_data(data)
        await message.reply_keypad(
            "📨 پیام خود را ارسال کنید:\n(میتواند متن، عکس، ویدیو یا هر چیز دیگری باشد)\n\nلغو: /cancel",
            keypad=admin_kb() if uid in data.get("admins", []) else owner_kb()
        )
    
    elif txt in ["✏️ تغییر دکمه ها", "change_buttons_btn"] and (uid == OWNER_ID or uid in data.get("admins", [])):
        await message.reply_keypad(
            "📝 لطفا دکمه مورد نظر برای تغییر متن را انتخاب کنید:",
            keypad=change_buttons_kb()
        )
    
    elif txt in ["📝 تغییر متن استارت", "change_start_btn"] and (uid == OWNER_ID or uid in data.get("admins", [])):
        data["sessions"][uid] = "waiting_for_start_text"
        save_data(data)
        await message.reply_keypad(
            "📝 متن جدید ارسالی start را ارسال کنید:\n\nلغو: /cancel",
            keypad=admin_kb() if uid in data.get("admins", []) else owner_kb()
        )
    
    elif txt in ["🔙 بازگشت به پنل ادمین", "back_to_admin"] and (uid == OWNER_ID or uid in data.get("admins", [])):
        if uid == OWNER_ID:
            await message.reply_keypad("🔙 بازگشت به پنل مالک:", keypad=owner_kb())
        else:
            await message.reply_keypad("🔙 بازگشت به پنل ادمین:", keypad=admin_kb())
    
    elif txt in ["💰 سیپی رایگان", "change_sepi_btn"] and (uid == OWNER_ID or uid in data.get("admins", [])):
        data["sessions"][uid] = "waiting_for_sepi_text"
        save_data(data)
        await message.reply_keypad(
            "📝 متن جدید دکمه سیپی رایگان را ارسال کنید:\n\nلغو: /cancel",
            keypad=change_buttons_kb()
        )
    
    elif txt in ["🎮 اکانت رایگان", "change_account_btn"] and (uid == OWNER_ID or uid in data.get("admins", [])):
        data["sessions"][uid] = "waiting_for_account_text"
        save_data(data)
        await message.reply_keypad(
            "📝 متن جدید دکمه اکانت رایگان را ارسال کنید:\n\nلغو: /cancel",
            keypad=change_buttons_kb()
        )
    
    elif txt in ["⚡ کمبو رایگان", "change_combo_btn"] and (uid == OWNER_ID or uid in data.get("admins", [])):
        data["sessions"][uid] = "waiting_for_combo_text"
        save_data(data)
        await message.reply_keypad(
            "📝 متن جدید دکمه کمبو رایگان را ارسال کنید:\n\nلغو: /cancel",
            keypad=change_buttons_kb()
        )
    
    elif txt in ["💎 کمبو رایگان خفن", "change_combo_khofen_btn"] and (uid == OWNER_ID or uid in data.get("admins", [])):
        data["sessions"][uid] = "waiting_for_combo_khofen_text"
        save_data(data)
        await message.reply_keypad(
            "📝 متن جدید دکمه کمبو رایگان خفن را ارسال کنید:\n\nلغو: /cancel",
            keypad=change_buttons_kb()
        )
    
    elif txt == "💰 سیپی رایگان":
        await message.reply(data.get("sepi_text", "در حال توسعه 🛠️"))
    
    elif txt == "🎮 اکانت رایگان":
        await message.reply(data.get("account_text", "در حال توسعه 🛠️"))
    
    elif txt == "⚡ کمبو رایگان":
        await message.reply(data.get("combo_text", "در حال توسعه 🛠️"))
    
    elif txt == "💎 کمبو رایگان خفن":
        await message.reply(data.get("combo_khofen_text", "در حال توسعه 🛠️"))
    
    elif txt == "👤 پروفایل":
        await message.reply(
            f"👤 پروفایل شما:\n\n"
            f"🆔 آیدی: {uid}\n"
            f"👥 جمعاً {len(data['users'])} کاربر در ربات"
        )

if __name__ == "__main__":
    print("🚀 ربات روشن شد!")
    print(f"📁 فایل دیتا: {DATA_FILE}")
    print(f"👑 ادمین: {OWNER_ID}")
    asyncio.run(bot.run())