"""
╔═══════════════════════════════════════════════════════════════╗
║   Arc Bot | آرک بات - نسخه 11.1.0 ULTRA                      ║
║   🛡️ فیچرهای امنیتی پیشرفته | Mention کاربر | بدون باگ      ║
╚═══════════════════════════════════════════════════════════════╝
"""

import requests
import json
import sqlite3
import threading
import time
import random
import string
import re
import os
import hashlib
import logging
import traceback
from datetime import datetime, timedelta
from typing import Optional, Dict, List, Tuple
from flask import Flask, request as flask_request, jsonify
from concurrent.futures import ThreadPoolExecutor
import queue

# ============================================================
#                   CONFIGURATIONS
# ============================================================
BOT_TOKEN = os.getenv("RUBIKA_TOKEN", "CFEECB0FJEVRMWCDYHIMNBPKGAQJIBRBYAPTTWMHNKGECYRRXSNFYWGVMWICUENL")
API_SECRET = os.getenv("API_SECRET", "ARC_BOT_SECRET_KEY_2026_VERY_SECURE")
API_PORT = int(os.getenv("API_PORT", "5000"))
BOT_NAME = "Arc Bot | آرک بات"
BOT_VERSION = "11.1.0 ULTRA"
LOG_FILE = "arc_bot.log"
DB_FILE = "arc_bot.db"
SUBS_BACKUP_FILE = "subscriptions_backup.json"
API_TIMEOUT = 10
UPDATE_INTERVAL = 1
STARTUP_TIME = int(time.time())

SUPER_ADMIN_ID = "BEHI_PER"

MAX_WORKERS = 20
executor = ThreadPoolExecutor(max_workers=MAX_WORKERS)
message_queue = queue.Queue()

# ============================================================
#                   LOGGING
# ============================================================
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s | %(levelname)-8s | %(message)s',
    datefmt='%H:%M:%S',
    handlers=[
        logging.FileHandler(LOG_FILE, encoding='utf-8'),
        logging.StreamHandler()
    ]
)
logger = logging.getLogger("ArcBot")
logger.info("=" * 60)
logger.info(f"🚀 {BOT_NAME} v{BOT_VERSION}")
logger.info(f"⚡ Workers: {MAX_WORKERS}")
logger.info("=" * 60)


# ============================================================
#              SUBSCRIPTION BACKUP
# ============================================================
class SubscriptionBackup:
    def __init__(self, filepath: str = SUBS_BACKUP_FILE):
        self.filepath = filepath
        self.lock = threading.Lock()
        self._ensure_file()
    
    def _ensure_file(self):
        if not os.path.exists(self.filepath):
            self._write({"subscriptions": {}})
    
    def _read(self) -> dict:
        try:
            with open(self.filepath, 'r', encoding='utf-8') as f:
                return json.load(f)
        except:
            return {"subscriptions": {}}
    
    def _write(self, data: dict):
        try:
            with open(self.filepath, 'w', encoding='utf-8') as f:
                json.dump(data, f, ensure_ascii=False, indent=2)
        except Exception as e:
            logger.error(f"خطا در backup: {e}")
    
    def save_code(self, code: str, expire_date: str, plan_name: str, price: float = 0):
        with self.lock:
            data = self._read()
            data["subscriptions"][code] = {
                "expire_date": expire_date, "plan_name": plan_name, "price": price,
                "created_at": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
                "status": "unused", "chat_id": None
            }
            self._write(data)
    
    def get_code(self, code: str) -> Optional[dict]:
        with self.lock:
            return self._read().get("subscriptions", {}).get(code)
    
    def mark_used(self, code: str, chat_id: str):
        with self.lock:
            data = self._read()
            if code in data["subscriptions"]:
                data["subscriptions"][code]["status"] = "active"
                data["subscriptions"][code]["chat_id"] = chat_id
                self._write(data)
    
    def mark_expired(self, code: str):
        with self.lock:
            data = self._read()
            if code in data["subscriptions"]:
                data["subscriptions"][code]["status"] = "expired"
                self._write(data)


# ============================================================
#                 DATABASE
# ============================================================
class Database:
    def __init__(self, db_name: str = DB_FILE):
        self.db_name = db_name
        self.local = threading.local()
        self.lock = threading.RLock()
        self._create_tables()

    def get_conn(self):
        if not hasattr(self.local, 'conn') or self.local.conn is None:
            self.local.conn = sqlite3.connect(self.db_name, check_same_thread=False)
            self.local.conn.execute("PRAGMA journal_mode=WAL")
            self.local.conn.execute("PRAGMA synchronous=NORMAL")
            self.local.conn.execute("PRAGMA cache_size=-64000")
            self.local.conn.execute("PRAGMA temp_store=MEMORY")
        return self.local.conn

    def _create_tables(self):
        conn = self.get_conn()
        with self.lock:
            c = conn.cursor()
            c.execute('''CREATE TABLE IF NOT EXISTS subscriptions (
                code TEXT PRIMARY KEY, chat_id TEXT, created_at TEXT, expire_date TEXT,
                status TEXT DEFAULT 'unused', plan_name TEXT, price REAL DEFAULT 0, activated_by TEXT)''')
            c.execute('''CREATE TABLE IF NOT EXISTS groups_table (
                chat_id TEXT PRIMARY KEY, owner_id TEXT, subscription_code TEXT, created_at TEXT,
                expire_date TEXT, settings TEXT DEFAULT '{}', title TEXT,
                total_messages INTEGER DEFAULT 0, last_activity TEXT)''')
            c.execute('''CREATE TABLE IF NOT EXISTS admins (
                id INTEGER PRIMARY KEY AUTOINCREMENT, chat_id TEXT, user_id TEXT,
                role TEXT DEFAULT 'admin', added_by TEXT, added_at TEXT, UNIQUE(chat_id, user_id))''')
            c.execute('''CREATE TABLE IF NOT EXISTS vips (
                id INTEGER PRIMARY KEY AUTOINCREMENT, chat_id TEXT, user_id TEXT,
                added_by TEXT, added_at TEXT, UNIQUE(chat_id, user_id))''')
            c.execute('''CREATE TABLE IF NOT EXISTS ignores (
                id INTEGER PRIMARY KEY AUTOINCREMENT, chat_id TEXT, ignorer_id TEXT,
                ignored_id TEXT, created_at TEXT, UNIQUE(chat_id, ignorer_id, ignored_id))''')
            c.execute('''CREATE TABLE IF NOT EXISTS warnings (
                id INTEGER PRIMARY KEY AUTOINCREMENT, chat_id TEXT, user_id TEXT,
                count INTEGER DEFAULT 0, last_warn TEXT, UNIQUE(chat_id, user_id))''')
            c.execute('''CREATE TABLE IF NOT EXISTS spam_logs (
                id INTEGER PRIMARY KEY AUTOINCREMENT, chat_id TEXT, user_id TEXT,
                timestamp INTEGER, message_id TEXT)''')
            c.execute('''CREATE TABLE IF NOT EXISTS mutes (
                id INTEGER PRIMARY KEY AUTOINCREMENT, chat_id TEXT, user_id TEXT,
                expire_time INTEGER, reason TEXT, muted_by TEXT, UNIQUE(chat_id, user_id))''')
            c.execute('''CREATE TABLE IF NOT EXISTS blacklist_words (
                id INTEGER PRIMARY KEY AUTOINCREMENT, chat_id TEXT, word TEXT,
                added_by TEXT, added_at TEXT)''')
            c.execute('''CREATE TABLE IF NOT EXISTS user_profiles (
                user_id TEXT PRIMARY KEY, first_name TEXT, last_name TEXT,
                username TEXT, last_seen TEXT, account_created INTEGER DEFAULT 0)''')
            c.execute('''CREATE TABLE IF NOT EXISTS action_logs (
                id INTEGER PRIMARY KEY AUTOINCREMENT, chat_id TEXT, action_type TEXT,
                action_by TEXT, target_id TEXT, details TEXT, timestamp TEXT)''')
            c.execute('''CREATE TABLE IF NOT EXISTS group_stats (
                id INTEGER PRIMARY KEY AUTOINCREMENT, chat_id TEXT, user_id TEXT,
                message_count INTEGER DEFAULT 0, last_message TEXT, UNIQUE(chat_id, user_id))''')
            c.execute('''CREATE TABLE IF NOT EXISTS processed_messages (
                message_id TEXT PRIMARY KEY, processed_at INTEGER)''')
            c.execute('''CREATE TABLE IF NOT EXISTS last_offset (
                id INTEGER PRIMARY KEY CHECK (id = 1), offset_value TEXT)''')
            c.execute('''CREATE TABLE IF NOT EXISTS messages_cache (
                message_id TEXT PRIMARY KEY,
                sender_id TEXT NOT NULL,
                chat_id TEXT NOT NULL,
                created_at INTEGER NOT NULL
            )''')
            c.execute('''CREATE TABLE IF NOT EXISTS message_logs (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                chat_id TEXT, message_id TEXT, sender_id TEXT,
                sender_name TEXT, text TEXT, time INTEGER, processed_at INTEGER
            )''')
            c.execute('''CREATE TABLE IF NOT EXISTS menu_states (
                key TEXT PRIMARY KEY, state TEXT NOT NULL, data TEXT, updated_at INTEGER NOT NULL
            )''')
            # 🎯 جدول جدید برای flood detection
            c.execute('''CREATE TABLE IF NOT EXISTS flood_logs (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                chat_id TEXT, user_id TEXT, timestamp INTEGER
            )''')
            # 🎯 جدول pin ها
            c.execute('''CREATE TABLE IF NOT EXISTS pinned_messages (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                chat_id TEXT, message_id TEXT, pinned_by TEXT, pinned_at TEXT,
                UNIQUE(chat_id)
            )''')
            
            c.execute("CREATE INDEX IF NOT EXISTS idx_msg_logs_chat ON message_logs(chat_id, time)")
            c.execute("CREATE INDEX IF NOT EXISTS idx_processed ON processed_messages(processed_at)")
            c.execute("CREATE INDEX IF NOT EXISTS idx_cache ON messages_cache(created_at)")
            c.execute("CREATE INDEX IF NOT EXISTS idx_groups_active ON groups_table(expire_date)")
            c.execute("CREATE INDEX IF NOT EXISTS idx_flood ON flood_logs(chat_id, user_id, timestamp)")
            
            c.execute("INSERT OR IGNORE INTO last_offset (id, offset_value) VALUES (1, '')")
            conn.commit()

    def execute(self, query: str, args: tuple = (), fetch: bool = True, commit: bool = True):
        conn = self.get_conn()
        with self.lock:
            try:
                cursor = conn.cursor()
                cursor.execute(query, args)
                if commit:
                    conn.commit()
                if fetch:
                    return cursor.fetchall()
            except sqlite3.Error as e:
                logger.error(f"خطای DB: {e}")
            return []

    def get_one(self, query: str, args: tuple = ()):
        result = self.execute(query, args)
        return result[0] if result else None
    
    def get_last_offset(self) -> Optional[str]:
        result = self.get_one("SELECT offset_value FROM last_offset WHERE id = 1")
        return result[0] if result and result[0] else None
    
    def save_last_offset(self, offset: str):
        self.execute("UPDATE last_offset SET offset_value = ? WHERE id = 1", (offset,))
    
    def save_message(self, message_id: str, sender_id: str, chat_id: str):
        self.execute(
            "INSERT OR REPLACE INTO messages_cache (message_id, sender_id, chat_id, created_at) VALUES (?, ?, ?, ?)",
            (str(message_id), str(sender_id), str(chat_id), int(time.time()))
        )
    
    def get_message_sender(self, message_id: str) -> Optional[str]:
        result = self.get_one("SELECT sender_id FROM messages_cache WHERE message_id = ?", (str(message_id),))
        return result[0] if result else None
    
    def cleanup_old_messages(self):
        old_time = int(time.time()) - 86400
        self.execute("DELETE FROM messages_cache WHERE created_at < ?", (old_time,))
        self.execute("DELETE FROM message_logs WHERE processed_at < ?", (int(time.time()) - 604800,))
        self.execute("DELETE FROM flood_logs WHERE timestamp < ?", (int(time.time()) - 300,))
    
    def save_message_log(self, chat_id, message_id, sender_id, sender_name, text, msg_time):
        self.execute(
            "INSERT INTO message_logs (chat_id, message_id, sender_id, sender_name, text, time, processed_at) VALUES (?, ?, ?, ?, ?, ?, ?)",
            (str(chat_id), str(message_id), str(sender_id), sender_name, text, msg_time, int(time.time()))
        )
    
    def get_message_logs(self, chat_id, limit=100, offset=0):
        return self.execute(
            "SELECT * FROM message_logs WHERE chat_id = ? ORDER BY time DESC LIMIT ? OFFSET ?",
            (str(chat_id), limit, offset)
        )
    
    def set_menu_state(self, chat_id, user_id, state, data=None):
        key = f"{chat_id}_{user_id}"
        self.execute(
            "INSERT OR REPLACE INTO menu_states (key, state, data, updated_at) VALUES (?, ?, ?, ?)",
            (key, state, json.dumps(data or {}, ensure_ascii=False), int(time.time()))
        )
    
    def get_menu_state(self, chat_id, user_id):
        key = f"{chat_id}_{user_id}"
        result = self.get_one("SELECT state, data FROM menu_states WHERE key = ?", (key,))
        if result:
            try:
                return result[0], json.loads(result[1]) if result[1] else {}
            except:
                return result[0], {}
        return None, None
    
    def clear_menu_state(self, chat_id, user_id):
        key = f"{chat_id}_{user_id}"
        self.execute("DELETE FROM menu_states WHERE key = ?", (key,))


db = Database()
subs_backup = SubscriptionBackup()


# ============================================================
#              RUBIKA API CLIENT
# ============================================================
class RubikaClient:
    def __init__(self, token: str):
        self.token = token
        self.base_url = f"https://botapi.rubika.ir/v3/{token}"
        self.session = requests.Session()
        adapter = requests.adapters.HTTPAdapter(
            pool_connections=50, pool_maxsize=50, max_retries=2, pool_block=False
        )
        self.session.mount('https://', adapter)
        self.session.mount('http://', adapter)
        self.session.headers.update({
            "Content-Type": "application/json",
            "Accept": "application/json",
            "User-Agent": "ArcBot/11.1"
        })
        # 🎯 Cache ID بات
        self._bot_user_id = None

    def _request(self, method: str, data: dict) -> Optional[dict]:
        url = f"{self.base_url}/{method}"
        try:
            response = self.session.post(url, json=data, timeout=API_TIMEOUT)
            result = response.json()
            if isinstance(result, dict) and "data" in result:
                if result.get("status") != "OK":
                    logger.debug(f"⚠️ {method}: {result.get('status')} - {result.get('dev_message', '')}")
                return result["data"]
            return result
        except requests.exceptions.Timeout:
            logger.error(f"⏱️ Timeout: {method}")
            return None
        except Exception as e:
            logger.error(f"❌ {method}: {e}")
            return None

    def is_group(self, chat_id: str) -> bool:
        return str(chat_id).startswith("g")

    def get_bot_user_id(self) -> Optional[str]:
        """🎯 دریافت ID بات (cache شده)"""
        if self._bot_user_id:
            return self._bot_user_id
        me = self.get_me()
        if me and "bot" in me:
            self._bot_user_id = me["bot"].get("bot_id")
            logger.info(f"🤖 Bot User ID: {self._bot_user_id}")
            return self._bot_user_id
        return None

    def is_bot(self, user_id: str) -> bool:
        """🎯 بررسی اینکه آیا user_id مربوط به خود بات است"""
        bot_id = self.get_bot_user_id()
        return bot_id and str(user_id) == str(bot_id)

    def send_message(self, chat_id: str, text: str,
                     reply_to_message_id: Optional[str] = None,
                     keypad: Optional[dict] = None,
                     metadata: Optional[dict] = None,
                     disable_notification: bool = False) -> Optional[dict]:
        data = {"chat_id": str(chat_id), "text": str(text)[:4096]}
        if reply_to_message_id:
            data["reply_to_message_id"] = str(reply_to_message_id)
        if keypad:
            if self.is_group(chat_id):
                pass  # دکمه در گروه کار نمی‌کند
            else:
                data["inline_keypad"] = keypad
        if metadata:
            data["metadata"] = metadata
        if disable_notification:
            data["disable_notification"] = True
        result = self._request("sendMessage", data)
        if result:
            msg_id = result.get("message_id")
            if msg_id:
                db.save_message(msg_id, "BOT", str(chat_id))
        return result

    def send_with_mention(self, chat_id: str, text: str, user_id: str, display_name: str,
                          reply_to_message_id: Optional[str] = None) -> Optional[dict]:
        """
        🎯 ارسال پیام با mention کاربر
        display_name در متن قرار می‌گیرد و به user_id لینک می‌شود
        """
        # پیدا کردن موقعیت display_name در متن
        name_in_text = display_name
        idx = text.find(name_in_text)
        
        if idx == -1:
            # اگر نام در متن نبود، اضافه‌اش می‌کنیم
            text = f"{text} {name_in_text}"
            idx = len(text) - len(name_in_text)
        
        # ساخت metadata برای mention
        # محاسبه from_index بر اساس UTF-16 (برای ایموجی)
        from_index = len(text[:idx].encode('utf-16-le')) // 2
        length = len(name_in_text.encode('utf-16-le')) // 2
        
        metadata = {
            "meta_data_parts": [{
                "type": "MentionText",
                "from_index": from_index,
                "length": length,
                "mention_text_user_id": str(user_id)
            }]
        }
        
        return self.send_message(chat_id, text, reply_to_message_id=reply_to_message_id, metadata=metadata)

    def edit_message_text(self, chat_id, message_id, text):
        return self._request("editMessageText", {
            "chat_id": str(chat_id), "message_id": str(message_id), "text": str(text)[:4096]
        })

    def delete_message(self, chat_id, message_id):
        return self._request("deleteMessage", {"chat_id": str(chat_id), "message_id": str(message_id)})

    def ban_chat_member(self, chat_id, user_id):
        return self._request("banChatMember", {"chat_id": str(chat_id), "user_id": str(user_id)})

    def unban_chat_member(self, chat_id, user_id):
        return self._request("unbanChatMember", {"chat_id": str(chat_id), "user_id": str(user_id)})

    def get_updates(self, limit=20, offset_id=None):
        data = {"limit": limit}
        if offset_id:
            data["offset_id"] = offset_id
        return self._request("getUpdates", data)

    def get_me(self):
        try:
            response = self.session.post(f"{self.base_url}/getMe", json={}, timeout=API_TIMEOUT)
            return response.json().get("data")
        except:
            return None

    def get_chat(self, chat_id):
        return self._request("getChat", {"chat_id": str(chat_id)})


client = RubikaClient(BOT_TOKEN)


# ============================================================
#              SUBSCRIPTION MANAGER
# ============================================================
class SubscriptionManager:
    @staticmethod
    def generate_code():
        chars = string.ascii_uppercase + string.digits
        for _ in range(100):
            code = '-'.join(''.join(random.choices(chars, k=4)) for _ in range(4))
            if not db.get_one("SELECT code FROM subscriptions WHERE code = ?", (code,)) and not subs_backup.get_code(code):
                return code
        raise Exception("Cannot generate code")

    @staticmethod
    def create_subscription(days=30, hours=0, plan_name="Default", price=0.0):
        if days == 0 and hours == 0:
            days = 30
        code = SubscriptionManager.generate_code()
        expire_dt = datetime.now() + timedelta(days=days, hours=hours)
        expire_str = expire_dt.strftime("%Y-%m-%d %H:%M:%S")
        created_str = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        db.execute(
            "INSERT INTO subscriptions (code, created_at, expire_date, status, plan_name, price) VALUES (?, ?, ?, 'unused', ?, ?)",
            (code, created_str, expire_str, plan_name, price)
        )
        subs_backup.save_code(code, expire_str, plan_name, price)
        logger.info(f"💳 اشتراک جدید: {code}")
        return code, expire_str

    @staticmethod
    def activate(code, chat_id, activated_by=None):
        code = code.strip().upper()
        result = db.get_one("SELECT expire_date, status FROM subscriptions WHERE code = ?", (code,))
        if not result:
            backup = subs_backup.get_code(code)
            if backup:
                db.execute("INSERT OR IGNORE INTO subscriptions (code, created_at, expire_date, status, plan_name, price) VALUES (?, ?, ?, ?, ?, ?)",
                          (code, backup.get("created_at", ""), backup.get("expire_date", ""), backup.get("status", "unused"), backup.get("plan_name", ""), backup.get("price", 0)))
                result = db.get_one("SELECT expire_date, status FROM subscriptions WHERE code = ?", (code,))
        if not result:
            return ("not_found", "❌ کد اشتراک نامعتبر است!\n💡 فرمت: XXXX-XXXX-XXXX-XXXX")
        expire_date, status = result
        if status == "active":
            active_for = db.get_one("SELECT chat_id FROM subscriptions WHERE code = ?", (code,))
            if active_for and str(active_for[0]) == str(chat_id):
                return ("already_active", "ℹ️ این اشتراک برای همین گروه فعال است.")
            return ("used", "❌ این کد قبلاً استفاده شده است!")
        if status == "expired":
            return ("expired", "❌ این کد منقضی شده است.")
        try:
            expire_dt = datetime.strptime(expire_date, "%Y-%m-%d %H:%M:%S")
            if datetime.now() > expire_dt:
                db.execute("UPDATE subscriptions SET status = 'expired' WHERE code = ?", (code,))
                subs_backup.mark_expired(code)
                return ("expired", "❌ این کد منقضی شده است.")
        except:
            pass
        active_sub = db.get_one("SELECT subscription_code FROM groups_table WHERE chat_id = ? AND expire_date > ? AND subscription_code != ''",
                               (str(chat_id), datetime.now().strftime("%Y-%m-%d %H:%M:%S")))
        if active_sub and active_sub[0]:
            return ("already_active", f"⚠️ گروه اشتراک فعال دارد: {active_sub[0]}")
        db.execute("UPDATE subscriptions SET chat_id = ?, status = 'active', activated_by = ? WHERE code = ?", (str(chat_id), activated_by, code))
        db.execute("UPDATE groups_table SET subscription_code = ?, expire_date = ? WHERE chat_id = ?", (code, expire_date, str(chat_id)))
        subs_backup.mark_used(code, str(chat_id))
        try:
            remaining = expire_dt - datetime.now()
            days_left = remaining.days
            hours_left = remaining.seconds // 3600
        except:
            days_left, hours_left = 0, 0
        return ("success", f"🎉 اشتراک فعال شد!\n🔹 کد: {code}\n🔹 انقضا: {expire_date}\n🔹 باقیمانده: {days_left} روز و {hours_left} ساعت\n\n📚 راهنما | ⚙️ تنظیمات")

    @staticmethod
    def get_status(chat_id):
        result = db.get_one("SELECT subscription_code, expire_date FROM groups_table WHERE chat_id = ?", (str(chat_id),))
        if not result:
            return {"active": False, "installed": False}
        code, expire_date = result
        if not code or not expire_date:
            return {"active": False, "installed": True}
        try:
            expire_dt = datetime.strptime(expire_date, "%Y-%m-%d %H:%M:%S")
            active = datetime.now() < expire_dt
            remaining = expire_dt - datetime.now() if active else timedelta()
            return {"active": active, "installed": True, "code": code, "expire_date": expire_date,
                    "days_left": remaining.days, "hours_left": remaining.seconds // 3600}
        except:
            return {"active": False, "installed": True}

    @staticmethod
    def check_expirations():
        now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        expired = db.execute("SELECT chat_id, subscription_code FROM groups_table WHERE expire_date IS NOT NULL AND expire_date != '' AND expire_date < ? AND subscription_code != ''", (now,))
        for chat_id, code in expired:
            if code:
                try:
                    client.send_message(chat_id, f"⏰ اشتراک منقضی شد!\n🔹 کد: {code}")
                except:
                    pass
                db.execute("UPDATE groups_table SET subscription_code = '', expire_date = '' WHERE chat_id = ?", (chat_id,))
                db.execute("UPDATE subscriptions SET status = 'expired' WHERE code = ?", (code,))
                subs_backup.mark_expired(code)


sub_manager = SubscriptionManager()


# ============================================================
#                 SETTINGS - با فیچرهای جدید
# ============================================================
def get_default_settings():
    return {
        # سیستم اخطار
        "warning_enabled": False, "warning_limit": 3,
        "warning_action": "mute_temp", "warning_action_time": 3600,
        "warning_delete_time": 10,
        
        # آنتی اسپم
        "anti_spam_enabled": False, "anti_spam_limit": 5,
        "anti_spam_time": 10, "anti_spam_action": "mute_temp",
        "anti_spam_action_time": 600,
        
        # 🎯 فیچرهای جدید
        "anti_flood_enabled": False,  # ضد فلود
        "anti_flood_limit": 10,  # حداکثر پیام در بازه زمانی
        "anti_flood_time": 3,  # بازه زمانی (ثانیه)
        "anti_flood_action": "mute_temp",
        "anti_flood_action_time": 300,  # 5 دقیقه
        
        "lock_new_accounts": False,  # قفل اکانت‌های جدید
        "new_account_days": 7,  # حداقل سن اکانت (روز)
        
        "filter_repeat_chars": False,  # فیلتر تکرار کاراکتر
        "repeat_chars_threshold": 8,  # حداقل تکرار
        
        "night_mode_enabled": False,  # حالت شب
        "night_mode_start": 23,  # ساعت شروع (24h)
        "night_mode_end": 7,  # ساعت پایان
        "night_mode_action": "delete",  # delete یا mute
        
        "max_messages_per_minute": 0,  # حداکثر پیام در دقیقه (0 = غیرفعال)
        
        "filter_english_in_persian": False,  # فیلتر انگلیسی در متن فارسی
        "english_threshold": 0.5,  # درصد انگلیسی
        
        "lock_edit_messages": False,  # قفل ویرایش
        
        "lock_pin": True,  # فقط ادمین بتواند پیام پین کند
        
        # دسترسی ادمین
        "admin_permissions": {
            "ban": True, "mute": True, "unban": True, "unmute": True,
            "add_admin": False, "add_vip": True, "warn": True,
            "delete_messages": True, "clean_messages": True,
            "lock_group": False, "change_settings": False,
            "view_logs": True, "view_stats": True
        },
        
        # دسترسی ویژه
        "vip_permissions": {
            "send_link": True, "forward": True, "tag": True,
            "send_gif": True, "send_sticker": True, "send_video": True,
            "send_audio": True, "send_file": True, "use_commands": True,
            "caps_lock": True, "ignore_users": True
        },
        
        # دسترسی کاربر
        "user_permissions": {
            "send_link": False, "forward": False, "tag": False,
            "send_gif": False, "send_sticker": True, "send_video": True,
            "send_audio": True, "send_file": True, "use_commands": True,
            "caps_lock": True, "ignore_users": True
        },
        
        "filters": {
            "filter_link": True, "filter_forward": True, "filter_tag": True,
            "filter_gif": True, "filter_sticker": False, "filter_video": False,
            "filter_audio": False, "filter_file": False, "filter_caps": False
        },
        
        "welcome_enabled": True, "goodbye_enabled": True,
        "welcome_message": "🌸 خوش آمدید {first_name}!\nبه گروه {group_name} خوش آمدید.",
        "goodbye_message": "👋 {first_name} گروه را ترک کرد.",
        
        "link_patterns": [
            r"https?://[^\s]+", r"www\.[^\s]+", r"t\.me/[^\s]+",
            r"rubika\.ir/[^\s]+", r"@[a-zA-Z0-9_]{5,}"
        ],
        "blacklist_enabled": True,
        "rules": "", "group_lock": False, "silent_mode": False
    }


def get_settings(chat_id):
    result = db.get_one("SELECT settings FROM groups_table WHERE chat_id = ?", (str(chat_id),))
    if result and result[0]:
        try:
            settings = json.loads(result[0])
            defaults = get_default_settings()
            def merge(d, default):
                for k, v in default.items():
                    if k not in d:
                        d[k] = v
                    elif isinstance(v, dict) and isinstance(d.get(k), dict):
                        merge(d[k], v)
            merge(settings, defaults)
            return settings
        except:
            pass
    return get_default_settings()


def save_settings(chat_id, settings):
    db.execute("UPDATE groups_table SET settings = ? WHERE chat_id = ?",
              (json.dumps(settings, ensure_ascii=False), str(chat_id)))


# ============================================================
#                 ROLE & HELPERS
# ============================================================
def is_owner(chat_id, user_id):
    r = db.get_one("SELECT owner_id FROM groups_table WHERE chat_id = ?", (str(chat_id),))
    return bool(r and str(r[0]) == str(user_id))

def is_admin(chat_id, user_id):
    if is_owner(chat_id, user_id):
        return True
    return len(db.execute("SELECT id FROM admins WHERE chat_id = ? AND user_id = ?", (str(chat_id), str(user_id)))) > 0

def is_vip(chat_id, user_id):
    if is_admin(chat_id, user_id):
        return True
    return len(db.execute("SELECT id FROM vips WHERE chat_id = ? AND user_id = ?", (str(chat_id), str(user_id)))) > 0

def is_super_admin(user_id):
    return str(user_id).strip().upper() == SUPER_ADMIN_ID.upper()

def is_muted(chat_id, user_id):
    r = db.get_one("SELECT expire_time FROM mutes WHERE chat_id = ? AND user_id = ?", (str(chat_id), str(user_id)))
    if r and r[0] > time.time():
        return True
    if r:
        db.execute("DELETE FROM mutes WHERE chat_id = ? AND user_id = ?", (str(chat_id), str(user_id)))
    return False

def get_role(chat_id, user_id):
    if is_super_admin(user_id): return "super_admin"
    if is_owner(chat_id, user_id): return "owner"
    if is_admin(chat_id, user_id): return "admin"
    if is_vip(chat_id, user_id): return "vip"
    return "user"


def get_user_display_name(user_id: str) -> str:
    """
    🎯 دریافت نام نمایشی کاربر برای Mention
    ترتیب اولویت:
    1. @username
    2. first_name + last_name
    3. first_name
    4. user_id (آخرین راه حل)
    """
    if not user_id:
        return "کاربر"
    
    profile = db.get_one("SELECT first_name, last_name, username FROM user_profiles WHERE user_id = ?", (str(user_id),))
    if profile:
        first_name, last_name, username = profile
        if username and str(username).strip():
            return f"@{username.strip()}"
        if first_name:
            name = str(first_name).strip()
            if last_name and str(last_name).strip():
                name += f" {last_name.strip()}"
            return name
    return str(user_id)[:15] + "..."


def add_warning(chat_id, user_id):
    now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    r = db.get_one("SELECT count FROM warnings WHERE chat_id = ? AND user_id = ?", (str(chat_id), str(user_id)))
    if r:
        count = r[0] + 1
        db.execute("UPDATE warnings SET count = ?, last_warn = ? WHERE chat_id = ? AND user_id = ?",
                  (count, now, str(chat_id), str(user_id)))
    else:
        count = 1
        db.execute("INSERT INTO warnings (chat_id, user_id, count, last_warn) VALUES (?, ?, ?, ?)",
                  (str(chat_id), str(user_id), 1, now))
    return count

def reset_warnings(chat_id, user_id):
    db.execute("DELETE FROM warnings WHERE chat_id = ? AND user_id = ?", (str(chat_id), str(user_id)))

def check_ignore(chat_id, sender_id, reply_sender_id):
    if not reply_sender_id:
        return False
    return len(db.execute("SELECT id FROM ignores WHERE chat_id = ? AND ignorer_id = ? AND ignored_id = ?",
                         (str(chat_id), str(reply_sender_id), str(sender_id)))) > 0

def mute_user(chat_id, user_id, seconds, reason="", muted_by=""):
    db.execute("INSERT OR REPLACE INTO mutes (chat_id, user_id, expire_time, reason, muted_by) VALUES (?, ?, ?, ?, ?)",
              (str(chat_id), str(user_id), time.time() + seconds, reason, muted_by))

def unmute_user(chat_id, user_id):
    db.execute("DELETE FROM mutes WHERE chat_id = ? AND user_id = ?", (str(chat_id), str(user_id)))

def ban_user(chat_id, user_id, reason=""):
    client.ban_chat_member(chat_id, user_id)

def unban_user(chat_id, user_id):
    client.unban_chat_member(chat_id, user_id)

def log_action(chat_id, action_type, action_by, target_id=None, details=""):
    db.execute("INSERT INTO action_logs (chat_id, action_type, action_by, target_id, details, timestamp) VALUES (?, ?, ?, ?, ?, ?)",
              (str(chat_id), action_type, str(action_by), str(target_id or ""), details,
               datetime.now().strftime("%Y-%m-%d %H:%M:%S")))

def format_time(s):
    if s < 60: return f"{int(s)} ثانیه"
    if s < 3600: return f"{int(s/60)} دقیقه"
    if s < 86400: return f"{int(s/3600)} ساعت"
    if s < 604800: return f"{int(s/86400)} روز"
    return f"{int(s/604800)} هفته"

def parse_time(text):
    text = text.strip().lower()
    m = re.match(r"(\d+)\s*(ثانیه|دقیقه|ساعت|روز|هفته)?", text)
    if not m:
        try: return int(text) * 60
        except: return None
    v = int(m.group(1))
    u = m.group(2) or "دقیقه"
    for key, mult in {"ثانیه": 1, "دقیقه": 60, "ساعت": 3600, "روز": 86400, "هفته": 604800}.items():
        if key in u: return v * mult
    return v * 60


# ============================================================
#              FILTER ENGINE - با فیچرهای جدید
# ============================================================
class Filter:
    @staticmethod
    def has_link(text, settings):
        if not text: return False
        for p in settings.get("link_patterns", get_default_settings()["link_patterns"]):
            try:
                if re.search(p, text, re.IGNORECASE):
                    return True
            except: continue
        return False

    @staticmethod
    def has_blacklist(text, chat_id):
        if not text: return None
        words = db.execute("SELECT word FROM blacklist_words WHERE chat_id = ?", (str(chat_id),))
        t = text.lower()
        for w in words:
            if w[0].lower() in t:
                return w[0]
        return None

    @staticmethod
    def is_spam(chat_id, user_id, settings):
        if not settings.get("anti_spam_enabled"): return False
        now = int(time.time())
        db.execute("INSERT INTO spam_logs (chat_id, user_id, timestamp) VALUES (?, ?, ?)", (str(chat_id), str(user_id), now))
        db.execute("DELETE FROM spam_logs WHERE chat_id = ? AND timestamp < ?", (str(chat_id), now - 60))
        r = db.get_one("SELECT COUNT(*) FROM spam_logs WHERE chat_id = ? AND user_id = ? AND timestamp > ?",
                      (str(chat_id), str(user_id), now - settings.get("anti_spam_time", 10)))
        return (r[0] if r else 0) > settings.get("anti_spam_limit", 5)

    @staticmethod
    def is_caps(text):
        if not text or len(text) < 10: return False
        eng = [c for c in text if c.isalpha() and ord(c) < 128]
        if len(eng) < 5: return False
        return sum(1 for c in eng if c.isupper()) / len(eng) > 0.7

    @staticmethod
    def is_forwarded(msg):
        return bool(msg.get("forwarded_from"))

    @staticmethod
    def has_media(msg, media_type):
        file_info = msg.get("file") or {}
        if media_type == "gif" and file_info.get("type") == "Gif": return True
        if media_type == "sticker" and msg.get("sticker"): return True
        if media_type == "video" and file_info.get("type") == "Video": return True
        if media_type == "audio" and file_info.get("type") in ["Music", "Voice"]: return True
        if media_type == "file" and file_info.get("type") == "File": return True
        return False

    @staticmethod
    def is_flood(chat_id, user_id, settings):
        """🎯 تشخیص فلود - پیام‌های خیلی سریع پشت سر هم"""
        if not settings.get("anti_flood_enabled"): return False
        
        now = int(time.time())
        limit = settings.get("anti_flood_limit", 10)
        time_window = settings.get("anti_flood_time", 3)
        
        # ثبت پیام فعلی
        db.execute("INSERT INTO flood_logs (chat_id, user_id, timestamp) VALUES (?, ?, ?)",
                  (str(chat_id), str(user_id), now))
        
        # پاک کردن پیام‌های قدیمی
        db.execute("DELETE FROM flood_logs WHERE chat_id = ? AND timestamp < ?",
                  (str(chat_id), now - time_window))
        
        # شمارش پیام‌ها در بازه زمانی
        r = db.get_one("SELECT COUNT(*) FROM flood_logs WHERE chat_id = ? AND user_id = ? AND timestamp > ?",
                      (str(chat_id), str(user_id), now - time_window))
        count = r[0] if r else 0
        
        return count > limit

    @staticmethod
    def is_repeat_chars(text, settings):
        """🎯 تشخیص تکرار کاراکتر (مثلا سلاااااام)"""
        if not settings.get("filter_repeat_chars"): return False
        if not text or len(text) < 5: return False
        
        threshold = settings.get("repeat_chars_threshold", 8)
        
        # بررسی تکرار یک کاراکتر
        for char in set(text):
            if char.strip() and char not in " \n\t":
                # شمارش پشت سر هم
                max_repeat = 1
                current_repeat = 1
                for i in range(1, len(text)):
                    if text[i] == char and text[i-1] == char:
                        current_repeat += 1
                        max_repeat = max(max_repeat, current_repeat)
                    else:
                        current_repeat = 1
                
                if max_repeat >= threshold:
                    return True
        
        return False

    @staticmethod
    def is_new_account(user_id, settings):
        """🎯 تشخیص اکانت تازه‌ساز"""
        if not settings.get("lock_new_accounts"): return False
        
        min_days = settings.get("new_account_days", 7)
        profile = db.get_one("SELECT account_created FROM user_profiles WHERE user_id = ?", (str(user_id),))
        
        if not profile or not profile[0]:
            # اولین بار است که می‌بینیم، فرض می‌کنیم اکانت جدید است
            db.execute("UPDATE user_profiles SET account_created = ? WHERE user_id = ?",
                      (int(time.time()), str(user_id)))
            return True
        
        account_age_seconds = int(time.time()) - int(profile[0])
        account_age_days = account_age_seconds / 86400
        
        return account_age_days < min_days

    @staticmethod
    def is_in_night_mode(settings):
        """🎯 بررسی اینکه آیا در حالت شب هستیم"""
        if not settings.get("night_mode_enabled"): return False
        
        now = datetime.now()
        current_hour = now.hour
        start = settings.get("night_mode_start", 23)
        end = settings.get("night_mode_end", 7)
        
        # حالت شبانه (مثلا 23 تا 7 صبح)
        if start > end:
            return current_hour >= start or current_hour < end
        else:
            return start <= current_hour < end

    @staticmethod
    def is_english_in_persian(text, settings):
        """🎯 تشخیص متن انگلیسی در متن فارسی (اسپم)"""
        if not settings.get("filter_english_in_persian"): return False
        if not text or len(text) < 5: return False
        
        threshold = settings.get("english_threshold", 0.5)
        
        total = len([c for c in text if c.strip()])
        if total < 5: return False
        
        english_chars = len([c for c in text if c.isalpha() and ord(c) < 128])
        persian_chars = len([c for c in text if '\u0600' <= c <= '\u06FF'])
        
        # اگر بیشتر متن انگلیسی است و کمی فارسی دارد
        if english_chars > 0 and persian_chars > 0:
            ratio = english_chars / total
            if ratio > threshold:
                return True
        
        return False


# ============================================================
#              HELP TEXTS
# ============================================================
HELP_USER = """📘 راهنمای کاربر
━━━━━━━━━━━━━━━━━

🔹 راهنما - این منو
🔹 وضعیت - وضعیت اشتراک
🔹 آیدی - ID شما
🔹 قوانین - قوانین گروه
🔹 آمار من - آمار فعالیت
🔹 اخطارهای من - تعداد اخطارها

🚫 قابلیت‌های شخصی:
🔹 ایگنور @user - بلاک کاربر
🔹 لغو ایگنور @user - آنبلاک
🔹 لیست ایگنور - مشاهده لیست

━━━━━━━━━━━━━━━━━
💡 پیام‌های شما بررسی می‌شوند:
• لینک‌ها و فوروارد
• تگ دیگران و اسپم
• کلمات ممنوعه
• تکرار کاراکتر (مثل سلااااام)
• فلود و ارسال سریع"""

HELP_ADMIN = """🛡️ راهنمای ادمین
━━━━━━━━━━━━━━━━━

⚠️ روش‌های مدیریت کاربر:

📌 روش ۱: ریپلای
روی پیام کاربر ریپلای بزنید و بنویسید:
• بن / حذف بن
• میوت / میوت [زمان] / حذف میوت
• اخطار / حذف اخطار
• ویژه / حذف ویژه

📌 روش ۲: با @username
• بن @username
• میوت @user 30 دقیقه
• ویژه @user

📌 روش ۳: با ID
• بن u0abc...
• میوت u0abc... 1 ساعت

━━━━━━━━━━━━━━━━━
🧹 پاکسازی [تعداد]
📊 آمار کامل
📜 لاگ‌ها"""

HELP_OWNER = """👑 راهنمای مالک
━━━━━━━━━━━━━━━━━

⚙️ تنظیمات - منوی تنظیمات کامل
👥 مدیریت ادمین‌ها و ویژه‌ها
📚 لیست سیاه کلمات
📝 تنظیم خوش‌آمد/خداحافظ/قوانین
🔒 قفل گروه / باز کردن گروه
📦 پشتیبان
📊 آمار کامل / لاگ‌ها

━━━━━━━━━━━━━━━━━
💡 متغیرهای خوش‌آمد/خداحافظ:
{first_name} {last_name} {username}
{user_id} {group_name}"""


# ============================================================
#              MENU SYSTEM - با فیچرهای جدید
# ============================================================
def main_menu_text():
    return """⚙️ منوی اصلی تنظیمات
━━━━━━━━━━━━━━━━━

1️⃣ سیستم اخطار
2️⃣ آنتی اسپم
3️⃣ 🆕 آنتی فلود (ضد رگبار)
4️⃣ 🆕 امنیت اکانت
5️⃣ 🆕 فیلترهای پیشرفته
6️⃣ دسترسی ادمین‌ها
7️⃣ دسترسی کاربران ویژه
8️⃣ دسترسی کاربران عادی
9️⃣ فیلترهای رسانه
🔟 خوش‌آمد و خداحافظ
1️⃣1️⃣ قوانین
1️⃣2️⃣ قفل گروه
1️⃣3️⃣ حالت سکوت
1️⃣4️⃣ لیست سیاه
1️⃣5️⃣ مشاهده تنظیمات
0️⃣ خروج

━━━━━━━━━━━━━━━━━
💡 عدد مورد نظر را ارسال کنید"""


def warning_menu_text(settings):
    enabled = "✅ فعال" if settings.get("warning_enabled") else "❌ غیرفعال"
    limit = settings.get("warning_limit", 3)
    action = settings.get("warning_action", "mute")
    atime = settings.get("warning_action_time", 3600)
    dtime = settings.get("warning_delete_time", 10)
    actions = {"ban": "🔨 اخراج", "mute": "🔇 میوت دائم", "mute_temp": f"🔇 میوت ({format_time(atime)})"}
    return f"""⚠️ تنظیمات سیستم اخطار
━━━━━━━━━━━━━━━━━
📌 وضعیت: {enabled}
📌 حد اخطار: {limit}
📌 اکشن نهایی: {actions.get(action, action)}
📌 زمان حذف پیام اخطار: {dtime} ثانیه

1️⃣ فعال/غیرفعال
2️⃣ افزایش حد
3️⃣ کاهش حد
4️⃣ تغییر اکشن
5️⃣ زمان میوت موقت
6️⃣ زمان حذف پیام
0️⃣ بازگشت"""


def spam_menu_text(settings):
    enabled = "✅ فعال" if settings.get("anti_spam_enabled") else "❌ غیرفعال"
    limit = settings.get("anti_spam_limit", 5)
    tw = settings.get("anti_spam_time", 10)
    action = settings.get("anti_spam_action", "mute_temp")
    atime = settings.get("anti_spam_action_time", 600)
    actions = {"ban": "🔨 اخراج", "mute": "🔇 میوت دائم", "mute_temp": f"🔇 میوت ({format_time(atime)})"}
    return f"""🛡️ تنظیمات آنتی اسپم
━━━━━━━━━━━━━━━━━
📌 وضعیت: {enabled}
📌 حد: {limit} پیام در {tw} ثانیه
📌 اکشن: {actions.get(action, action)}

1️⃣ فعال/غیرفعال
2️⃣ افزایش حد
3️⃣ کاهش حد
4️⃣ افزایش زمان
5️⃣ کاهش زمان
6️⃣ تغییر اکشن
7️⃣ زمان میوت
0️⃣ بازگشت"""


def flood_menu_text(settings):
    """🎯 منوی آنتی فلود"""
    enabled = "✅ فعال" if settings.get("anti_flood_enabled") else "❌ غیرفعال"
    limit = settings.get("anti_flood_limit", 10)
    tw = settings.get("anti_flood_time", 3)
    action = settings.get("anti_flood_action", "mute_temp")
    atime = settings.get("anti_flood_action_time", 300)
    actions = {"ban": "🔨 اخراج", "mute": "🔇 میوت دائم", "mute_temp": f"🔇 میوت ({format_time(atime)})"}
    return f"""🌊 تنظیمات آنتی فلود (ضد رگبار)
━━━━━━━━━━━━━━━━━
📌 وضعیت: {enabled}
📌 حد: {limit} پیام در {tw} ثانیه
📌 اکشن: {actions.get(action, action)}

💡 مثال: اگر کاربر ۱۰ پیام در ۳ ثانیه بفرستد، فلود محسوب می‌شود

1️⃣ فعال/غیرفعال
2️⃣ افزایش حد ({limit} ← {limit+1})
3️⃣ کاهش حد ({limit} ← {max(3, limit-1)})
4️⃣ افزایش زمان ({tw}s ← {tw+1}s)
5️⃣ کاهش زمان ({tw}s ← {max(2, tw-1)}s)
6️⃣ تغییر اکشن
7️⃣ زمان میوت
0️⃣ بازگشت"""


def account_security_menu_text(settings):
    """🎯 منوی امنیت اکانت"""
    lock_new = "✅ فعال" if settings.get("lock_new_accounts") else "❌ غیرفعال"
    min_days = settings.get("new_account_days", 7)
    max_msg = settings.get("max_messages_per_minute", 0)
    max_msg_text = f"{max_msg} پیام" if max_msg > 0 else "نامحدود"
    
    return f"""🔐 امنیت اکانت
━━━━━━━━━━━━━━━━━
📌 قفل اکانت جدید: {lock_new}
📌 حداقل سن اکانت: {min_days} روز
📌 حداکثر پیام در دقیقه: {max_msg_text}

💡 قفل اکانت جدید: کاربرانی که اکانتشان کمتر از N روز سن دارد، نمی‌توانند پیام بفرستند

1️⃣ فعال/غیرفعال قفل اکانت جدید
2️⃣ افزایش حداقل سن ({min_days} ← {min_days+1})
3️⃣ کاهش حداقل سن ({min_days} ← {max(1, min_days-1)})
4️⃣ تنظیم حداکثر پیام در دقیقه
0️⃣ بازگشت"""


def advanced_filters_menu_text(settings):
    """🎯 منوی فیلترهای پیشرفته"""
    repeat = "✅" if settings.get("filter_repeat_chars") else "❌"
    repeat_t = settings.get("repeat_chars_threshold", 8)
    english = "✅" if settings.get("filter_english_in_persian") else "❌"
    night = "✅" if settings.get("night_mode_enabled") else "❌"
    night_s = settings.get("night_mode_start", 23)
    night_e = settings.get("night_mode_end", 7)
    lock_edit = "✅" if settings.get("lock_edit_messages") else "❌"
    lock_pin = "✅" if settings.get("lock_pin") else "❌"
    
    return f"""🎯 فیلترهای پیشرفته
━━━━━━━━━━━━━━━━━
1️⃣ فیلتر تکرار کاراکتر: {repeat} ({repeat_t} کاراکتر)
   💡 مثل سلاااااام
   
2️⃣ فیلتر انگلیسی در فارسی: {english}
   💡 تشخیص متن‌های مختلط اسپم
   
3️⃣ حالت شب: {night} ({night_s}:00 - {night_e}:00)
   💡 محدودیت ارسال مدیا در شب
   
4️⃣ قفل ویرایش پیام: {lock_edit}
   💡 جلوگیری از ویرایش پیام‌ها
   
5️⃣ قفل پین: {lock_pin}
   💡 فقط ادمین‌ها بتوانند پیام پین کنند

0️⃣ بازگشت"""


def perms_menu_text(role, settings):
    titles = {"admin": "👥 دسترسی ادمین‌ها", "vip": "💎 دسترسی ویژه", "user": "👤 دسترسی کاربران"}
    perms = settings.get(f"{role}_permissions", {})
    labels = {
        "ban": "🔨 بن", "mute": "🔇 میوت", "unban": "✅ رفع بن",
        "unmute": "🔊 رفع میوت", "add_admin": "➕ افزودن ادمین",
        "add_vip": "💎 افزودن ویژه", "warn": "⚠️ اخطار",
        "delete_messages": "🗑️ حذف پیام", "clean_messages": "🧹 پاکسازی",
        "lock_group": "🔒 قفل گروه", "change_settings": "⚙️ تنظیمات",
        "view_logs": "📜 لاگ", "view_stats": "📊 آمار",
        "send_link": "🔗 لینک", "forward": "↗️ فوروارد",
        "tag": "🏷️ تگ", "send_gif": "🎬 گیف", "send_sticker": "🎨 استیکر",
        "send_video": "📹 ویدیو", "send_audio": "🎵 صدا", "send_file": "📎 فایل",
        "use_commands": "🎯 دستورات", "caps_lock": "🔠 حروف بزرگ",
        "ignore_users": "🚫 ایگنور"
    }
    text = f"""{titles.get(role, role)}
━━━━━━━━━━━━━━━━━\n\n"""
    perm_keys = list(labels.keys())
    for i, k in enumerate(perm_keys, 1):
        if k in perms:
            s = "✅" if perms[k] else "❌"
            text += f"{i:2d}. {labels[k]}: {s}\n"
    text += f"\n0. بازگشت\n\n💡 عدد برای تغییر"
    return text


def filter_menu_text(settings):
    filters = settings.get("filters", {})
    labels = {
        "filter_link": "🔗 فیلتر لینک", "filter_forward": "↗️ فیلتر فوروارد",
        "filter_tag": "🏷️ فیلتر تگ", "filter_gif": "🎬 فیلتر گیف",
        "filter_sticker": "🎨 فیلتر استیکر", "filter_video": "📹 فیلتر ویدیو",
        "filter_audio": "🎵 فیلتر صدا", "filter_file": "📎 فیلتر فایل",
        "filter_caps": "🔠 فیلتر حروف بزرگ"
    }
    text = """🔗 تنظیمات فیلترهای رسانه
━━━━━━━━━━━━━━━━━\n\n"""
    filter_keys = list(labels.keys())
    for i, k in enumerate(filter_keys, 1):
        s = "✅" if filters.get(k) else "❌"
        text += f"{i}. {labels[k]}: {s}\n"
    text += f"\n0. بازگشت\n\n💡 عدد برای تغییر"
    return text


def welcome_menu_text(settings):
    w_enabled = "✅" if settings.get("welcome_enabled") else "❌"
    g_enabled = "✅" if settings.get("goodbye_enabled") else "❌"
    return f"""👋 تنظیمات خوش‌آمد/خداحافظ
━━━━━━━━━━━━━━━━━

🌸 خوش‌آمد: {w_enabled}
متن: {settings.get('welcome_message', '')}

👋 خداحافظ: {g_enabled}
متن: {settings.get('goodbye_message', '')}

1️⃣ فعال/غیرفعال خوش‌آمد
2️⃣ تنظیم متن خوش‌آمد
3️⃣ فعال/غیرفعال خداحافظ
4️⃣ تنظیم متن خداحافظ
0️⃣ بازگشت"""


def mute_time_menu_text():
    return """🕐 انتخاب زمان میوت
1. ۱ دقیقه
2. ۵ دقیقه
3. ۱۵ دقیقه
4. ۳۰ دقیقه
5. ۱ ساعت
6. ۶ ساعت
7. ۱ روز
8. ۱ هفته
0. بازگشت"""


# ============================================================
#        EXTRACT TARGET USER & REPLY
# ============================================================
def extract_target_user(text, chat_id):
    text = text.strip()
    username_match = re.search(r'@([a-zA-Z0-9_]{3,})', text)
    if username_match:
        username = username_match.group(1).lower()
        result = db.get_one("SELECT user_id FROM user_profiles WHERE LOWER(username) = ?", (username,))
        if result:
            return result[0]
    uid_match = re.search(r'\b(u[a-f0-9]{32})\b', text)
    if uid_match:
        return uid_match.group(1)
    return None


def get_reply_sender(chat_id, msg):
    reply_id = msg.get("reply_to_message_id")
    if not reply_id:
        return None
    sender = db.get_message_sender(reply_id)
    if sender:
        return sender
    reply_msg = msg.get("reply_to_message")
    if isinstance(reply_msg, dict):
        sender = reply_msg.get("sender_id")
        if sender:
            db.save_message(reply_id, sender, chat_id)
            return sender
    return None


# ============================================================
#              COMMAND HANDLER - با mention و رفع باگ
# ============================================================
def handle_commands(chat_id, sender_id, message_id, text, reply_sender_id, settings, role, msg):
    is_super_admin_user = (role == "super_admin")
    is_owner_user = (role == "owner") or is_super_admin_user
    is_admin_user = (role in ["admin", "owner", "super_admin"])
    is_group = client.is_group(chat_id)
    
    def send(txt, reply_id=None, keypad=None):
        return client.send_message(chat_id, txt, reply_to_message_id=reply_id, keypad=keypad)
    
    def send_with_user(txt, user_id, reply_id=None):
        """ارسال پیام با mention کاربر"""
        display_name = get_user_display_name(user_id)
        return client.send_with_mention(chat_id, txt, user_id, display_name, reply_to_message_id=reply_id)
    
    original = text.strip()
    cmd = original.lower()
    
    # 🎯 استخراج target user
    target_user = None
    if any(kw in cmd for kw in ["بن", "اخراج", "میوت", "ویژه", "اخطار", "ایگنور", "حذف بن", "حذف میوت", "حذف ویژه", "حذف اخطار", "لغو ایگنور", "افزودن ادمین", "حذف ادمین"]):
        target_user = extract_target_user(original, chat_id)
    
    final_target = reply_sender_id or target_user
    
    # 🎯🎯🎯 رفع باگ: جلوگیری از انجام اکشن روی خود بات
    if final_target and client.is_bot(final_target):
        send("❌ نمی‌توانید روی خود ربات عملیات انجام دهید!")
        return
    
    # 🎯 جلوگیری از انجام اکشن روی خود کاربر
    if final_target and final_target == sender_id and cmd in ["بن", "اخراج", "میوت", "اخطار"]:
        send("❌ نمی‌توانید این عملیات را روی خودتان انجام دهید!")
        return
    
    logger.debug(f"🎯 کامند: '{cmd}' | reply: {reply_sender_id} | extracted: {target_user} | role: {role}")
    
    # ==========================================
    #             MENU STATE HANDLER
    # ==========================================
    current_state, state_data = db.get_menu_state(chat_id, sender_id)
    
    if current_state and is_owner_user:
        if cmd == "0":
            if current_state == "main":
                db.clear_menu_state(chat_id, sender_id)
                send("✅ از منو خارج شدید.")
            elif current_state in ["warning", "spam", "flood", "account_sec", "advanced_filters", 
                                   "perms_admin", "perms_vip", "perms_user", "filters", "welcome"]:
                db.set_menu_state(chat_id, sender_id, "main")
                send(main_menu_text())
            else:
                db.clear_menu_state(chat_id, sender_id)
                send("✅ از منو خارج شدید.")
            return
        
        if current_state == "main":
            if cmd == "1":
                db.set_menu_state(chat_id, sender_id, "warning")
                send(warning_menu_text(settings))
            elif cmd == "2":
                db.set_menu_state(chat_id, sender_id, "spam")
                send(spam_menu_text(settings))
            elif cmd == "3":
                db.set_menu_state(chat_id, sender_id, "flood")
                send(flood_menu_text(settings))
            elif cmd == "4":
                db.set_menu_state(chat_id, sender_id, "account_sec")
                send(account_security_menu_text(settings))
            elif cmd == "5":
                db.set_menu_state(chat_id, sender_id, "advanced_filters")
                send(advanced_filters_menu_text(settings))
            elif cmd == "6":
                db.set_menu_state(chat_id, sender_id, "perms_admin")
                send(perms_menu_text("admin", settings))
            elif cmd == "7":
                db.set_menu_state(chat_id, sender_id, "perms_vip")
                send(perms_menu_text("vip", settings))
            elif cmd == "8":
                db.set_menu_state(chat_id, sender_id, "perms_user")
                send(perms_menu_text("user", settings))
            elif cmd == "9":
                db.set_menu_state(chat_id, sender_id, "filters")
                send(filter_menu_text(settings))
            elif cmd == "10":
                db.set_menu_state(chat_id, sender_id, "welcome")
                send(welcome_menu_text(settings))
            elif cmd == "11":
                db.set_menu_state(chat_id, sender_id, "rules")
                send("📝 قوانین فعلی:\n" + (settings.get("rules") or "تنظیم نشده") + "\n\n📌 قوانین جدید را ارسال کنید.\n💡 برای لغو: 0")
            elif cmd == "12":
                settings["group_lock"] = not settings.get("group_lock", False)
                save_settings(chat_id, settings)
                status = "🔒 قفل" if settings["group_lock"] else "🔓 باز"
                send(f"✅ وضعیت گروه: {status}")
                send(main_menu_text())
            elif cmd == "13":
                settings["silent_mode"] = not settings.get("silent_mode", False)
                save_settings(chat_id, settings)
                status = "✅ فعال" if settings["silent_mode"] else "❌ غیرفعال"
                send(f"🔕 حالت سکوت: {status}")
                send(main_menu_text())
            elif cmd == "14":
                words = db.execute("SELECT word FROM blacklist_words WHERE chat_id = ?", (str(chat_id),))
                if words:
                    txt = "🚫 کلمات ممنوعه:\n\n" + "\n".join(f"{i+1}. {w[0]}" for i, w in enumerate(words))
                else:
                    txt = "✅ لیست سیاه خالی است"
                send(txt + "\n\n0. بازگشت")
            elif cmd == "15":
                txt = "📊 تنظیمات فعلی:\n\n"
                txt += f"⚠️ اخطار: {'✅' if settings.get('warning_enabled') else '❌'}\n"
                txt += f"🛡️ آنتی اسپم: {'✅' if settings.get('anti_spam_enabled') else '❌'}\n"
                txt += f"🌊 آنتی فلود: {'✅' if settings.get('anti_flood_enabled') else '❌'}\n"
                txt += f"🔐 قفل اکانت جدید: {'✅' if settings.get('lock_new_accounts') else '❌'}\n"
                txt += f"🌸 خوش‌آمد: {'✅' if settings.get('welcome_enabled') else '❌'}\n"
                txt += f"🔒 قفل گروه: {'✅' if settings.get('group_lock') else '❌'}\n"
                send(txt + "\n0. بازگشت")
            return
        
        elif current_state == "warning":
            if cmd == "1":
                settings["warning_enabled"] = not settings.get("warning_enabled", False)
                save_settings(chat_id, settings)
                send(warning_menu_text(settings))
            elif cmd == "2":
                settings["warning_limit"] = min(settings.get("warning_limit", 3) + 1, 10)
                save_settings(chat_id, settings)
                send(warning_menu_text(settings))
            elif cmd == "3":
                settings["warning_limit"] = max(settings.get("warning_limit", 3) - 1, 1)
                save_settings(chat_id, settings)
                send(warning_menu_text(settings))
            elif cmd == "4":
                cycle = ["mute", "mute_temp", "ban"]
                cur = settings.get("warning_action", "mute")
                settings["warning_action"] = cycle[(cycle.index(cur) + 1) % len(cycle)] if cur in cycle else "mute"
                save_settings(chat_id, settings)
                send(warning_menu_text(settings))
            elif cmd == "5":
                db.set_menu_state(chat_id, sender_id, "mute_time", {"target": "warning"})
                send(mute_time_menu_text())
            elif cmd == "6":
                db.set_menu_state(chat_id, sender_id, "warn_delete_time")
                send("⏱️ زمان حذف پیام اخطار:\n1. ۵ ثانیه\n2. ۱۰ ثانیه\n3. ۱۵ ثانیه\n4. ۲۰ ثانیه\n5. ۳۰ ثانیه\n6. ۶۰ ثانیه\n0. بازگشت")
            return
        
        elif current_state == "spam":
            if cmd == "1":
                settings["anti_spam_enabled"] = not settings.get("anti_spam_enabled", False)
                save_settings(chat_id, settings)
                send(spam_menu_text(settings))
            elif cmd == "2":
                settings["anti_spam_limit"] = min(settings.get("anti_spam_limit", 5) + 1, 20)
                save_settings(chat_id, settings)
                send(spam_menu_text(settings))
            elif cmd == "3":
                settings["anti_spam_limit"] = max(settings.get("anti_spam_limit", 5) - 1, 2)
                save_settings(chat_id, settings)
                send(spam_menu_text(settings))
            elif cmd == "4":
                settings["anti_spam_time"] = min(settings.get("anti_spam_time", 10) + 5, 60)
                save_settings(chat_id, settings)
                send(spam_menu_text(settings))
            elif cmd == "5":
                settings["anti_spam_time"] = max(settings.get("anti_spam_time", 10) - 5, 5)
                save_settings(chat_id, settings)
                send(spam_menu_text(settings))
            elif cmd == "6":
                cycle = ["mute", "mute_temp", "ban"]
                cur = settings.get("anti_spam_action", "mute_temp")
                settings["anti_spam_action"] = cycle[(cycle.index(cur) + 1) % len(cycle)] if cur in cycle else "mute_temp"
                save_settings(chat_id, settings)
                send(spam_menu_text(settings))
            elif cmd == "7":
                db.set_menu_state(chat_id, sender_id, "mute_time", {"target": "spam"})
                send(mute_time_menu_text())
            return
        
        elif current_state == "flood":
            """🎯 هندلر آنتی فلود"""
            if cmd == "1":
                settings["anti_flood_enabled"] = not settings.get("anti_flood_enabled", False)
                save_settings(chat_id, settings)
                send(flood_menu_text(settings))
            elif cmd == "2":
                settings["anti_flood_limit"] = min(settings.get("anti_flood_limit", 10) + 1, 50)
                save_settings(chat_id, settings)
                send(flood_menu_text(settings))
            elif cmd == "3":
                settings["anti_flood_limit"] = max(settings.get("anti_flood_limit", 10) - 1, 3)
                save_settings(chat_id, settings)
                send(flood_menu_text(settings))
            elif cmd == "4":
                settings["anti_flood_time"] = min(settings.get("anti_flood_time", 3) + 1, 30)
                save_settings(chat_id, settings)
                send(flood_menu_text(settings))
            elif cmd == "5":
                settings["anti_flood_time"] = max(settings.get("anti_flood_time", 3) - 1, 2)
                save_settings(chat_id, settings)
                send(flood_menu_text(settings))
            elif cmd == "6":
                cycle = ["mute", "mute_temp", "ban"]
                cur = settings.get("anti_flood_action", "mute_temp")
                settings["anti_flood_action"] = cycle[(cycle.index(cur) + 1) % len(cycle)] if cur in cycle else "mute_temp"
                save_settings(chat_id, settings)
                send(flood_menu_text(settings))
            elif cmd == "7":
                db.set_menu_state(chat_id, sender_id, "mute_time", {"target": "flood"})
                send(mute_time_menu_text())
            return
        
        elif current_state == "account_sec":
            """🎯 هندلر امنیت اکانت"""
            if cmd == "1":
                settings["lock_new_accounts"] = not settings.get("lock_new_accounts", False)
                save_settings(chat_id, settings)
                send(account_security_menu_text(settings))
            elif cmd == "2":
                settings["new_account_days"] = min(settings.get("new_account_days", 7) + 1, 90)
                save_settings(chat_id, settings)
                send(account_security_menu_text(settings))
            elif cmd == "3":
                settings["new_account_days"] = max(settings.get("new_account_days", 7) - 1, 1)
                save_settings(chat_id, settings)
                send(account_security_menu_text(settings))
            elif cmd == "4":
                db.set_menu_state(chat_id, sender_id, "set_max_msg")
                send("📝 حداکثر پیام در دقیقه را وارد کنید.\n\n💡 مثال: 20\n💡 برای غیرفعال کردن: 0\n💡 برای لغو: 0 (بازگشت)")
            return
        
        elif current_state == "set_max_msg":
            try:
                val = int(cmd)
                if val >= 0:
                    settings["max_messages_per_minute"] = val
                    save_settings(chat_id, settings)
                    db.set_menu_state(chat_id, sender_id, "account_sec")
                    send(f"✅ حداکثر پیام در دقیقه: {val if val > 0 else 'نامحدود'}")
                    send(account_security_menu_text(settings))
                else:
                    send("❌ عدد نامعتبر")
            except:
                send("❌ لطفاً فقط عدد وارد کنید")
            return
        
        elif current_state == "advanced_filters":
            """🎯 هندلر فیلترهای پیشرفته"""
            if cmd == "1":
                settings["filter_repeat_chars"] = not settings.get("filter_repeat_chars", False)
                save_settings(chat_id, settings)
                send(advanced_filters_menu_text(settings))
            elif cmd == "2":
                # افزایش threshold
                settings["repeat_chars_threshold"] = min(settings.get("repeat_chars_threshold", 8) + 1, 20)
                save_settings(chat_id, settings)
                send(advanced_filters_menu_text(settings))
            elif cmd == "3":
                # کاهش threshold
                settings["repeat_chars_threshold"] = max(settings.get("repeat_chars_threshold", 8) - 1, 4)
                save_settings(chat_id, settings)
                send(advanced_filters_menu_text(settings))
            elif cmd == "4":
                settings["filter_english_in_persian"] = not settings.get("filter_english_in_persian", False)
                save_settings(chat_id, settings)
                send(advanced_filters_menu_text(settings))
            elif cmd == "5":
                settings["night_mode_enabled"] = not settings.get("night_mode_enabled", False)
                save_settings(chat_id, settings)
                send(advanced_filters_menu_text(settings))
            elif cmd == "6":
                # تنظیم ساعت شروع حالت شب
                db.set_menu_state(chat_id, sender_id, "set_night_start")
                send("🌙 ساعت شروع حالت شب را وارد کنید (0-23).\nمثال: 23")
            elif cmd == "7":
                # تنظیم ساعت پایان حالت شب
                db.set_menu_state(chat_id, sender_id, "set_night_end")
                send("🌅 ساعت پایان حالت شب را وارد کنید (0-23).\nمثال: 7")
            elif cmd == "8":
                settings["lock_edit_messages"] = not settings.get("lock_edit_messages", False)
                save_settings(chat_id, settings)
                send(advanced_filters_menu_text(settings))
            elif cmd == "9":
                settings["lock_pin"] = not settings.get("lock_pin", True)
                save_settings(chat_id, settings)
                send(advanced_filters_menu_text(settings))
            return
        
        elif current_state == "set_night_start":
            try:
                val = int(cmd)
                if 0 <= val <= 23:
                    settings["night_mode_start"] = val
                    save_settings(chat_id, settings)
                    db.set_menu_state(chat_id, sender_id, "advanced_filters")
                    send(f"✅ ساعت شروع: {val}:00")
                    send(advanced_filters_menu_text(settings))
                else:
                    send("❌ عدد باید بین 0 تا 23 باشد")
            except:
                send("❌ لطفاً فقط عدد وارد کنید")
            return
        
        elif current_state == "set_night_end":
            try:
                val = int(cmd)
                if 0 <= val <= 23:
                    settings["night_mode_end"] = val
                    save_settings(chat_id, settings)
                    db.set_menu_state(chat_id, sender_id, "advanced_filters")
                    send(f"✅ ساعت پایان: {val}:00")
                    send(advanced_filters_menu_text(settings))
                else:
                    send("❌ عدد باید بین 0 تا 23 باشد")
            except:
                send("❌ لطفاً فقط عدد وارد کنید")
            return
        
        elif current_state in ["perms_admin", "perms_vip", "perms_user"]:
            role_type = current_state.replace("perms_", "")
            perms = settings.get(f"{role_type}_permissions", {})
            labels = ["ban", "mute", "unban", "unmute", "add_admin", "add_vip", "warn",
                     "delete_messages", "clean_messages", "lock_group", "change_settings",
                     "view_logs", "view_stats", "send_link", "forward", "tag", "send_gif",
                     "send_sticker", "send_video", "send_audio", "send_file", "use_commands",
                     "caps_lock", "ignore_users"]
            try:
                idx = int(cmd) - 1
                if 0 <= idx < len(labels):
                    key = labels[idx]
                    if key in perms:
                        perms[key] = not perms.get(key, False)
                        settings[f"{role_type}_permissions"] = perms
                        save_settings(chat_id, settings)
                        send(perms_menu_text(role_type, settings))
            except:
                pass
            return
        
        elif current_state == "filters":
            filters = settings.get("filters", {})
            filter_keys = ["filter_link", "filter_forward", "filter_tag", "filter_gif",
                          "filter_sticker", "filter_video", "filter_audio", "filter_file", "filter_caps"]
            try:
                idx = int(cmd) - 1
                if 0 <= idx < len(filter_keys):
                    key = filter_keys[idx]
                    filters[key] = not filters.get(key, False)
                    settings["filters"] = filters
                    save_settings(chat_id, settings)
                    send(filter_menu_text(settings))
            except:
                pass
            return
        
        elif current_state == "welcome":
            if cmd == "1":
                settings["welcome_enabled"] = not settings.get("welcome_enabled", True)
                save_settings(chat_id, settings)
                send(welcome_menu_text(settings))
            elif cmd == "2":
                db.set_menu_state(chat_id, sender_id, "set_welcome")
                send("📝 متن خوش‌آمد جدید را ارسال کنید.\n\n0. لغو")
            elif cmd == "3":
                settings["goodbye_enabled"] = not settings.get("goodbye_enabled", True)
                save_settings(chat_id, settings)
                send(welcome_menu_text(settings))
            elif cmd == "4":
                db.set_menu_state(chat_id, sender_id, "set_goodbye")
                send("📝 متن خداحافظ جدید را ارسال کنید.\n\n0. لغو")
            return
        
        elif current_state == "set_welcome":
            settings["welcome_message"] = original
            save_settings(chat_id, settings)
            db.set_menu_state(chat_id, sender_id, "welcome")
            send("✅ پیام خوش‌آمد تغییر کرد.")
            return
        
        elif current_state == "set_goodbye":
            settings["goodbye_message"] = original
            save_settings(chat_id, settings)
            db.set_menu_state(chat_id, sender_id, "welcome")
            send("✅ پیام خداحافظ تغییر کرد.")
            return
        
        elif current_state == "rules":
            settings["rules"] = original
            save_settings(chat_id, settings)
            db.set_menu_state(chat_id, sender_id, "main")
            send("✅ قوانین تغییر کرد.")
            return
        
        elif current_state == "mute_time":
            times = [60, 300, 900, 1800, 3600, 21600, 86400, 604800]
            try:
                idx = int(cmd) - 1
                if 0 <= idx < len(times):
                    seconds = times[idx]
                    target = state_data.get("target", "warning")
                    if target == "warning":
                        settings["warning_action_time"] = seconds
                    elif target == "spam":
                        settings["anti_spam_action_time"] = seconds
                    elif target == "flood":
                        settings["anti_flood_action_time"] = seconds
                    save_settings(chat_id, settings)
                    db.set_menu_state(chat_id, sender_id, target if target in ["warning", "spam", "flood"] else "warning")
                    send(f"✅ زمان تنظیم شد: {format_time(seconds)}")
            except:
                pass
            return
        
        elif current_state == "warn_delete_time":
            times = [5, 10, 15, 20, 30, 60]
            try:
                idx = int(cmd) - 1
                if 0 <= idx < len(times):
                    settings["warning_delete_time"] = times[idx]
                    save_settings(chat_id, settings)
                    db.set_menu_state(chat_id, sender_id, "warning")
                    send(f"✅ زمان حذف پیام: {times[idx]} ثانیه")
            except:
                pass
            return
    
    # ==========================================
    #           GENERAL COMMANDS
    # ==========================================
    if cmd in ["وضعیت", "status", "اشتراک"]:
        status = sub_manager.get_status(chat_id)
        if status["active"]:
            send(f"📊 وضعیت اشتراک\n━━━━━━━━━━━━━━━━━\n✅ فعال\n🔹 کد: {status['code']}\n🔹 انقضا: {status['expire_date']}\n🔹 باقیمانده: {status['days_left']} روز و {status['hours_left']} ساعت")
        else:
            send("❌ اشتراک فعال نیست. کد را ارسال کنید.")
        return
    
    if cmd in ["آیدی", "آیدی من", "id"]:
        role_fa = {"super_admin": "👑 سوپر ادمین", "owner": "👑 مالک", "admin": "🛡️ ادمین", "vip": "💎 ویژه", "user": "👤 کاربر"}
        send(f"🆔 اطلاعات شما\n━━━━━━━━━━━━━━━━━\n🔹 ID: {sender_id}\n🔹 نقش: {role_fa.get(role, '?')}\n🔹 گروه: {chat_id}")
        return
    
    if cmd in ["راهنما", "help", "کمک"]:
        if is_group:
            if is_super_admin_user:
                send("👑 شما سوپر ادمین سیستم هستید.\nتمام دستورات مالک + قابلیت‌های ویژه")
            elif is_owner_user:
                send(HELP_OWNER)
            elif is_admin_user:
                send(HELP_ADMIN)
            else:
                send(HELP_USER)
        else:
            send(HELP_USER)
        return
    
    if cmd in ["قوانین", "rules"]:
        send(f"📜 قوانین گروه\n━━━━━━━━━━━━━━━━━\n\n{settings.get('rules', 'تنظیم نشده')}")
        return
    
    if cmd in ["آمار من", "آمار کاربر"]:
        r = db.get_one("SELECT message_count FROM group_stats WHERE chat_id = ? AND user_id = ?",
                      (str(chat_id), str(sender_id)))
        count = r[0] if r else 0
        send(f"📊 آمار شما\n━━━━━━━━━━━━━━━━━\n🔹 تعداد پیام: {count}")
        return
    
    if cmd in ["اخطارهای من", "اخطار ها"]:
        r = db.get_one("SELECT count FROM warnings WHERE chat_id = ? AND user_id = ?", (str(chat_id), str(sender_id)))
        count = r[0] if r else 0
        send(f"⚠️ اخطارهای شما\n━━━━━━━━━━━━━━━━━\n🔹 تعداد: {count}")
        return
    
    # 🎯 ایگنور برای همه کاربران
    user_perms = settings.get(f"{role}_permissions", {}) if role != "user" else settings.get("user_permissions", {})
    can_ignore = is_admin_user or user_perms.get("ignore_users", False)
    
    if cmd in ["ایگنور", "ignore"] and can_ignore:
        if final_target:
            if final_target == sender_id:
                send("❌ نمی‌توانید خودتان را ایگنور کنید!")
            else:
                db.execute("INSERT OR IGNORE INTO ignores (chat_id, ignorer_id, ignored_id, created_at) VALUES (?, ?, ?, ?)",
                          (str(chat_id), str(sender_id), str(final_target), datetime.now().strftime("%Y-%m-%d %H:%M:%S")))
                send_with_user("✅ کاربر {name} ایگنور شد", final_target)
                log_action(chat_id, "IGNORE", sender_id, final_target)
        else:
            send("❌ ایگنور + ریپلای/@/ID")
        return
    
    if cmd in ["لغو ایگنور", "حذف ایگنور", "unignore"] and can_ignore:
        if final_target:
            db.execute("DELETE FROM ignores WHERE chat_id = ? AND ignorer_id = ? AND ignored_id = ?",
                      (str(chat_id), str(sender_id), str(final_target)))
            send("✅ ایگنور لغو شد")
            log_action(chat_id, "UNIGNORE", sender_id, final_target)
        else:
            send("❌ لغو ایگنور + ریپلای/@/ID")
        return
    
    if cmd in ["لیست ایگنور", "لیست بلاک"] and can_ignore:
        ignores = db.execute("SELECT ignored_id, created_at FROM ignores WHERE chat_id = ? AND ignorer_id = ?",
                            (str(chat_id), str(sender_id)))
        if ignores:
            txt = f"🚫 کاربران ایگنور شده شما\n━━━━━━━━━━━━━━━━━\n\n"
            for i, ig in enumerate(ignores, 1):
                name = get_user_display_name(ig[0])
                txt += f"{i}. {name}\n   └ {ig[1]}\n"
            send(txt)
        else:
            send("📭 کاربری را ایگنور نکرده‌اید")
        return
    
    # ==========================================
    #            OWNER COMMANDS - با mention
    # ==========================================
    if is_owner_user:
        if cmd in ["تنظیمات", "settings", "پنل"]:
            db.set_menu_state(chat_id, sender_id, "main")
            send(main_menu_text())
            return
        
        if cmd in ["افزودن ادمین", "ادمین کن", "ترفیع"]:
            if final_target:
                if is_owner(chat_id, final_target) or is_super_admin(final_target):
                    send("❌ مالک/سوپر ادمین از قبل ادمین است")
                elif is_admin(chat_id, final_target):
                    send("⚠️ این کاربر از قبل ادمین است")
                else:
                    db.execute("INSERT OR REPLACE INTO admins (chat_id, user_id, role, added_by, added_at) VALUES (?, ?, 'admin', ?, ?)",
                              (str(chat_id), str(final_target), str(sender_id), datetime.now().strftime("%Y-%m-%d %H:%M:%S")))
                    send_with_user("✅ کاربر {name} ادمین شد", final_target)
                    log_action(chat_id, "ADD_ADMIN", sender_id, final_target)
            else:
                send("❌ روش‌های افزودن ادمین:\n\n1️⃣ ریپلای + افزودن ادمین\n2️⃣ افزودن ادمین @username\n3️⃣ افزودن ادمین user_id")
            return
        
        if cmd in ["حذف ادمین", "برکناری", "عزل"]:
            if final_target:
                if is_owner(chat_id, final_target) or is_super_admin(final_target):
                    send("❌ نمی‌توانید مالک/سوپر ادمین را برکنار کنید")
                else:
                    db.execute("DELETE FROM admins WHERE chat_id = ? AND user_id = ?", (str(chat_id), str(final_target)))
                    send_with_user("✅ کاربر {name} برکنار شد", final_target)
                    log_action(chat_id, "REMOVE_ADMIN", sender_id, final_target)
            else:
                send("❌ حذف ادمین + ریپلای/@/ID")
            return
        
        if cmd in ["لیست ادمین", "لیست ادمین‌ها", "ادمین ها"]:
            admins = db.execute("SELECT user_id, added_at FROM admins WHERE chat_id = ?", (str(chat_id),))
            if admins:
                txt = "👥 لیست ادمین‌ها\n━━━━━━━━━━━━━━━━━\n\n"
                for i, a in enumerate(admins, 1):
                    name = get_user_display_name(a[0])
                    txt += f"{i}. {name}\n   └ {a[1]}\n"
                send(txt)
            else:
                send("📭 ادمینی وجود ندارد")
            return
        
        if cmd in ["ویژه", "افزودن ویژه", "add vip"]:
            if final_target:
                db.execute("INSERT OR REPLACE INTO vips (chat_id, user_id, added_by, added_at) VALUES (?, ?, ?, ?)",
                          (str(chat_id), str(final_target), str(sender_id), datetime.now().strftime("%Y-%m-%d %H:%M:%S")))
                send_with_user("💎 کاربر {name} ویژه شد", final_target)
                log_action(chat_id, "ADD_VIP", sender_id, final_target)
            else:
                send("❌ ویژه + ریپلای/@/ID")
            return
        
        if cmd in ["حذف ویژه", "لغو ویژه"]:
            if final_target:
                db.execute("DELETE FROM vips WHERE chat_id = ? AND user_id = ?", (str(chat_id), str(final_target)))
                send_with_user("✅ کاربر {name} از ویژه خارج شد", final_target)
                log_action(chat_id, "REMOVE_VIP", sender_id, final_target)
            else:
                send("❌ حذف ویژه + ریپلای/@/ID")
            return
        
        if cmd in ["لیست ویژه", "لیست ویژه‌ها"]:
            vips = db.execute("SELECT user_id, added_at FROM vips WHERE chat_id = ?", (str(chat_id),))
            if vips:
                txt = "💎 لیست کاربران ویژه\n━━━━━━━━━━━━━━━━━\n\n"
                for i, v in enumerate(vips, 1):
                    name = get_user_display_name(v[0])
                    txt += f"{i}. {name}\n   └ {v[1]}\n"
                send(txt)
            else:
                send("📭 کاربر ویژه‌ای وجود ندارد")
            return
        
        if original.startswith("افزودن لیست سیاه ") or original.startswith("کلمه ممنوع "):
            word = original.replace("افزودن لیست سیاه ", "").replace("کلمه ممنوع ", "").strip()
            if word:
                db.execute("INSERT INTO blacklist_words (chat_id, word, added_by, added_at) VALUES (?, ?, ?, ?)",
                          (str(chat_id), word.lower(), str(sender_id), datetime.now().strftime("%Y-%m-%d %H:%M:%S")))
                send(f"🚫 کلمه '{word}' به لیست سیاه اضافه شد")
            return
        
        if original.startswith("حذف لیست سیاه "):
            word = original.replace("حذف لیست سیاه ", "").strip()
            db.execute("DELETE FROM blacklist_words WHERE chat_id = ? AND word = ?", (str(chat_id), word.lower()))
            send(f"✅ کلمه '{word}' حذف شد")
            return
        
        if cmd in ["لیست سیاه", "کلمات ممنوعه"]:
            words = db.execute("SELECT word FROM blacklist_words WHERE chat_id = ?", (str(chat_id),))
            if words:
                txt = "🚫 کلمات ممنوعه\n━━━━━━━━━━━━━━━━━\n\n"
                for i, w in enumerate(words, 1):
                    txt += f"{i}. {w[0]}\n"
                send(txt)
            else:
                send("✅ لیست سیاه خالی است")
            return
        
        if original.startswith("تنظیم خوش‌آمد "):
            settings["welcome_message"] = original.replace("تنظیم خوش‌آمد ", "").strip()
            save_settings(chat_id, settings)
            send(f"✅ پیام خوش‌آمد تغییر کرد:\n\n{settings['welcome_message']}")
            return
        
        if original.startswith("تنظیم خداحافظ "):
            settings["goodbye_message"] = original.replace("تنظیم خداحافظ ", "").strip()
            save_settings(chat_id, settings)
            send(f"✅ پیام خداحافظ تغییر کرد:\n\n{settings['goodbye_message']}")
            return
        
        if original.startswith("تنظیم قوانین "):
            settings["rules"] = original.replace("تنظیم قوانین ", "").strip()
            save_settings(chat_id, settings)
            send(f"✅ قوانین تغییر کرد:\n\n{settings['rules']}")
            return
        
        if cmd in ["قفل گروه", "قفل"]:
            settings["group_lock"] = True
            save_settings(chat_id, settings)
            send("🔒 گروه قفل شد. فقط ادمین‌ها می‌توانند پیام ارسال کنند.")
            log_action(chat_id, "LOCK_GROUP", sender_id)
            return
        
        if cmd in ["باز کردن گروه", "باز"]:
            settings["group_lock"] = False
            save_settings(chat_id, settings)
            send("🔓 گروه باز شد.")
            log_action(chat_id, "UNLOCK_GROUP", sender_id)
            return
        
        if cmd in ["پشتیبان", "backup"]:
            data = {
                "settings": settings,
                "admins": [r[0] for r in db.execute("SELECT user_id FROM admins WHERE chat_id = ?", (str(chat_id),))],
                "vips": [r[0] for r in db.execute("SELECT user_id FROM vips WHERE chat_id = ?", (str(chat_id),))],
                "blacklist": [r[0] for r in db.execute("SELECT word FROM blacklist_words WHERE chat_id = ?", (str(chat_id),))],
                "exported_at": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
            }
            send(f"📦 پشتیبان گروه\n━━━━━━━━━━━━━━━━━\n\n```{json.dumps(data, ensure_ascii=False, indent=2)[:3500]}```")
            return
        
        if cmd in ["آمار کامل", "آمار گروه"]:
            total = db.get_one("SELECT total_messages FROM groups_table WHERE chat_id = ?", (str(chat_id),))
            admins_count = len(db.execute("SELECT id FROM admins WHERE chat_id = ?", (str(chat_id),)))
            vips_count = len(db.execute("SELECT id FROM vips WHERE chat_id = ?", (str(chat_id),)))
            warns_count = len(db.execute("SELECT id FROM warnings WHERE chat_id = ?", (str(chat_id),)))
            mutes_count = len(db.execute("SELECT id FROM mutes WHERE chat_id = ? AND expire_time > ?", (str(chat_id), int(time.time()))))
            send(f"📊 آمار کامل گروه\n━━━━━━━━━━━━━━━━━\n\n🔹 کل پیام‌ها: {total[0] if total else 0}\n🔹 ادمین‌ها: {admins_count}\n🔹 ویژه‌ها: {vips_count}\n🔹 کاربران اخطاردار: {warns_count}\n🔹 کاربران میوت: {mutes_count}")
            return
        
        if cmd in ["لاگ‌ها", "لاگ"]:
            logs = db.execute("SELECT action_type, action_by, target_id, timestamp FROM action_logs WHERE chat_id = ? ORDER BY timestamp DESC LIMIT 15", (str(chat_id),))
            if logs:
                txt = "📜 آخرین اکشن‌ها\n━━━━━━━━━━━━━━━━━\n\n"
                for l in logs:
                    txt += f"🔹 {l[0]} | توسط: {l[1][:15]}... | {l[3]}\n"
                send(txt)
            else:
                send("📭 لاگی وجود ندارد")
            return
    
    # ==========================================
    #          🎯 SUPER ADMIN ONLY: همگانی
    # ==========================================
    if is_super_admin_user and original.startswith("همگانی "):
        msg_text = original.replace("همگانی ", "").strip()
        if msg_text:
            groups = db.execute("SELECT chat_id, title FROM groups_table WHERE subscription_code != '' AND expire_date > ?",
                               (datetime.now().strftime("%Y-%m-%d %H:%M:%S"),))
            sent = 0
            failed = 0
            for g in groups:
                try:
                    client.send_message(g[0], f"📢 پیام همگانی از سازنده ربات\n━━━━━━━━━━━━━━━━━\n\n{msg_text}")
                    sent += 1
                except:
                    failed += 1
            send(f"✅ پیام به {sent} گروه ارسال شد\n❌ خطا در {failed} گروه")
            logger.info(f"📢 همگانی ارسال شد: {sent} موفق, {failed} ناموفق")
        return
    
    # ==========================================
    #            ADMIN COMMANDS - با mention
    # ==========================================
    if is_admin_user:
        admin_perms = settings.get("admin_permissions", {})
        
        if cmd in ["بن", "اخراج", "ban"]:
            if is_owner_user or admin_perms.get("ban"):
                if final_target:
                    if is_owner(chat_id, final_target) or is_super_admin(final_target):
                        send("❌ نمی‌توانید مالک/سوپر ادمین را اخراج کنید")
                    else:
                        ban_user(chat_id, final_target)
                        send_with_user("🔨 کاربر {name} اخراج شد", final_target)
                        log_action(chat_id, "BAN", sender_id, final_target)
                else:
                    send("❌ بن + ریپلای/@/ID")
            else:
                send("❌ شما دسترسی بن را ندارید")
            return
        
        if cmd in ["حذف بن", "رفع بن", "unban"]:
            if is_owner_user or admin_perms.get("unban"):
                if final_target:
                    unban_user(chat_id, final_target)
                    send_with_user("✅ کاربر {name} رفع بن شد", final_target)
                    log_action(chat_id, "UNBAN", sender_id, final_target)
                else:
                    send("❌ حذف بن + ریپلای/@/ID")
            return
        
        if cmd in ["میوت", "صامت", "mute"]:
            if is_owner_user or admin_perms.get("mute"):
                if final_target:
                    mute_user(chat_id, final_target, 31536000, "Permanent", sender_id)
                    send_with_user("🔇 کاربر {name} میوت دائم شد", final_target)
                    log_action(chat_id, "MUTE", sender_id, final_target, "Permanent")
                else:
                    send("❌ میوت + ریپلای/@/ID")
            return
        
        if original.lower().startswith("میوت "):
            if is_owner_user or admin_perms.get("mute"):
                if final_target:
                    t = re.sub(r'(?i)^میوت\s+', '', original).strip()
                    t = re.sub(r'@[a-zA-Z0-9_]+', '', t).strip()
                    t = re.sub(r'u[a-f0-9]{32}', '', t).strip()
                    seconds = parse_time(t) if t else 31536000
                    if seconds and seconds > 0:
                        mute_user(chat_id, final_target, seconds, "Temp", sender_id)
                        send_with_user(f"🔇 کاربر {{name}} برای {format_time(seconds)} میوت شد", final_target)
                        log_action(chat_id, "MUTE_TEMP", sender_id, final_target, format_time(seconds))
                else:
                    send("❌ میوت @user 30 دقیقه")
            return
        
        if cmd in ["حذف میوت", "رفع میوت", "unmute"]:
            if is_owner_user or admin_perms.get("unmute"):
                if final_target:
                    unmute_user(chat_id, final_target)
                    send_with_user("🔊 کاربر {name} رفع میوت شد", final_target)
                    log_action(chat_id, "UNMUTE", sender_id, final_target)
                else:
                    send("❌ حذف میوت + ریپلای/@/ID")
            return
        
        if cmd in ["لیست میوت", "لیست میوت‌ها"]:
            mutes = db.execute("SELECT user_id, expire_time, reason FROM mutes WHERE chat_id = ? AND expire_time > ?",
                              (str(chat_id), int(time.time())))
            if mutes:
                txt = "🔇 لیست کاربران میوت\n━━━━━━━━━━━━━━━━━\n\n"
                for i, m in enumerate(mutes, 1):
                    remaining = int(m[1] - time.time())
                    name = get_user_display_name(m[0])
                    txt += f"{i}. {name}\n   └ باقیمانده: {format_time(remaining)} | {m[2]}\n"
                send(txt)
            else:
                send("✅ کاربری میوت نیست")
            return
        
        if cmd in ["اخطار", "warn", "هشدار"]:
            if is_owner_user or admin_perms.get("warn"):
                if final_target:
                    if settings.get("warning_enabled"):
                        count = add_warning(chat_id, final_target)
                        limit = settings.get("warning_limit", 3)
                        send_with_user(f"⚠️ اخطار {{count}}/{limit}\n👤 {{name}}", final_target)
                        # جایگزینی {count} با عدد واقعی
                        log_action(chat_id, "WARN", sender_id, final_target, f"{count}/{limit}")
                        if count >= limit:
                            action = settings.get("warning_action", "mute")
                            atime = settings.get("warning_action_time", 3600)
                            if action == "ban":
                                ban_user(chat_id, final_target)
                                send_with_user("🔨 کاربر {name} به حد اخطار رسید و اخراج شد", final_target)
                            elif action == "mute":
                                mute_user(chat_id, final_target, 31536000)
                                send_with_user("🔇 کاربر {name} میوت دائم شد", final_target)
                            elif action == "mute_temp":
                                mute_user(chat_id, final_target, atime)
                                send_with_user(f"🔇 کاربر {{name}} برای {format_time(atime)} میوت شد", final_target)
                            reset_warnings(chat_id, final_target)
                    else:
                        send("❌ سیستم اخطار غیرفعال است")
                else:
                    send("❌ اخطار + ریپلای/@/ID")
            return
        
        if cmd in ["حذف اخطار", "پاک کردن اخطار"]:
            if is_owner_user or admin_perms.get("warn"):
                if final_target:
                    reset_warnings(chat_id, final_target)
                    send_with_user("✅ اخطارهای کاربر {name} پاک شد", final_target)
                    log_action(chat_id, "RESET_WARNINGS", sender_id, final_target)
                else:
                    send("❌ حذف اخطار + ریپلای/@/ID")
            return
        
        if original.startswith("پاکسازی ") or original.startswith("clean "):
            if is_owner_user or admin_perms.get("clean_messages"):
                try:
                    parts = original.split()
                    count = int(parts[1]) if len(parts) > 1 else 10
                    count = min(count, 100)
                    send(f"🧹 درخواست پاکسازی {count} پیام ثبت شد")
                except:
                    send("❌ فرمت نادرست. مثال: پاکسازی 10")
            return


# ============================================================
#            MAIN MESSAGE PROCESSOR
# ============================================================
def process_message(upd):
    try:
        update_type = upd.get("type", "")
        
        msg = upd.get("new_message")
        if not msg or not isinstance(msg, dict):
            return
        
        chat_id = upd.get("chat_id")
        message_id = msg.get("message_id")
        sender_id = msg.get("sender_id")
        sender_type = msg.get("sender_type", "User")
        text = msg.get("text", "")
        
        # هندل کلیک دکمه
        aux_data = msg.get("aux_data")
        if aux_data and isinstance(aux_data, dict):
            button_id = aux_data.get("button_id")
            if button_id:
                logger.info(f"🔘 کلیک دکمه: {button_id}")
                return
        
        try:
            msg_time = int(msg.get("time", 0))
        except:
            msg_time = 0
        
        if sender_type == "Bot" or not sender_id or not chat_id:
            return
        
        # 🎯 جلوگیری از پردازش پیام‌های خود بات
        if client.is_bot(sender_id):
            return
        
        # ذخیره سریع در cache
        db.save_message(message_id, sender_id, chat_id)
        
        if msg_time > 0 and msg_time < STARTUP_TIME - 10:
            return
        
        existing = db.get_one("SELECT message_id FROM processed_messages WHERE message_id = ?", (str(message_id),))
        if existing:
            return
        db.execute("INSERT OR IGNORE INTO processed_messages (message_id, processed_at) VALUES (?, ?)",
                  (str(message_id), int(time.time())))
        
        logger.info(f"💬 [{chat_id[:10]}] {sender_id[:10]}: {text[:40] if text else '[بدون متن]'}")
        
        # ذخیره پیام در لاگ
        sender_name = msg.get("sender_name", "") or sender_id
        try:
            db.save_message_log(chat_id, message_id, sender_id, sender_name, text or "[مدیا]", msg_time)
        except Exception as e:
            logger.debug(f"خطا در ذخیره لاگ: {e}")
        
        reply_sender_id = get_reply_sender(chat_id, msg)
        
        # به‌روزرسانی پروفایل
        if sender_name and sender_name != sender_id:
            name_parts = sender_name.split()
            first_name = name_parts[0] if name_parts else ""
            last_name = " ".join(name_parts[1:]) if len(name_parts) > 1 else ""
            # 🎯 ذخیره username اگر در متن بود
            username_match = re.search(r'@([a-zA-Z0-9_]{3,})', str(sender_name))
            username = username_match.group(1) if username_match else None
            
            db.execute("""INSERT OR REPLACE INTO user_profiles 
                         (user_id, first_name, last_name, username, last_seen, account_created) 
                         VALUES (?, ?, ?, ?, ?, COALESCE(
                            (SELECT account_created FROM user_profiles WHERE user_id = ?), ?
                         ))""",
                      (str(sender_id), first_name, last_name, username,
                       datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
                       str(sender_id), int(time.time())))
        else:
            db.execute("INSERT OR REPLACE INTO user_profiles (user_id, last_seen, account_created) VALUES (?, ?, COALESCE((SELECT account_created FROM user_profiles WHERE user_id = ?), ?))",
                      (str(sender_id), datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
                       str(sender_id), int(time.time())))
        
        # به‌روزرسانی آمار
        db.execute("UPDATE groups_table SET total_messages = total_messages + 1, last_activity = ? WHERE chat_id = ?",
                  (datetime.now().strftime("%Y-%m-%d %H:%M:%S"), str(chat_id)))
        db.execute("""INSERT INTO group_stats (chat_id, user_id, message_count, last_message)
                     VALUES (?, ?, 1, ?)
                     ON CONFLICT(chat_id, user_id) DO UPDATE SET
                     message_count = message_count + 1, last_message = ?""",
                  (str(chat_id), str(sender_id),
                   datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
                   datetime.now().strftime("%Y-%m-%d %H:%M:%S")))
        
        group_res = db.get_one("SELECT owner_id FROM groups_table WHERE chat_id = ?", (str(chat_id),))
        is_installed = bool(group_res)
        
        if text and text.strip() == "نصب بات":
            if not is_installed:
                group_info = client.get_chat(chat_id)
                title = ""
                if group_info and isinstance(group_info, dict):
                    title = group_info.get("title", "") or group_info.get("group", {}).get("title", "")
                db.execute(
                    "INSERT OR REPLACE INTO groups_table (chat_id, owner_id, created_at, settings, title) VALUES (?, ?, ?, ?, ?)",
                    (str(chat_id), str(sender_id), datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
                     json.dumps(get_default_settings(), ensure_ascii=False), title))
                client.send_message(
                    chat_id,
                    f"✅ {BOT_NAME} نصب شد!\n━━━━━━━━━━━━━━━━━\n👑 مالک: {sender_id}\n\n📝 کد اشتراک را ارسال کنید:\n💎 فرمت: XXXX-XXXX-XXXX-XXXX")
                log_action(chat_id, "INSTALL", sender_id)
                logger.info(f"✅ ربات نصب شد")
            else:
                sub_status = sub_manager.get_status(chat_id)
                if sub_status["active"]:
                    client.send_message(chat_id, f"ℹ️ ربات فعال است. انقضا: {sub_status['expire_date']}")
                else:
                    client.send_message(chat_id, "⚠️ اشتراک فعال نیست. کد را ارسال کنید.")
            return
        
        if not is_installed:
            return
        
        sub_status = sub_manager.get_status(chat_id)
        if not sub_status["active"]:
            if text:
                code_match = re.match(r"^[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}$", text.strip().upper())
                if code_match:
                    status, message = sub_manager.activate(text.strip().upper(), chat_id, sender_id)
                    client.send_message(chat_id, message)
                else:
                    client.send_message(chat_id, "⏰ اشتراک فعال نیست!\n📝 کد اشتراک را ارسال کنید.\n💎 فرمت: XXXX-XXXX-XXXX-XXXX")
            return
        
        settings = get_settings(chat_id)
        role = get_role(chat_id, sender_id)
        is_admin_user = (role in ["admin", "owner", "super_admin"])
        
        # قفل گروه
        if settings.get("group_lock") and not is_admin_user:
            client.delete_message(chat_id, message_id)
            return
        
        # ایگنور
        if reply_sender_id and check_ignore(chat_id, sender_id, reply_sender_id):
            client.delete_message(chat_id, message_id)
            return
        
        # میوت
        if is_muted(chat_id, sender_id) and not is_admin_user:
            client.delete_message(chat_id, message_id)
            return
        
        # 🎯🎯🎯 فیلترهای جدید - قبل از فیلترهای قبلی
        
        if not is_admin_user:
            # 🆕 بررسی اکانت جدید
            if Filter.is_new_account(sender_id, settings):
                client.delete_message(chat_id, message_id)
                min_days = settings.get("new_account_days", 7)
                client.send_message(chat_id, f"🔐 پیام شما حذف شد\n📌 اکانت شما کمتر از {min_days} روز سن دارد", reply_to_message_id=message_id)
                return
            
            # 🆕 بررسی حالت شب
            if Filter.is_in_night_mode(settings):
                has_media = (Filter.has_media(msg, "gif") or Filter.has_media(msg, "video") or
                           Filter.has_media(msg, "audio") or Filter.has_media(msg, "file") or
                           Filter.has_media(msg, "sticker"))
                if has_media:
                    client.delete_message(chat_id, message_id)
                    start_h = settings.get("night_mode_start", 23)
                    end_h = settings.get("night_mode_end", 7)
                    client.send_message(chat_id,
                        f"🌙 حالت شب فعال است\n📌 ارسال مدیا از {start_h}:00 تا {end_h}:00 ممنوع است",
                        reply_to_message_id=message_id)
                    return
            
            # 🆕 حداکثر پیام در دقیقه
            max_per_min = settings.get("max_messages_per_minute", 0)
            if max_per_min > 0:
                now = int(time.time())
                db.execute("INSERT INTO spam_logs (chat_id, user_id, timestamp) VALUES (?, ?, ?)",
                          (str(chat_id), str(sender_id), now))
                r = db.get_one("SELECT COUNT(*) FROM spam_logs WHERE chat_id = ? AND user_id = ? AND timestamp > ?",
                              (str(chat_id), str(sender_id), now - 60))
                if r and r[0] > max_per_min:
                    client.delete_message(chat_id, message_id)
                    client.send_message(chat_id,
                        f"⚠️ شما بیش از حد مجاز پیام فرستادید\n📌 حداکثر: {max_per_min} پیام در دقیقه",
                        reply_to_message_id=message_id)
                    return
        
        # 🎯 فیلترهای اصلی
        violated = False
        violation_type = ""
        
        if not is_admin_user:
            perms = settings.get(f"{role}_permissions", {}) if role != "user" else settings.get("user_permissions", {})
            filters = settings.get("filters", {})
            
            # 🆕 تکرار کاراکتر
            if not violated and Filter.is_repeat_chars(text, settings):
                violated, violation_type = True, "تکرار کاراکتر (مثل سلااااام)"
            
            # 🆕 انگلیسی در فارسی
            if not violated and Filter.is_english_in_persian(text, settings):
                violated, violation_type = True, "متن انگلیسی در فارسی (اسپم)"
            
            # 🆕 فلود
            if not violated and Filter.is_flood(chat_id, sender_id, settings):
                # فلود اکشن خاص دارد
                client.delete_message(chat_id, message_id)
                action = settings.get("anti_flood_action", "mute_temp")
                atime = settings.get("anti_flood_action_time", 300)
                if action == "ban":
                    ban_user(chat_id, sender_id)
                    client.send_message(chat_id, f"🌊 کاربر به دلیل فلود اخراج شد")
                elif action == "mute":
                    mute_user(chat_id, sender_id, 31536000)
                    client.send_message(chat_id, f"🌊 کاربر به دلیل فلود میوت دائم شد")
                elif action == "mute_temp":
                    mute_user(chat_id, sender_id, atime)
                    client.send_message(chat_id, f"🌊 کاربر به دلیل فلود برای {format_time(atime)} میوت شد")
                log_action(chat_id, "ANTI_FLOOD", "SYSTEM", sender_id, f"Action: {action}")
                return
            
            # لینک
            if not violated and text and Filter.has_link(text, settings) and filters.get("filter_link"):
                if not perms.get("send_link", False):
                    violated, violation_type = True, "ارسال لینک"
            
            # فوروارد
            if not violated and Filter.is_forwarded(msg) and filters.get("filter_forward"):
                if not perms.get("forward", False):
                    violated, violation_type = True, "فوروارد"
            
            # تگ
            if not violated and text and re.findall(r"@[a-zA-Z0-9_]{5,}", text) and filters.get("filter_tag"):
                if not perms.get("tag", False):
                    violated, violation_type = True, "تگ"
            
            # گیف
            if not violated and Filter.has_media(msg, "gif") and filters.get("filter_gif"):
                if not perms.get("send_gif", True):
                    violated, violation_type = True, "ارسال گیف"
            
            # استیکر
            if not violated and Filter.has_media(msg, "sticker") and filters.get("filter_sticker"):
                if not perms.get("send_sticker", True):
                    violated, violation_type = True, "ارسال استیکر"
            
            # ویدیو
            if not violated and Filter.has_media(msg, "video") and filters.get("filter_video"):
                if not perms.get("send_video", True):
                    violated, violation_type = True, "ارسال ویدیو"
            
            # صدا
            if not violated and Filter.has_media(msg, "audio") and filters.get("filter_audio"):
                if not perms.get("send_audio", True):
                    violated, violation_type = True, "ارسال صدا"
            
            # فایل
            if not violated and Filter.has_media(msg, "file") and filters.get("filter_file"):
                if not perms.get("send_file", True):
                    violated, violation_type = True, "ارسال فایل"
            
            # Caps Lock
            if not violated and text and filters.get("filter_caps") and Filter.is_caps(text):
                if not perms.get("caps_lock", True):
                    violated, violation_type = True, "حروف بزرگ"
            
            # لیست سیاه
            if not violated and text and settings.get("blacklist_enabled"):
                word = Filter.has_blacklist(text, chat_id)
                if word:
                    violated, violation_type = True, f"کلمه ممنوعه: {word}"
        
        if violated:
            executor.submit(client.delete_message, chat_id, message_id)
            
            if settings.get("warning_enabled"):
                count = add_warning(chat_id, sender_id)
                limit = settings.get("warning_limit", 3)
                warn_delete = settings.get("warning_delete_time", 10)
                
                warn_msg = client.send_message(chat_id, f"⚠️ اخطار {count}/{limit}\n👤 {sender_id}\n📌 {violation_type} ممنوع است",
                                               reply_to_message_id=message_id)
                def del_warn():
                    time.sleep(warn_delete)
                    try:
                        if warn_msg and isinstance(warn_msg, dict):
                            wid = warn_msg.get("message_id")
                            if wid:
                                client.delete_message(chat_id, wid)
                    except: pass
                threading.Thread(target=del_warn, daemon=True).start()
                
                if count >= limit:
                    action = settings.get("warning_action", "mute")
                    atime = settings.get("warning_action_time", 3600)
                    if action == "ban":
                        ban_user(chat_id, sender_id)
                        client.send_message(chat_id, f"🔨 کاربر اخراج شد")
                    elif action == "mute":
                        mute_user(chat_id, sender_id, 31536000)
                        client.send_message(chat_id, f"🔇 کاربر میوت دائم شد")
                    elif action == "mute_temp":
                        mute_user(chat_id, sender_id, atime)
                        client.send_message(chat_id, f"🔇 کاربر برای {format_time(atime)} میوت شد")
                    reset_warnings(chat_id, sender_id)
            return
        
        # اسپم
        if settings.get("anti_spam_enabled") and not is_admin_user:
            if Filter.is_spam(chat_id, sender_id, settings):
                executor.submit(client.delete_message, chat_id, message_id)
                action = settings.get("anti_spam_action", "mute_temp")
                atime = settings.get("anti_spam_action_time", 600)
                if action == "ban":
                    ban_user(chat_id, sender_id)
                    client.send_message(chat_id, f"🛡️ کاربر به دلیل اسپم اخراج شد")
                elif action == "mute":
                    mute_user(chat_id, sender_id, 31536000)
                    client.send_message(chat_id, f"🛡️ کاربر میوت دائم شد")
                elif action == "mute_temp":
                    mute_user(chat_id, sender_id, atime)
                    client.send_message(chat_id, f"🛡️ کاربر برای {format_time(atime)} میوت شد")
                return
        
        if text:
            handle_commands(chat_id, sender_id, message_id, text, reply_sender_id, settings, role, msg)
    
    except Exception as e:
        logger.error(f"❌ خطا: {e}")
        logger.debug(traceback.format_exc())


# ============================================================
#            🚀 WORKER
# ============================================================
def worker():
    while True:
        try:
            upd = message_queue.get()
            if upd is None:
                break
            process_message(upd)
        except Exception as e:
            logger.error(f"❌ Worker Error: {e}")
        finally:
            message_queue.task_done()


def background():
    logger.info("⏰ تسک‌های پس‌زمینه شروع شد")
    while True:
        try:
            sub_manager.check_expirations()
            now = time.time()
            db.execute("DELETE FROM mutes WHERE expire_time < ?", (now,))
            db.execute("DELETE FROM spam_logs WHERE timestamp < ?", (now - 3600,))
            db.execute("DELETE FROM processed_messages WHERE processed_at < ?", (int(now - 7200),))
            db.cleanup_old_messages()
            db.execute("DELETE FROM menu_states WHERE updated_at < ?", (int(now - 3600),))
        except Exception as e:
            logger.error(f"❌ background: {e}")
        time.sleep(60)


# ============================================================
#              🌐 API SERVER
# ============================================================
api_app = Flask(__name__)

def verify_api(req):
    secret = req.headers.get('X-API-Secret') or req.args.get('secret') or req.form.get('secret')
    return secret == API_SECRET

@api_app.route('/api/verify', methods=['POST'])
def api_verify():
    if not verify_api(flask_request):
        return jsonify({"error": "Unauthorized"}), 401
    return jsonify({"status": "ok", "version": BOT_VERSION})

@api_app.route('/api/stats', methods=['GET'])
def api_stats():
    if not verify_api(flask_request):
        return jsonify({"error": "Unauthorized"}), 401
    
    total_groups = len(db.execute("SELECT chat_id FROM groups_table"))
    active_groups = len(db.execute("SELECT chat_id FROM groups_table WHERE expire_date > ?", 
                                  (datetime.now().strftime("%Y-%m-%d %H:%M:%S"),)))
    total_subs = len(db.execute("SELECT code FROM subscriptions"))
    active_subs = len(db.execute("SELECT code FROM subscriptions WHERE status = 'active'"))
    total_admins = len(db.execute("SELECT id FROM admins"))
    total_messages = db.get_one("SELECT SUM(total_messages) FROM groups_table")
    
    return jsonify({
        "total_groups": total_groups, "active_groups": active_groups,
        "total_subs": total_subs, "active_subs": active_subs,
        "total_admins": total_admins,
        "total_messages": total_messages[0] if total_messages and total_messages[0] else 0,
        "uptime": int(time.time() - STARTUP_TIME)
    })

@api_app.route('/api/groups', methods=['GET'])
def api_groups():
    if not verify_api(flask_request):
        return jsonify({"error": "Unauthorized"}), 401
    groups = db.execute("""
        SELECT chat_id, owner_id, subscription_code, created_at, expire_date, title, total_messages
        FROM groups_table ORDER BY created_at DESC
    """)
    result = [{"chat_id": g[0], "owner_id": g[1], "subscription_code": g[2],
              "created_at": g[3], "expire_date": g[4], "title": g[5], "total_messages": g[6]} for g in groups]
    return jsonify({"groups": result})

@api_app.route('/api/group/<chat_id>', methods=['GET'])
def api_group_detail(chat_id):
    if not verify_api(flask_request):
        return jsonify({"error": "Unauthorized"}), 401
    group = db.get_one("SELECT * FROM groups_table WHERE chat_id = ?", (chat_id,))
    if not group:
        return jsonify({"error": "Group not found"}), 404
    settings = get_settings(chat_id)
    admins = db.execute("SELECT user_id, added_at FROM admins WHERE chat_id = ?", (chat_id,))
    vips = db.execute("SELECT user_id, added_at FROM vips WHERE chat_id = ?", (chat_id,))
    return jsonify({
        "group": {"chat_id": group[0], "owner_id": group[1], "subscription_code": group[2],
                 "created_at": group[3], "expire_date": group[4], "title": group[6],
                 "total_messages": group[7], "settings": settings},
        "admins": [{"user_id": a[0], "added_at": a[1]} for a in admins],
        "vips": [{"user_id": v[0], "added_at": v[1]} for v in vips]
    })

@api_app.route('/api/messages/<chat_id>', methods=['GET'])
def api_messages(chat_id):
    if not verify_api(flask_request):
        return jsonify({"error": "Unauthorized"}), 401
    limit = int(flask_request.args.get('limit', 100))
    offset = int(flask_request.args.get('offset', 0))
    messages = db.get_message_logs(chat_id, limit, offset)
    result = [{"id": m[0], "chat_id": m[1], "message_id": m[2], "sender_id": m[3],
              "sender_name": m[4], "text": m[5], "time": m[6], "processed_at": m[7]} for m in messages]
    return jsonify({"messages": result, "count": len(result)})

@api_app.route('/api/send', methods=['POST'])
def api_send():
    if not verify_api(flask_request):
        return jsonify({"error": "Unauthorized"}), 401
    data = flask_request.json
    chat_id = data.get("chat_id")
    text = data.get("text")
    if not chat_id or not text:
        return jsonify({"error": "chat_id and text required"}), 400
    result = client.send_message(chat_id, text)
    if result:
        return jsonify({"success": True, "message_id": result.get("message_id")})
    return jsonify({"success": False, "error": "Send failed"}), 500

@api_app.route('/api/ban', methods=['POST'])
def api_ban():
    if not verify_api(flask_request):
        return jsonify({"error": "Unauthorized"}), 401
    data = flask_request.json
    chat_id = data.get("chat_id")
    user_id = data.get("user_id")
    if client.is_bot(user_id):
        return jsonify({"error": "Cannot ban the bot"}), 400
    if not chat_id or not user_id:
        return jsonify({"error": "chat_id and user_id required"}), 400
    ban_user(chat_id, user_id)
    return jsonify({"success": True})

@api_app.route('/api/unban', methods=['POST'])
def api_unban():
    if not verify_api(flask_request):
        return jsonify({"error": "Unauthorized"}), 401
    data = flask_request.json
    unban_user(data.get("chat_id"), data.get("user_id"))
    return jsonify({"success": True})

@api_app.route('/api/mute', methods=['POST'])
def api_mute():
    if not verify_api(flask_request):
        return jsonify({"error": "Unauthorized"}), 401
    data = flask_request.json
    user_id = data.get("user_id")
    if client.is_bot(user_id):
        return jsonify({"error": "Cannot mute the bot"}), 400
    mute_user(data.get("chat_id"), user_id, int(data.get("seconds", 31536000)), "From Panel", "PANEL")
    return jsonify({"success": True})

@api_app.route('/api/unmute', methods=['POST'])
def api_unmute():
    if not verify_api(flask_request):
        return jsonify({"error": "Unauthorized"}), 401
    data = flask_request.json
    unmute_user(data.get("chat_id"), data.get("user_id"))
    return jsonify({"success": True})

@api_app.route('/api/subscriptions', methods=['GET'])
def api_subscriptions():
    if not verify_api(flask_request):
        return jsonify({"error": "Unauthorized"}), 401
    subs = db.execute("""
        SELECT code, chat_id, created_at, expire_date, status, plan_name
        FROM subscriptions ORDER BY created_at DESC
    """)
    result = [{"code": s[0], "chat_id": s[1], "created_at": s[2], "expire_date": s[3],
              "status": s[4], "plan_name": s[5]} for s in subs]
    return jsonify({"subscriptions": result})

@api_app.route('/api/subscription/create', methods=['POST'])
def api_create_sub():
    if not verify_api(flask_request):
        return jsonify({"error": "Unauthorized"}), 401
    data = flask_request.json
    code, expire = sub_manager.create_subscription(
        int(data.get("days", 30)), int(data.get("hours", 0)),
        data.get("plan_name", "Default"), float(data.get("price", 0))
    )
    return jsonify({"success": True, "code": code, "expire_date": expire})

@api_app.route('/api/subscription/renew', methods=['POST'])
def api_renew_sub():
    if not verify_api(flask_request):
        return jsonify({"error": "Unauthorized"}), 401
    data = flask_request.json
    result = db.get_one("SELECT chat_id, expire_date FROM subscriptions WHERE code = ?", (data.get("code"),))
    if not result:
        return jsonify({"success": False}), 404
    chat_id, expire_date = result
    try:
        current_expire = datetime.strptime(expire_date, "%Y-%m-%d %H:%M:%S")
        if current_expire < datetime.now():
            current_expire = datetime.now()
        new_expire = current_expire + timedelta(days=int(data.get("days", 30)))
        new_expire_str = new_expire.strftime("%Y-%m-%d %H:%M:%S")
        db.execute("UPDATE subscriptions SET expire_date = ?, status = 'active' WHERE code = ?",
                  (new_expire_str, data.get("code")))
        db.execute("UPDATE groups_table SET expire_date = ? WHERE chat_id = ?", (new_expire_str, chat_id))
        return jsonify({"success": True})
    except:
        return jsonify({"success": False}), 500

@api_app.route('/api/delete_message', methods=['POST'])
def api_delete_message():
    if not verify_api(flask_request):
        return jsonify({"error": "Unauthorized"}), 401
    data = flask_request.json
    client.delete_message(data.get("chat_id"), data.get("message_id"))
    return jsonify({"success": True})

@api_app.route('/api/broadcast', methods=['POST'])
def api_broadcast():
    if not verify_api(flask_request):
        return jsonify({"error": "Unauthorized"}), 401
    data = flask_request.json
    requester_id = data.get("requester_id")
    text = data.get("text")
    if str(requester_id).strip().upper() != SUPER_ADMIN_ID.upper():
        return jsonify({"error": "Only super admin can broadcast"}), 403
    if not text:
        return jsonify({"error": "Text required"}), 400
    groups = db.execute("SELECT chat_id FROM groups_table WHERE subscription_code != '' AND expire_date > ?",
                       (datetime.now().strftime("%Y-%m-%d %H:%M:%S"),))
    sent = failed = 0
    for g in groups:
        try:
            client.send_message(g[0], f"📢 پیام همگانی\n━━━━━━━━━━━━━━━━━\n\n{text}")
            sent += 1
        except:
            failed += 1
    return jsonify({"success": True, "sent": sent, "failed": failed})

@api_app.route('/api/action_logs/<chat_id>', methods=['GET'])
def api_action_logs(chat_id):
    if not verify_api(flask_request):
        return jsonify({"error": "Unauthorized"}), 401
    limit = int(flask_request.args.get('limit', 50))
    logs = db.execute("""
        SELECT action_type, action_by, target_id, details, timestamp
        FROM action_logs WHERE chat_id = ? ORDER BY timestamp DESC LIMIT ?
    """, (chat_id, limit))
    result = [{"action_type": l[0], "action_by": l[1], "target_id": l[2],
              "details": l[3], "timestamp": l[4]} for l in logs]
    return jsonify({"logs": result})


def run_api_server():
    logger.info(f"🌐 API Server: http://0.0.0.0:{API_PORT}")
    api_app.run(port=API_PORT, host="0.0.0.0", debug=False, use_reloader=False, threaded=True)


# ============================================================
#              MAIN
# ============================================================
def main():
    banner = f"""
╔══════════════════════════════════════════════════════╗
║   🤖  {BOT_NAME:<44} ║
║   Version: {BOT_VERSION:<40} ║
║   🌐 API: http://localhost:{API_PORT:<21}              ║
║   ⚡ Workers: {MAX_WORKERS:<32}      ║
║   👑 Super Admin: {SUPER_ADMIN_ID:<28}     ║
╚══════════════════════════════════════════════════════╝"""
    print(banner)
    
    logger.info(f"⚡ راه‌اندازی {MAX_WORKERS} worker...")
    for i in range(MAX_WORKERS):
        t = threading.Thread(target=worker, daemon=True)
        t.start()
    
    threading.Thread(target=run_api_server, daemon=True).start()
    threading.Thread(target=background, daemon=True).start()
    
    me = client.get_me()
    if me:
        logger.info("✅ اتصال موفق")
        # 🎯 گرفتن bot_user_id
        client.get_bot_user_id()
    else:
        logger.error("❌ اتصال ناموفق!")
    
    saved_offset = db.get_last_offset()
    start_id = saved_offset if saved_offset else None
    logger.info("🔄 شروع حلقه اصلی...")
    
    errors = 0
    
    while True:
        try:
            response = client.get_updates(limit=50, offset_id=start_id)
            
            if response is None:
                errors += 1
                if errors > 30:
                    break
                time.sleep(3)
                continue
            
            errors = 0
            updates = response.get("updates", [])
            
            next_id = response.get("next_offset_id")
            if next_id:
                start_id = next_id
                db.save_last_offset(next_id)
            
            if not updates:
                time.sleep(UPDATE_INTERVAL)
                continue
            
            for upd in updates:
                if isinstance(upd, dict):
                    message_queue.put(upd)
            
            time.sleep(0.1)
            
        except KeyboardInterrupt:
            logger.info("🛑 توقف")
            break
        except Exception as e:
            errors += 1
            logger.error(f"❌ خطا: {e}")
            if errors > 30:
                break
            time.sleep(3)
    
    logger.info("👋 خداحافظ!")
    for _ in range(MAX_WORKERS):
        message_queue.put(None)
    executor.shutdown(wait=True)


if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        print("\n🛑 متوقف شد")
    except Exception as e:
        logger.critical(f"❌ بحرانی: {e}")
        print(traceback.format_exc())