import os
import json
import telebot
from telebot.types import InlineKeyboardMarkup, InlineKeyboardButton

TOKEN = "8496343167:AAHoG97EjEz9B_PXh6incm6a39RFVLAz_po"
DEVELOPER_IDS = [7923164784, 6246579902]
DATA_FILE = "communication_users.json"
BLOCKED_FILE = "blocked_users.json"
FIRST_START_FILE = "first_start_users.json"

bot = telebot.TeleBot(TOKEN)

def load_users_data():
    if not os.path.exists(DATA_FILE):
        return {}
    try:
        with open(DATA_FILE, "r", encoding="utf-8") as f:
            return json.load(f)
    except:
        return {}

def save_users_data(data):
    with open(DATA_FILE, "w", encoding="utf-8") as f:
        json.dump(data, f, ensure_ascii=False, indent=2)

def load_blocked_users():
    if not os.path.exists(BLOCKED_FILE):
        return []
    try:
        with open(BLOCKED_FILE, "r", encoding="utf-8") as f:
            return json.load(f)
    except:
        return []

def save_blocked_users(blocked_list):
    with open(BLOCKED_FILE, "w", encoding="utf-8") as f:
        json.dump(blocked_list, f, ensure_ascii=False, indent=2)

def load_first_start_users():
    if not os.path.exists(FIRST_START_FILE):
        return []
    try:
        with open(FIRST_START_FILE, "r", encoding="utf-8") as f:
            return json.load(f)
    except:
        return []

def save_first_start_users(users_list):
    with open(FIRST_START_FILE, "w", encoding="utf-8") as f:
        json.dump(users_list, f, ensure_ascii=False, indent=2)

def is_user_blocked(user_id):
    blocked_users = load_blocked_users()
    return str(user_id) in blocked_users

def block_user(user_id):
    blocked_users = load_blocked_users()
    if str(user_id) not in blocked_users:
        blocked_users.append(str(user_id))
        save_blocked_users(blocked_users)

def unblock_user(user_id):
    blocked_users = load_blocked_users()
    if str(user_id) in blocked_users:
        blocked_users.remove(str(user_id))
        save_blocked_users(blocked_users)

def update_user_replied_status(user_id, replied):
    data = load_users_data()
    user_id_str = str(user_id)
    if user_id_str in data:
        data[user_id_str]["replied"] = replied
        save_users_data(data)

def has_user_been_replied(user_id):
    data = load_users_data()
    user_id_str = str(user_id)
    if user_id_str in data:
        return data[user_id_str].get("replied", False)
    return False

def is_first_start(user_id):
    first_start_users = load_first_start_users()
    return str(user_id) not in first_start_users

def mark_user_as_started(user_id):
    first_start_users = load_first_start_users()
    if str(user_id) not in first_start_users:
        first_start_users.append(str(user_id))
        save_first_start_users(first_start_users)

reply_states = {}
message_states = {}

@bot.message_handler(commands=['start'])
def handle_start(message):
    user_id = message.from_user.id
    username = message.from_user.username
    name = message.from_user.first_name or "مستخدم"
    
    if user_id in DEVELOPER_IDS:
        welcome_text = """مرحباً بك في لوحة تحكم بوت تواصل Source Kodo.
أنت مطور البوت."""
        bot.reply_to(message, welcome_text)
        return
    
    welcome_text = """⊱ اهلاً بك في بوت تواصل Source Kodo 👋🏻.
⊱ يمكنك ترك رسالة هنا سيقوم فريق الدعم الفني بالتواصل معك خلال دقائق 💬."""
    
    bot.reply_to(message, welcome_text)
    
    data = load_users_data()
    user_data = {
        "name": name,
        "username": username or "",
        "user_id": user_id,
        "status": "active",
        "replied": False
    }
    data[str(user_id)] = user_data
    save_users_data(data)
    
    if is_first_start(user_id):
        welcome_msg = f"عضو جديد دخل البوت:\n\nالاسم: {name}\nالمعرف: @{username if username else 'لا يوجد'}\nID: {user_id}"
        
        for dev_id in DEVELOPER_IDS:
            if dev_id != user_id:
                try:
                    bot.send_message(dev_id, welcome_msg)
                except:
                    pass
        
        mark_user_as_started(user_id)

@bot.message_handler(func=lambda message: message.from_user.id not in DEVELOPER_IDS)
def handle_user_message(message):
    user_id = message.from_user.id
    username = message.from_user.username
    name = message.from_user.first_name or "مستخدم"
    message_text = message.text
    
    if is_user_blocked(user_id):
        bot.reply_to(message, "عذراً، أنت محظور من استخدام البوت.")
        return
    
    data = load_users_data()
    if str(user_id) not in data:
        data[str(user_id)] = {
            "name": name,
            "username": username or "",
            "user_id": user_id,
            "status": "active",
            "replied": False
        }
        save_users_data(data)
    else:
        data[str(user_id)]["replied"] = False
        save_users_data(data)
    
    markup = InlineKeyboardMarkup(row_width=2)
    
    username_btn = InlineKeyboardButton(f"@{username}" if username else "لا يوجد معرف", callback_data="username_info")
    name_btn = InlineKeyboardButton(name, callback_data="name_info")
    markup.row(username_btn, name_btn)
    
    reply_btn = InlineKeyboardButton("رد", callback_data=f"reply_{user_id}_{message.message_id}")
    markup.row(reply_btn)
    
    block_btn = InlineKeyboardButton("حظر", callback_data=f"block_{user_id}")
    unblock_btn = InlineKeyboardButton("الغاء حظر", callback_data=f"unblock_{user_id}")
    markup.row(block_btn, unblock_btn)
    
    status_btn = InlineKeyboardButton("عرض الحالة", callback_data=f"status_{user_id}")
    markup.row(status_btn)
    
    msg_for_devs = f"رسالة جديدة:\n\n{message_text}"
    
    for dev_id in DEVELOPER_IDS:
        try:
            sent_msg = bot.send_message(dev_id, msg_for_devs, reply_markup=markup)
            message_states[sent_msg.message_id] = {
                "user_id": user_id,
                "username": username or "لا يوجد معرف",
                "name": name,
                "message_text": message_text,
                "dev_id": dev_id
            }
        except:
            pass
    
    bot.reply_to(message, "✅ تم إرسال رسالتك لفريق الدعم الفني.")

@bot.callback_query_handler(func=lambda call: True)
def handle_callbacks(call):
    callback_data = call.data
    chat_id = call.message.chat.id
    message_id = call.message.message_id
    
    if callback_data in ["username_info", "name_info"]:
        bot.answer_callback_query(call.id)
        return
    
    elif callback_data.startswith("reply_"):
        parts = callback_data.split("_")
        target_user_id = int(parts[1])
        target_message_id = int(parts[2])
        
        reply_states[chat_id] = {
            "target_user_id": target_user_id,
            "target_message_id": target_message_id,
            "original_message_id": message_id
        }
        
        reply_text = "عزيزي المطور ارسل رسالتك الان:"
        markup = InlineKeyboardMarkup()
        markup.row(InlineKeyboardButton("رجوع", callback_data=f"back_{message_id}"))
        
        try:
            bot.edit_message_text(
                reply_text,
                chat_id,
                message_id,
                reply_markup=markup
            )
        except:
            bot.answer_callback_query(call.id, "خطأ في تحرير الرسالة")
        
        bot.answer_callback_query(call.id)
    
    elif callback_data.startswith("block_"):
        target_user_id = int(callback_data.split("_")[1])
        
        data = load_users_data()
        target_username = data.get(str(target_user_id), {}).get("username", "لا يوجد معرف")
        
        confirm_text = f"عزيزي المطور لتأكيد حظر المستخدم @{target_username} يرجى الضغط على الزر تأكيد ادناه:"
        markup = InlineKeyboardMarkup()
        markup.row(
            InlineKeyboardButton("تأكيد", callback_data=f"confirm_block_{target_user_id}_{message_id}"),
            InlineKeyboardButton("رجوع", callback_data=f"back_{message_id}")
        )
        
        try:
            bot.edit_message_text(
                confirm_text,
                chat_id,
                message_id,
                reply_markup=markup
            )
        except:
            bot.answer_callback_query(call.id, "خطأ في تحرير الرسالة")
        
        bot.answer_callback_query(call.id)
    
    elif callback_data.startswith("unblock_"):
        target_user_id = int(callback_data.split("_")[1])
        
        data = load_users_data()
        target_username = data.get(str(target_user_id), {}).get("username", "لا يوجد معرف")
        
        confirm_text = f"عزيزي المطور لتأكيد الغاء حظر المستخدم @{target_username} يرجى الضغط على الزر تأكيد ادناه:"
        markup = InlineKeyboardMarkup()
        markup.row(
            InlineKeyboardButton("تأكيد", callback_data=f"confirm_unblock_{target_user_id}_{message_id}"),
            InlineKeyboardButton("رجوع", callback_data=f"back_{message_id}")
        )
        
        try:
            bot.edit_message_text(
                confirm_text,
                chat_id,
                message_id,
                reply_markup=markup
            )
        except:
            bot.answer_callback_query(call.id, "خطأ في تحرير الرسالة")
        
        bot.answer_callback_query(call.id)
    
    elif callback_data.startswith("status_"):
        target_user_id = int(callback_data.split("_")[1])
        
        blocked = is_user_blocked(target_user_id)
        blocked_status = "محظور 🚫" if blocked else "غير محظور 🟢"
        
        replied = has_user_been_replied(target_user_id)
        replied_status = "مستلم 🟢" if replied else "غير مستلم 🔴"
        
        status_text = f"""الحالة:
{replied_status}

الحظر:
{blocked_status}"""
        
        markup = InlineKeyboardMarkup()
        markup.row(InlineKeyboardButton("رجوع", callback_data=f"back_{message_id}"))
        
        try:
            bot.edit_message_text(
                status_text,
                chat_id,
                message_id,
                reply_markup=markup
            )
        except:
            bot.answer_callback_query(call.id, "خطأ في تحرير الرسالة")
        
        bot.answer_callback_query(call.id)
    
    elif callback_data.startswith("confirm_block_"):
        parts = callback_data.split("_")
        target_user_id = int(parts[2])
        original_message_id = int(parts[3])
        
        block_user(target_user_id)
        
        if original_message_id in message_states:
            msg_data = message_states[original_message_id]
            msg_for_devs = f"رسالة جديدة:\n\n{msg_data['message_text']}"
            
            markup = InlineKeyboardMarkup(row_width=2)
            username_btn = InlineKeyboardButton(f"@{msg_data['username']}" if msg_data['username'] != "لا يوجد معرف" else "لا يوجد معرف", callback_data="username_info")
            name_btn = InlineKeyboardButton(msg_data['name'], callback_data="name_info")
            markup.row(username_btn, name_btn)
            reply_btn = InlineKeyboardButton("رد", callback_data=f"reply_{msg_data['user_id']}_0")
            markup.row(reply_btn)
            block_btn = InlineKeyboardButton("حظر", callback_data=f"block_{msg_data['user_id']}")
            unblock_btn = InlineKeyboardButton("الغاء حظر", callback_data=f"unblock_{msg_data['user_id']}")
            markup.row(block_btn, unblock_btn)
            status_btn = InlineKeyboardButton("عرض الحالة", callback_data=f"status_{msg_data['user_id']}")
            markup.row(status_btn)
            
            try:
                bot.edit_message_text(
                    msg_for_devs,
                    chat_id,
                    message_id,
                    reply_markup=markup
                )
            except:
                pass
        
        bot.answer_callback_query(call.id, "تم حظر المستخدم بنجاح")
    
    elif callback_data.startswith("confirm_unblock_"):
        parts = callback_data.split("_")
        target_user_id = int(parts[2])
        original_message_id = int(parts[3])
        
        unblock_user(target_user_id)
        
        if original_message_id in message_states:
            msg_data = message_states[original_message_id]
            msg_for_devs = f"رسالة جديدة:\n\n{msg_data['message_text']}"
            
            markup = InlineKeyboardMarkup(row_width=2)
            username_btn = InlineKeyboardButton(f"@{msg_data['username']}" if msg_data['username'] != "لا يوجد معرف" else "لا يوجد معرف", callback_data="username_info")
            name_btn = InlineKeyboardButton(msg_data['name'], callback_data="name_info")
            markup.row(username_btn, name_btn)
            reply_btn = InlineKeyboardButton("رد", callback_data=f"reply_{msg_data['user_id']}_0")
            markup.row(reply_btn)
            block_btn = InlineKeyboardButton("حظر", callback_data=f"block_{msg_data['user_id']}")
            unblock_btn = InlineKeyboardButton("الغاء حظر", callback_data=f"unblock_{msg_data['user_id']}")
            markup.row(block_btn, unblock_btn)
            status_btn = InlineKeyboardButton("عرض الحالة", callback_data=f"status_{msg_data['user_id']}")
            markup.row(status_btn)
            
            try:
                bot.edit_message_text(
                    msg_for_devs,
                    chat_id,
                    message_id,
                    reply_markup=markup
                )
            except:
                pass
        
        bot.answer_callback_query(call.id, "تم الغاء حظر المستخدم بنجاح")
    
    elif callback_data.startswith("back_"):
        try:
            original_message_id = int(callback_data.split("_")[1])
            
            if chat_id in reply_states:
                del reply_states[chat_id]
            
            if original_message_id in message_states:
                msg_data = message_states[original_message_id]
                msg_for_devs = f"رسالة جديدة:\n\n{msg_data['message_text']}"
                
                markup = InlineKeyboardMarkup(row_width=2)
                username_btn = InlineKeyboardButton(f"@{msg_data['username']}" if msg_data['username'] != "لا يوجد معرف" else "لا يوجد معرف", callback_data="username_info")
                name_btn = InlineKeyboardButton(msg_data['name'], callback_data="name_info")
                markup.row(username_btn, name_btn)
                reply_btn = InlineKeyboardButton("رد", callback_data=f"reply_{msg_data['user_id']}_0")
                markup.row(reply_btn)
                block_btn = InlineKeyboardButton("حظر", callback_data=f"block_{msg_data['user_id']}")
                unblock_btn = InlineKeyboardButton("الغاء حظر", callback_data=f"unblock_{msg_data['user_id']}")
                markup.row(block_btn, unblock_btn)
                status_btn = InlineKeyboardButton("عرض الحالة", callback_data=f"status_{msg_data['user_id']}")
                markup.row(status_btn)
                
                try:
                    bot.edit_message_text(
                        msg_for_devs,
                        chat_id,
                        message_id,
                        reply_markup=markup
                    )
                except:
                    bot.answer_callback_query(call.id, "خطأ في استعادة الرسالة")
            else:
                bot.answer_callback_query(call.id, "لم يتم العثور على الرسالة الأصلية")
        except:
            bot.answer_callback_query(call.id, "خطأ في معالجة الزر")
        
        bot.answer_callback_query(call.id)

@bot.message_handler(func=lambda message: message.from_user.id in DEVELOPER_IDS)
def handle_developer_message(message):
    chat_id = message.chat.id
    
    if chat_id in reply_states:
        target_user_id = reply_states[chat_id]["target_user_id"]
        target_message_id = reply_states[chat_id]["target_message_id"]
        original_message_id = reply_states[chat_id]["original_message_id"]
        
        try:
            bot.send_message(target_user_id, f"الرد من الدعم الفني:\n\n{message.text}")
            
            update_user_replied_status(target_user_id, True)
            
            bot.reply_to(message, "✅ تم إرسال الرد للمستخدم بنجاح")
            
            if original_message_id in message_states:
                msg_data = message_states[original_message_id]
                msg_for_devs = f"رسالة جديدة:\n\n{msg_data['message_text']}"
                
                markup = InlineKeyboardMarkup(row_width=2)
                username_btn = InlineKeyboardButton(f"@{msg_data['username']}" if msg_data['username'] != "لا يوجد معرف" else "لا يوجد معرف", callback_data="username_info")
                name_btn = InlineKeyboardButton(msg_data['name'], callback_data="name_info")
                markup.row(username_btn, name_btn)
                reply_btn = InlineKeyboardButton("رد", callback_data=f"reply_{msg_data['user_id']}_0")
                markup.row(reply_btn)
                block_btn = InlineKeyboardButton("حظر", callback_data=f"block_{msg_data['user_id']}")
                unblock_btn = InlineKeyboardButton("الغاء حظر", callback_data=f"unblock_{msg_data['user_id']}")
                markup.row(block_btn, unblock_btn)
                status_btn = InlineKeyboardButton("عرض الحالة", callback_data=f"status_{msg_data['user_id']}")
                markup.row(status_btn)
                
                try:
                    bot.edit_message_text(
                        msg_for_devs,
                        chat_id,
                        original_message_id,
                        reply_markup=markup
                    )
                except:
                    pass
            
            del reply_states[chat_id]
            
        except Exception as e:
            bot.reply_to(message, f"❌ فشل إرسال الرد: {str(e)}")
    else:
        bot.reply_to(message, "لإرسال رسالة للمستخدم، الرجاء استخدام زر 'رد' في الرسالة التي تريد الرد عليها.")

if __name__ == "__main__":
    print("Starting communication bot...")
    bot.polling(none_stop=True)
