import discord
from discord.ext import commands, tasks
import aiohttp
from datetime import datetime, timedelta, timezone
import re
import asyncio
import logging
import random
import json
from discord.ui import View, Button

# إعداد التسجيل
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s:%(levelname)s:%(name)s: %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S'
)
logger = logging.getLogger(__name__)

EMAIL_REGEX = re.compile(r"[^@]+@[^@]+\.[^@]+")

def extract_wordpress_user_ids(nickname: str) -> list:
    """
    استخراج جميع معرفات مستخدمي ووردبريس من لقب Discord.

    Args:
        nickname (str): لقب Discord الذي يحتوي على معرفات مستخدمي ووردبريس.

    Returns:
        list: قائمة بمعرفات مستخدمي ووردبريس المستخرجة.
    """
    pattern = re.compile(r'\[(\d+)\]')
    matches = pattern.findall(nickname)
    user_ids = []
    for match in matches:
        try:
            user_ids.append(int(match))
        except ValueError:
            logger.error(f"فشل تحويل المعرف المستخرج إلى عدد صحيح: {match}")
    if not user_ids:
        logger.warning(f"لم يتم العثور على معرفات مستخدمين في اللقب: {nickname}")
    return user_ids

class WordPressManager(commands.Cog):
    def __init__(self, bot):
        self.bot = bot
        # متغيرات التكوين
        self.wordpress_check_status_url = ""
        self.wordpress_activate_url = ""
        self.wordpress_remove_url = ""
        self.wordpress_active_users_url = ""
        self.verification_channel_id = 1277353183773200456  # استبدل بمعرف قناة التحقق الخاصة بك
        self.logging_channel_id = 1277697398092595220      # استبدل بمعرف قناة السجلات الخاصة بك
        self.pending_removals_channel_id = 1277697398092595220  # استبدل بمعرف قناة الإزالة المعلقة الخاصة بك
        self.guild_id = 530850272961101834  # استبدل بمعرف الخادم الخاص بك

        # متغيرات داخلية
        self.activated_users = self.load_activated_users()
        self.pending_removals = []
        self.discord_members = {}
        self.existing_nicknames = set()
        self.failed_nicknames = set()
        self.high_priority_queue = asyncio.Queue()
        self.low_priority_queue = asyncio.Queue()
        self.queue_message = None
        self.announcement_message = None
        self.pending_removals_message = None
        self.last_queue_update = datetime.now(timezone.utc)
        self.batch_size = 50

        # إنشاء جلسة aiohttp واحدة
        self.session = aiohttp.ClientSession()

        # متغيرات لتخزين معرفات مستخدمي ووردبريس النشطين
        self._active_wordpress_user_ids = set()
        self._active_user_ids_timestamp = datetime.utcnow() - timedelta(minutes=10)

    def load_activated_users(self):
        """تحميل قائمة المستخدمين المفعلين من ملف JSON."""
        try:
            with open('activated_users.json', 'r') as f:
                data = json.load(f)
                # تحويل المفاتيح إلى أعداد صحيحة إذا لزم الأمر
                return {int(k): v for k, v in data.items()}
        except (FileNotFoundError, json.JSONDecodeError):
            return {}

    def save_activated_users(self):
        """حفظ قائمة المستخدمين المفعلين إلى ملف JSON."""
        with open('activated_users.json', 'w') as f:
            json.dump(self.activated_users, f)

    @commands.Cog.listener()
    async def on_ready(self):
        # **الخطوة 1: جلب القنوات**
        self.channel = self.bot.get_channel(self.verification_channel_id)
        self.logging_channel = self.bot.get_channel(self.logging_channel_id)
        self.pending_removals_channel = self.bot.get_channel(self.pending_removals_channel_id)

        if not self.channel:
            logger.error(f"لم يتم العثور على قناة التحقق بالمعرف {self.verification_channel_id}.")
            return
        if not self.logging_channel:
            logger.error(f"لم يتم العثور على قناة السجلات بالمعرف {self.logging_channel_id}.")
            return
        if not self.pending_removals_channel:
            logger.error(f"لم يتم العثور على قناة الإزالة المعلقة بالمعرف {self.pending_removals_channel_id}.")
            return

        # **الخطوة 2: جلب جميع أعضاء الخادم**
        await self.fetch_all_server_members()

        # **الخطوة 3: التحقق من المستخدمين النشطين في ووردبريس ومقارنتهم مع أعضاء Discord**
        await self.compare_active_users_with_discord_members()

        # **الخطوة 4: تهيئة القناة والبدء في المهام**
        await self.initialize_channel()
        self.queue_processor.start()
        self.countdown_updater.start()
        self.nickname_validator.start()  # بدء مهمة التحقق من الألقاب
        await self.initialize_nickname_tracking()

    @commands.Cog.listener()
    async def on_member_join(self, member):
        """يتم استدعاؤه عندما ينضم عضو جديد إلى الخادم."""
        await self.send_welcome_message(member)

    async def send_welcome_message(self, member):
        """إرسال رسالة ترحيب مع تعليمات التحقق إلى العضو الجديد."""
        try:
            embed = discord.Embed(
                title="🎉 مرحبًا بك في سيرفر شبكة كونان العربية!",
                description=(
                    "نحن سعداء بانضمامك إلينا!\n\n"
                    "**للبدء، توثيق حسابك على موقع الشبكة.**\n"
                    "اضغط على الزر أدناه لبدء عملية التوثيق."
                ),
                color=discord.Color.blue()
            )
            embed.set_image(url="https://detectiveconanar.com/wp-content/uploads/2021/06/logox-main2020.png")  # استبدل بـ URL شعارك
            view = View(timeout=None)
            button = Button(label="بدء عملية التوثيق", style=discord.ButtonStyle.green, emoji="✅")
            button.callback = self.start_activation_direct
            view.add_item(button)
            await member.send(embed=embed, view=view)
        except discord.Forbidden:
            logger.warning(f"غير قادر على إرسال رسالة ترحيب إلى {member.display_name} ({member.id}). ربما قام العضو بتعطيل الرسائل الخاصة.")
        except Exception as e:
            logger.exception(f"خطأ أثناء إرسال رسالة ترحيب إلى {member.display_name} ({member.id}): {e}")

    async def start_activation_direct(self, interaction: discord.Interaction):
        """بدء عملية التحقق مباشرة من رسالة الترحيب."""
        try:
            if self.is_interaction_expired(interaction):
                await interaction.response.send_message(
                    "⏳ انتهت صلاحية هذا التفاعل. يرجى استخدام الزر أدناه لإعادة بدء عملية التوثيق.",
                    ephemeral=True,
                    view=self.create_retry_view()
                )
                return

            if interaction.user.id in self.activated_users:
                await interaction.response.send_message("⚠️ حسابك تم توثيقه بالفعل.", ephemeral=True)
                return

            modal = EmailVerificationForm(self)
            await interaction.response.send_modal(modal)
        except discord.InteractionResponded:
            # التفاعل تم الرد عليه مسبقًا أو منتهي الصلاحية
            pass
        except Exception as e:
            logger.exception(f"خطأ أثناء بدء التحقق المباشر: {e}")

    @commands.Cog.listener()
    async def on_member_remove(self, member):
        logger.info(f"on_member_remove: {member.display_name} ({member.id})")
        await self.handle_user_departure(member)

    @commands.Cog.listener()
    async def on_member_ban(self, guild, user):
        logger.info(f"on_member_ban: {user.name} ({user.id})")
        await self.handle_user_departure(user)

    async def handle_user_departure(self, user):
        """التعامل مع تنظيف البيانات عند حظر المستخدم أو طرده أو مغادرته الخادم."""
        logger.info(f"Processing user departure for {user.name} ({user.id})")
        if user.id in self.activated_users:
            user_data = self.activated_users[user.id]
            wordpress_user_ids = [user_data['user_id']]
            logger.info(f"تم العثور على معرفات مستخدمي ووردبريس للمستخدم {user.id}: {wordpress_user_ids}")
        else:
            logger.warning(f"المستخدم {user.id} غير موجود في activated_users.")
            # لا يمكن المتابعة بدون معرف مستخدم ووردبريس
            return

        await self.log_activation_update(user, "تمت ازالة صلاحية الوصول للموقع", "المستخدم غادر أو تم طرده أو حظره من السيرفر.")

        # التحقق من صحة المعرفات مقابل معرفات مستخدمي ووردبريس النشطين
        active_user_ids = await self.get_active_wordpress_user_ids()
        valid_user_ids = [uid for uid in wordpress_user_ids if uid in active_user_ids]

        if not valid_user_ids:
            logger.warning(f"لم يتم العثور على معرفات مستخدمي ووردبريس صالحة للمستخدم {user.name} ({user.id}).")
            return

        # إضافة المعرفات الصالحة إلى قائمة الإزالة المعلقة
        for user_id in valid_user_ids:
            if user_id not in self.pending_removals:
                self.pending_removals.append(user_id)
        await self.update_pending_removals_message()

        # تنظيف التتبع الداخلي
        if user.id in self.activated_users:
            del self.activated_users[user.id]
            self.save_activated_users()
            logger.info(f"تم تنظيف بيانات التفعيل للمستخدم {user.name} ({user.id}).")

    async def get_active_wordpress_user_ids(self):
        """جلب مجموعة معرفات مستخدمي ووردبريس النشطين، مع التخزين المؤقت لتقليل طلبات API."""
        if hasattr(self, '_active_wordpress_user_ids') and self._active_user_ids_timestamp > datetime.utcnow() - timedelta(minutes=5):
            return self._active_wordpress_user_ids

        active_users = await self.fetch_active_users_from_wordpress()
        self._active_wordpress_user_ids = {user['id'] for user in active_users}
        self._active_user_ids_timestamp = datetime.utcnow()
        return self._active_wordpress_user_ids

    async def update_pending_removals_message(self):
        """تحديث رسالة الإزالة المعلقة في القناة المخصصة."""
        if self.pending_removals_channel:
            message = f"عمليات الإزالة المعلقة: {len(self.pending_removals)} مستخدم(ين)."
            if self.pending_removals_message:
                try:
                    await self.pending_removals_message.edit(content=message)
                except discord.NotFound:
                    self.pending_removals_message = await self.pending_removals_channel.send(message)
            else:
                self.pending_removals_message = await self.pending_removals_channel.send(message)

    @commands.command(name='approve_removals')
    @commands.has_permissions(administrator=True)
    async def approve_removals(self, ctx):
        """أمر للمسؤولين للموافقة وإزالة جميع المستخدمين المعلقين من ووردبريس."""
        if not self.pending_removals:
            await ctx.send("لا يوجد مستخدمون قيد الإزالة.")
            return

        total_users = len(self.pending_removals)
        await ctx.send(f"الموافقة وإزالة {total_users} مستخدم(ين) من ووردبريس...")
        await self.remove_multiple_users(self.pending_removals)
        self.pending_removals.clear()
        await self.update_pending_removals_message()
        await ctx.send(f"تمت معالجة إزالة {total_users} مستخدم(ين) بنجاح.")

    async def remove_multiple_users(self, user_ids):
        """إزالة عدة مستخدمين من ووردبريس على دفعات مع تأخيرات."""
        batch_size = 10  # اضبط حسب الحاجة
        delay_between_batches = 2  # تأخير بالثواني بين الدفعات

        total_users = len(user_ids)
        batches = [user_ids[i:i + batch_size] for i in range(0, total_users, batch_size)]
        batch_number = 1

        for batch in batches:
            logger.info(f"معالجة الدفعة {batch_number}/{len(batches)}: إزالة المستخدمين {batch}")
            await self.remove_users_batch(batch)
            batch_number += 1
            if batch_number <= len(batches):
                logger.info(f"انتظار {delay_between_batches} ثوانٍ قبل الدفعة التالية...")
                await asyncio.sleep(delay_between_batches)

    async def remove_users_batch(self, user_ids_batch):
        """إزالة دفعة من المستخدمين من ووردبريس."""
        try:
            payload = {"user_ids": user_ids_batch}
            logger.info(f"محاولة إزالة المستخدمين بالبيانات: {payload}")

            async with self.session.post(self.wordpress_remove_url, json=payload) as response:
                response_text = await response.text()
                logger.info(f"حالة الاستجابة: {response.status}, نص الاستجابة: {response_text}")

                if response.status == 200:
                    response_json = await response.json()
                    for user_id, result in response_json.items():
                        status_msg = result.get('status', 'غير معروف')
                        success = result.get('success', False)
                        if success:
                            logger.info(f"تمت إزالة المستخدم {user_id} بنجاح: {status_msg}")
                        else:
                            logger.warning(f"فشل في إزالة المستخدم {user_id}: {status_msg}")
                    logger.info(f"تمت إزالة المستخدمين {user_ids_batch} من ووردبريس بنجاح.")
                else:
                    logger.error(f"فشل في إزالة المستخدمين {user_ids_batch} من ووردبريس: HTTP {response.status}, الاستجابة: {response_text}")
                    await self.log_activation_update(None, "فشل إزالة الدفعة", f"فشل في إزالة المستخدمين {user_ids_batch} من ووردبريس: HTTP {response.status}")
        except Exception as e:
            logger.exception(f"خطأ في إزالة المستخدمين {user_ids_batch} من ووردبريس.")
            await self.log_activation_update(None, "فشل إزالة الدفعة", f"خطأ في إزالة المستخدمين {user_ids_batch} من ووردبريس.")

    async def log_activation_update(self, user, status, message):
        """تسجيل تحديثات التفعيل في قناة السجلات المخصصة."""
        user_info = f"{user.display_name} ({user.id})" if user else "غير معروف"
        log_message = f"المستخدم: {user_info} | الحالة: {status} | التفاصيل: {message}"
        logger.info(log_message)

        if self.logging_channel:
            description = f"**الحالة:** {status}\n**التفاصيل:** {message}"
            if user:
                description = f"**المستخدم:** {user.display_name} ({user.id})\n" + description
            embed = discord.Embed(
                title="تحديث التفعيل",
                description=description,
                color=discord.Color.green() if status == "نجاح" else discord.Color.red()
            )
            await self.logging_channel.send(embed=embed)
        else:
            logger.error("لم يتم العثور على قناة السجلات. غير قادر على تسجيل تحديث التفعيل.")

    async def initialize_channel(self):
        """تهيئة القناة بضمان وجود الرسائل الأساسية."""
        # حذف رسائل الروبوت الخاصة به، مع تجنب حذف الرسائل الأقدم من 14 يومًا
        async for message in self.channel.history(limit=100):
            if message.author == self.bot.user:
                try:
                    await message.delete()
                except discord.errors.HTTPException:
                    logger.warning("لا يمكن حذف الرسائل الأقدم من 14 يومًا.")

        await self.ensure_announcement_message()
        await self.ensure_queue_message()

    async def ensure_announcement_message(self):
        """ضمان وجود رسالة الإعلان في القناة."""
        # التحقق من وجود رسالة الإعلان
        async for message in self.channel.history(limit=100):
            if message.author == self.bot.user and message.embeds and "تحقق من عضويتك في موقع الشبكة 🎯" in message.embeds[0].title:
                self.announcement_message = message
                break

        if not self.announcement_message:
            self.announcement_message = await self.channel.send(embed=self.create_announcement_embed(), view=self.create_announcement_view())
            await self.announcement_message.pin()

    def create_announcement_embed(self):
        """إنشاء رسالة الإعلان المضمنة."""
        embed = discord.Embed(
            title="**توثيق عضويتك على موقع الشبكة 🎯**",
            description=(
                "📋 **كيفية التوثيق:**\n"
                "1️⃣ **اضغط على الزر لبدء عملية التوثيق.**\n"
                "2️⃣ **أدخل البريد الإلكتروني الذي سجلت به.**"
            ),
            color=discord.Color.blue()
        )
        embed.set_footer(text="سيؤدي مغادرة سيرفر الديسكورد بعد التوثيق إلى إلغاء عضويتك.")
        return embed

    def create_announcement_view(self):
        """إنشاء العرض مع زر التحقق."""
        view = View(timeout=None)
        button = Button(label="بدء عملية التوثيق", style=discord.ButtonStyle.green, emoji="✅")
        button.callback = self.start_activation
        view.add_item(button)
        return view

    async def start_activation(self, interaction: discord.Interaction):
        """التعامل مع بدء التفعيل عند الضغط على زر الإعلان."""
        try:
            if self.is_interaction_expired(interaction):
                await interaction.response.send_message(
                    "⏳ انتهت صلاحية هذا الرسالة. يرجى استخدام الزر أدناه لإعادة بدء عملية التحقق.",
                    ephemeral=True,
                    view=self.create_retry_view()
                )
                return

            if interaction.user.id in self.activated_users:
                await interaction.response.send_message("⚠️ حسابك تم توثيقه بالفعل.", ephemeral=True)
                return

            modal = EmailVerificationForm(self)
            await interaction.response.send_modal(modal)
        except discord.InteractionResponded:
            # التفاعل تم الرد عليه مسبقًا أو منتهي الصلاحية
            pass
        except Exception as e:
            logger.exception(f"خطأ أثناء بدء التحقق: {e}")

    def create_retry_view(self):
        """إنشاء عرض يحتوي على زر لإعادة بدء عملية التحقق."""
        view = View(timeout=None)
        button = Button(label="إعادة بدء التحقق", style=discord.ButtonStyle.green, emoji="🔄")
        button.callback = self.start_activation_from_message
        view.add_item(button)
        return view

    async def start_activation_from_message(self, interaction: discord.Interaction):
        """بدء عملية التحقق من رسالة جديدة عند انتهاء صلاحية التفاعل السابق."""
        try:
            if interaction.user.id in self.activated_users:
                await interaction.response.send_message("⚠️ حسابك تم توثيقه بالفعل.", ephemeral=True)
                return

            modal = EmailVerificationForm(self)
            await interaction.response.send_modal(modal)
        except discord.InteractionResponded:
            pass
        except Exception as e:
            logger.exception(f"خطأ أثناء إعادة بدء التحقق: {e}")

    def is_interaction_expired(self, interaction: discord.Interaction) -> bool:
        """التحقق مما إذا كان التفاعل منتهي الصلاحية."""
        return interaction.is_expired()

    async def ensure_queue_message(self):
        """ضمان وجود رسالة الطابور في القناة."""
        # التحقق من وجود رسالة الطابور
        async for message in self.channel.history(limit=100):
            if message.author == self.bot.user and message.embeds and "🔄 قائمة الانتظار:" in message.embeds[0].title:
                self.queue_message = message
                break

        if not self.queue_message:
            self.queue_message = await self.send_queue_message()

    async def send_queue_message(self):
        """إرسال رسالة الطابور الأولية إلى القناة."""
        embed = discord.Embed(
            title="🔄 قائمة الانتظار:",
            description="لا توجد طلبات حاليًا.",
            color=discord.Color.orange()
        )
        message = await self.channel.send(embed=embed)
        return message

    async def fetch_all_server_members(self):
        """جلب جميع أعضاء الخادم وتحديد المستخدمين المفعلين بنمط اللقب."""
        guild = self.bot.get_guild(self.guild_id)
        if not guild:
            logger.error(f"لم يتم العثور على الخادم بالمعرف {self.guild_id}. قد لا يكون الروبوت متصلاً بالخادم.")
            return

        # ضمان تمكين النوايا
        if not self.bot.intents.members:
            logger.error("لم يتم تمكين نية الأعضاء. لا يمكن جلب الأعضاء.")
            return

        pattern = re.compile(r"^\s*([\u2605\u272F\u2B50]{1,2})?\s*(.+?)\s*(\[\d+\]){0,2}\s*$")
        members = guild.members

        processed_user_ids = set()

        for member in members:
            if member.nick:
                match = pattern.match(member.nick)
                if match:
                    user_id_matches = re.findall(r'\[(\d+)\]', member.nick)
                    for user_id_str in user_id_matches:
                        try:
                            user_id = int(user_id_str)
                            if user_id not in processed_user_ids:
                                self.discord_members[user_id] = member.nick
                                processed_user_ids.add(user_id)
                        except ValueError:
                            logger.error(f"معرف مستخدم غير صالح في اللقب: {member.nick}")

                    self.existing_nicknames.add(member.nick.lower())

        logger.info(f"تم اكتشاف {len(self.discord_members)} مستخدمًا مفعلًا.")

    async def fetch_active_users_from_wordpress(self):
        """جلب قائمة المستخدمين النشطين من واجهة برمجة تطبيقات ووردبريس."""
        try:
            async with self.session.get(self.wordpress_active_users_url) as response:
                if response.status == 200:
                    data = await response.json()
                    logger.info(f"تم جلب {len(data)} مستخدمًا نشطًا من ووردبريس.")
                    return data
                else:
                    logger.error(f"فشل في جلب المستخدمين النشطين: HTTP {response.status}")
                    return []
        except Exception as e:
            logger.exception("خطأ في جلب المستخدمين النشطين من ووردبريس.")
            return []

    async def compare_active_users_with_discord_members(self):
        """مقارنة المستخدمين النشطين في ووردبريس مع أعضاء Discord وجمع المفقودين للموافقة."""
        active_users = await self.fetch_active_users_from_wordpress()
        active_user_ids = {user['id'] for user in active_users}
        discord_user_ids = set(self.discord_members.keys())

        # العثور على مستخدمي ووردبريس الذين لم يعودوا في خادم Discord
        users_to_add_to_pending = active_user_ids - discord_user_ids

        if users_to_add_to_pending:
            logger.info(f"المستخدمون الذين سيتم إضافتهم إلى عمليات الإزالة المعلقة: {users_to_add_to_pending}")
            for user_id in users_to_add_to_pending:
                if user_id not in self.pending_removals:
                    self.pending_removals.append(user_id)
            await self.update_pending_removals_message()
        else:
            logger.info("لا يوجد مستخدمون بحاجة إلى إضافتهم إلى عمليات الإزالة المعلقة.")

    async def check_user_status(self, email):
        """التحقق مما إذا كان البريد الإلكتروني مفعلًا بالفعل بدور المساهم في ووردبريس."""
        try:
            params = {'email': email}
            async with self.session.get(self.wordpress_check_status_url, params=params) as response:
                if response.status == 200:
                    data = await response.json()
                    logger.info(f"الاستجابة JSON: {data}")

                    is_active = data.get('status') == 'active'
                    user_id = data.get('user_id')
                    message = data.get('message', "")
                    return is_active, user_id, message
                elif response.status == 404:
                    logger.info(f"لم يتم العثور على مستخدم بالبريد الإلكتروني {email} (404).")
                    return False, None, "البريد الإلكتروني غير مسجل في الموقع."
                else:
                    logger.error(f"فشل في جلب حالة المستخدم من ووردبريس: HTTP {response.status}")
                    return False, None, "حدث خطأ أثناء التحقق من حالة المستخدم."
        except aiohttp.ClientConnectionError as e:
            logger.exception(f"خطأ في الاتصال أثناء التحقق من حالة المستخدم على ووردبريس: {e}")
            return False, None, "حدث خطأ في الاتصال أثناء التحقق من حالة المستخدم. يرجى المحاولة مرة أخرى."
        except Exception as e:
            logger.exception("خطأ غير متوقع أثناء التحقق من حالة المستخدم على ووردبريس.")
            return False, None, "حدث خطأ غير متوقع أثناء التحقق من حالة المستخدم."

    async def process_activation_batch(self, batch):
        """معالجة دفعة من طلبات التفعيل بشكل غير متزامن."""
        user_emails = [email.strip().lower() for _, email in batch]
        try:
            async with self.session.post(self.wordpress_activate_url, json={"emails": user_emails}) as response:
                if response.status == 200:
                    try:
                        response_json = await response.json()
                        await self.handle_activation_responses(batch, response_json)
                    except aiohttp.ContentTypeError:
                        logger.error("استجابة JSON غير صالحة من ووردبريس أثناء التفعيل.")
                        await self.notify_failure_batch(batch, "فشل الوصول الى الموقع.")
                else:
                    await self.notify_failure_batch(batch, f"❌ فشل في التحقق من حسابك. رمز الحالة: {response.status}.")
        except aiohttp.ClientConnectionError as e:
            logger.exception(f"خطأ في الاتصال أثناء معالجة دفعة التفعيل: {e}")
            await self.notify_failure_batch(batch, "⚠️ حدث خطأ في الاتصال أثناء معالجة طلبك. يرجى المحاولة لاحقًا.")
        except Exception as e:
            logger.exception("خطأ غير متوقع أثناء معالجة دفعة التفعيل.")
            await self.notify_failure_batch(batch, "⚠️ حدث خطأ غير متوقع أثناء معالجة طلبك. يرجى المحاولة لاحقًا.")

        await self.update_queue_message()

    async def handle_activation_responses(self, batch, response_json):
        """التعامل مع استجابات التفعيل من ووردبريس."""
        for interaction, email in batch:
            user_data = response_json.get(email.strip().lower(), {})
            user_id = user_data.get('user_id')
            message = user_data.get('message', "حدث خطأ أثناء معالجة طلبك.")
            if user_id:
                new_nickname = self.generate_nickname(interaction.user.display_name, user_id)
                await self.apply_nickname(interaction, new_nickname, email, message, user_id)
            else:
                await self.notify_failure(interaction, message)

    async def apply_nickname(self, interaction: discord.Interaction, nickname: str, email: str, message: str, user_id: int):
        """تعيين لقب للمستخدم وإرسال رسالة نجاح."""
        try:
            # الحصول على العضو (Member) من الخادم
            guild = self.bot.get_guild(self.guild_id)
            member = guild.get_member(interaction.user.id)

            if member is None:
                await interaction.followup.send(
                    embed=self.create_embed(
                        "⚠️ حدث خطأ أثناء تعيين لقبك. لم نتمكن من العثور على حسابك في الموقع.",
                        "error"
                    ),
                    ephemeral=True
                )
                return

            await member.edit(nick=nickname)
            # إضافة المستخدم إلى activated_users بعد تحديث اللقب بنجاح
            self.activated_users[interaction.user.id] = {
                'nickname': nickname,
                'user_id': user_id
            }
            self.save_activated_users()
            await interaction.followup.send(embed=self.create_embed(f"🎉 تم التحقق من الحساب بنجاح! {message}", "success"), ephemeral=True)
            await self.log_activation_update(member, "نجاح", f"تم تعيين اللقب إلى {nickname}.")
        except discord.Forbidden:
            await interaction.followup.send(
                embed=self.create_embed(
                    f"{message}\n🚫 غير قادر على تغيير لقبك بسبب عدم وجود الصلاحيات.  .",
                    "error"
                ),
                ephemeral=True
            )
            await self.log_activation_update(member, "فشل", "عدم كفاية الأذونات لتغيير اللقب.")
        except discord.HTTPException as e:
            logger.exception(f"HTTPException عند تغيير اللقب للمستخدم {interaction.user.id}: {e}")
            await interaction.followup.send(
                embed=self.create_embed(
                    "⚠️ حدث خطأ أثناء تعيين لقبك. يرجى المحاولة لاحقًا.",
                    "error"
                ),
                ephemeral=True
            )
            await self.log_activation_update(member, "فشل", "HTTPException عند تغيير اللقب.")

    async def notify_failure(self, interaction: discord.Interaction, message: str):
        """إخطار المستخدم بفشل التفعيل."""
        await interaction.followup.send(embed=self.create_embed(f"❌ {message}", "error"), ephemeral=True)
        # الحصول على العضو (Member) من الخادم
        guild = self.bot.get_guild(self.guild_id)
        member = guild.get_member(interaction.user.id)
        await self.log_activation_update(member, "فشل", message)

    async def notify_failure_batch(self, batch, message: str):
        """إخطار دفعة من المستخدمين بفشل."""
        for interaction, _ in batch:
            await self.notify_failure(interaction, message)

    def create_embed(self, message: str, status: str) -> discord.Embed:
        """إنشاء رسالة مضمنة بناءً على الحالة."""
        colors = {"success": discord.Color.green(), "error": discord.Color.red()}
        titles = {"success": "✅ نجاح", "error": "❌ خطأ"}
        embed = discord.Embed(title=titles.get(status, "ℹ️ معلومات"), description=message, color=colors.get(status, discord.Color.blue()))
        embed.set_image(url="https://detectiveconanar.com/wp-content/uploads/2021/06/logox-main2020.png")  # يمكنك إضافة شعار أو صورة هنا
        return embed

    async def update_queue_message(self):
        """تحديث رسالة الطابور بالطلبات الحالية."""
        # الحد من التحديثات لتجنب الإزعاج
        if (datetime.now(timezone.utc) - self.last_queue_update).total_seconds() < 10:
            return

        if self.high_priority_queue.empty() and self.low_priority_queue.empty():
            queue_text = "لا توجد طلبات حاليًا."
        else:
            queue_text = ":\n"
            queue_contents = list(self.high_priority_queue._queue) + list(self.low_priority_queue._queue)
            for i, (interaction, _) in enumerate(queue_contents):
                time_left = (interaction.created_at + timedelta(minutes=15)) - datetime.now(timezone.utc)
                if time_left.total_seconds() > 0:
                    minutes, seconds = divmod(int(time_left.total_seconds()), 60)
                    queue_text += f"- {interaction.user.display_name} [⏳ {minutes:02}:{seconds:02}]\n"

        embed = discord.Embed(
            title="🔄 قائمة الانتظار:",
            description=queue_text,
            color=discord.Color.orange()
        )

        try:
            if self.queue_message:
                await self.queue_message.edit(embed=embed)
            else:
                self.queue_message = await self.send_queue_message()
            self.last_queue_update = datetime.now(timezone.utc)
        except discord.errors.NotFound:
            self.queue_message = await self.send_queue_message()

    async def add_to_queue(self, interaction: discord.Interaction, email: str):
        """إضافة مستخدم إلى الطابور وتحديث رسالة الطابور."""
        priority_queue = self.high_priority_queue if interaction.user.id in self.activated_users else self.low_priority_queue
        await priority_queue.put((interaction, email))
        await self.update_queue_message()

    @tasks.loop(seconds=10)
    async def queue_processor(self):
        """معالجة الطلبات من كلا الطابورين العالي والمنخفض الأولوية."""
        while True:
            try:
                batch = []
                while len(batch) < self.batch_size and (not self.high_priority_queue.empty() or not self.low_priority_queue.empty()):
                    if not self.high_priority_queue.empty():
                        interaction, email = await self.high_priority_queue.get()
                    else:
                        interaction, email = await self.low_priority_queue.get()
                    batch.append((interaction, email))
                if batch:
                    await self.process_activation_batch(batch)
                await asyncio.sleep(1)  # إتاحة التحكم للمهام الأخرى
            except Exception as e:
                logger.exception("خطأ في مهمة queue_processor")

    @tasks.loop(minutes=5)
    async def countdown_updater(self):
        """تحديث العد التنازلي كل 5 دقائق."""
        await self.update_queue_message()

    @tasks.loop(hours=1)
    async def nickname_validator(self):
        """التحقق بشكل دوري من ألقاب الأعضاء وإصلاح الألقاب غير الصالحة."""
        logger.info("بدء التحقق من الألقاب...")
        await self.validate_member_nicknames()
        logger.info("اكتمل التحقق من الألقاب.")

    @queue_processor.before_loop
    async def before_queue_processor(self):
        await self.bot.wait_until_ready()

    @countdown_updater.before_loop
    async def before_countdown_updater(self):
        await self.bot.wait_until_ready()

    @nickname_validator.before_loop
    async def before_nickname_validator(self):
        await self.bot.wait_until_ready()

    async def initialize_nickname_tracking(self):
        """تهيئة تتبع الألقاب الحالية لتجنب التكرارات."""
        self.existing_nicknames = set()
        for member in self.bot.get_all_members():
            if member.nick:
                self.existing_nicknames.add(member.nick.lower())

    def generate_nickname(self, user_display_name: str, user_id: int) -> str:
        """إنشاء لقب فريد، مع ضمان عدم تجاوزه 32 حرفًا."""
        base_nickname = f"⭐ {user_display_name} [{user_id}]"
        max_length = 32
        suffix = ''
        max_attempts = 10
        attempts = 0

        while attempts < max_attempts:
            nickname = f"{base_nickname[:max_length - len(suffix)]}{suffix}"
            if nickname.lower() not in self.existing_nicknames and len(nickname) <= max_length:
                break
            suffix = f"_{random.randint(1, 9999)}"
            attempts += 1

        if attempts == max_attempts:
            logger.error("فشل في إنشاء لقب فريد.")
            nickname = f"User_{user_id}"

        self.existing_nicknames.add(nickname.lower())
        return nickname

    async def validate_member_nicknames(self):
        """التحقق من ألقاب الأعضاء وإصلاح تلك التي تحتوي على معرفات ووردبريس غير صالحة."""
        guild = self.bot.get_guild(self.guild_id)
        if not guild:
            logger.error(f"لم يتم العثور على الخادم بالمعرف {self.guild_id}. لا يمكن التحقق من الألقاب.")
            return

        active_user_ids = await self.get_active_wordpress_user_ids()
        pattern = re.compile(r"^\s*([\u2605\u272F\u2B50]{1,2})?\s*(.+?)\s*(\[\d+\]){0,2}\s*$")

        for member in guild.members:
            if member.nick:
                match = pattern.match(member.nick)
                if match:
                    stars = match.group(1) or ''
                    display_name = match.group(2).strip()
                    user_id_matches = re.findall(r'\[(\d+)\]', member.nick)
                    invalid_ids = []
                    valid_ids = []

                    for user_id_str in user_id_matches:
                        try:
                            user_id = int(user_id_str)
                            if user_id in active_user_ids:
                                valid_ids.append(user_id)
                            else:
                                invalid_ids.append(user_id)
                        except ValueError:
                            invalid_ids.append(user_id_str)

                    if invalid_ids:
                        if valid_ids:
                            # المستخدم لديه معرفات صالحة؛ احتفظ بالنجوم والمعرفات الصالحة
                            new_nickname = f"{stars} {display_name} " + " ".join(f"[{uid}]" for uid in valid_ids)
                        else:
                            # لا توجد معرفات صالحة؛ إزالة النجوم والمعرفات
                            new_nickname = display_name
                        try:
                            await member.edit(nick=new_nickname)
                            await self.log_activation_update(member, "تم تحديث اللقب", f"تمت إزالة المعرفات غير الصالحة: {invalid_ids}")
                        except discord.Forbidden:
                            logger.warning(f"أذونات غير كافية لتغيير لقب {member.display_name} ({member.id}).")
                        except discord.HTTPException as e:
                            logger.exception(f"خطأ في تحديث لقب {member.display_name} ({member.id}): {e}")
                else:
                    # اختياريًا: التعامل مع الألقاب التي لا تتطابق مع النمط
                    pass

    async def close(self):
        """إغلاق جلسة aiohttp."""
        await self.session.close()

class EmailVerificationForm(discord.ui.Modal):
    def __init__(self, cog: WordPressManager):
        super().__init__(title="تحقق من حسابك", timeout=None)
        self.cog = cog
        self.email = discord.ui.TextInput(label="📧 البريد الإلكتروني", placeholder="أدخل عنوان بريدك الإلكتروني", required=True)
        self.confirm_email = discord.ui.TextInput(label="🔄 تأكيد البريد الإلكتروني", placeholder="أعد إدخال عنوان بريدك الإلكتروني", required=True)
        self.add_item(self.email)
        self.add_item(self.confirm_email)

    async def on_submit(self, interaction: discord.Interaction):
        try:
            if self.cog.is_interaction_expired(interaction):
                await interaction.response.send_message(
                    "⏳ انتهت صلاحية هذا الرسالة. يرجى إعادة بدء عملية التحقق.",
                    ephemeral=True,
                    view=self.cog.create_retry_view()
                )
                return

            user_email = self.email.value.strip().lower()
            confirm_email = self.confirm_email.value.strip().lower()

            if user_email != confirm_email:
                await interaction.response.send_message(
                    embed=self.cog.create_embed("❌ البريد الإلكتروني المدخل لا يتطابق. يرجى المحاولة مرة أخرى.", "error"),
                    ephemeral=True
                )
                return

            if not EMAIL_REGEX.match(user_email):
                await interaction.response.send_message(
                    embed=self.cog.create_embed("❌ تنسيق البريد الإلكتروني غير صالح. يرجى إدخال عنوان بريد إلكتروني صالح.", "error"),
                    ephemeral=True
                )
                return

            await interaction.response.defer(ephemeral=True)

            # استخدام check_user_status لتحديد ما إذا كان البريد الإلكتروني مفعلًا بالفعل
            is_active, user_id, message = await self.cog.check_user_status(user_email)
            if is_active:
                # بدلاً من الإنهاء، قم بتحديث اللقب مباشرةً
                new_nickname = self.cog.generate_nickname(interaction.user.display_name, user_id)
                await self.cog.apply_nickname(interaction, new_nickname, user_email, message, user_id)
                return

            # إضافة البريد الإلكتروني إلى طابور المعالجة
            await self.cog.add_to_queue(interaction, user_email)
            await interaction.followup.send("تم تقديم طلبك بنجاح. يرجى الانتظار حتى يتم معالجة طلبك.", ephemeral=True)

        except discord.InteractionResponded:
            # التفاعل تم الرد عليه مسبقًا أو منتهي الصلاحية
            pass
        except Exception as e:
            logger.exception("خطأ أثناء تقديم النموذج")
            await interaction.followup.send(
                "⚠️ حدث خطأ أثناء معالجة طلبك. يرجى المحاولة لاحقًا.",
                ephemeral=True
            )

async def setup(bot):
    await bot.add_cog(WordPressManager(bot))

التفاصيل: تمت إزالة المعرفات غير الصالحة: [13221] لكن المستخدم متواجد في الاكتف لست وبرضو USERID WORDPRESS IS CORRECT AND ITS IN HIS NICKNAME

GIVE FULLCODE AND DONT OVERSIGHT Also can u undon your change be see audilog bcz some users there nicname changes