import telebot
import sqlite3
import random
import string
import time
from telebot.types import InlineKeyboardMarkup, InlineKeyboardButton

TOKEN = "8852062811:AAHrtFBbrE4GSTatJZv53CPJHu8BfpWc4Js"
BOT_USERNAME = "Nadin_refbot"
CHANNEL_USERNAME = [ "Nadin_vpn", "N_nword"]
ADMIN_ID = 8578191570

bot = telebot.TeleBot(TOKEN)

# ================= DATABASE =================
conn = sqlite3.connect("bot.db", check_same_thread=False)
cursor = conn.cursor()

cursor.execute("""
CREATE TABLE IF NOT EXISTS users (
    user_id INTEGER PRIMARY KEY,
    referrals INTEGER DEFAULT 0,
    invited_by INTEGER,
    code TEXT,
    joined INTEGER DEFAULT 0,
    banned INTEGER DEFAULT 0
)
""")
conn.commit()
cursor.execute("""
CREATE TABLE IF NOT EXISTS settings (
    id INTEGER PRIMARY KEY,
    bot_active INTEGER DEFAULT 1
)
""")
conn.commit()

cursor.execute("INSERT OR IGNORE INTO settings (id, bot_active) VALUES (1,1)")
conn.commit()

# ================= HELPERS =================
def generate_code():
    return ''.join(random.choices(string.ascii_uppercase + string.digits, k=8))

def is_user_member(user_id):
    for channel in CHANNEL_USERNAME:
        try:
            member = bot.get_chat_member(chat_id=f"@{channel}", user_id=user_id)
            if member.status in ['left', 'kicked']:
                return False
        except:
            return False
    return True

def join_keyboard():
    markup = InlineKeyboardMarkup()
    
    markup.add(InlineKeyboardButton("📢 کانال اول", url="https://t.me/N_nword"))
    markup.add(InlineKeyboardButton("📢 کانال دوم", url="https://t.me/nadin_vpn"))
    markup.add(InlineKeyboardButton("✅ عضو شدم", callback_data="check_join"))
    return markup



def main_menu():
    markup = InlineKeyboardMarkup()
    markup.add(InlineKeyboardButton("📖 ,راهنمای ربات", callback_data="help"))
    markup.add(InlineKeyboardButton("📊 ,وضعیت امتیاز های من", callback_data="status"))
    markup.add(InlineKeyboardButton("🔗 لینک دعوت من ", callback_data="ref"))
    return markup

def back_menu():
    markup = InlineKeyboardMarkup()
    markup.add(InlineKeyboardButton("🔙 بازگشت به منو قبلی", callback_data="back"))
    return markup

def is_bot_active():
    cursor.execute("SELECT bot_active FROM settings WHERE id=1")
    return cursor.fetchone()[0] == 1
# ================= START =================
@bot.message_handler(commands=['start'])
def start(message):
    user_id = message.from_user.id
    args = message.text.split()

    referrer_id = None
    if len(args) > 1:
        try:
            referrer_id = int(args[1])
        except:
            pass

    # ذخیره کاربر حتی بدون عضویت
    cursor.execute("SELECT * FROM users WHERE user_id=?", (user_id,))
    user = cursor.fetchone()
    cursor.execute("SELECT banned FROM users WHERE user_id=?", (user_id,))
    ban = cursor.fetchone()

    if ban and ban[0] == 1:
        bot.send_message(message.chat.id, "🚫 شما از ربات بن شده‌اید")
        return

    if not user:
        if referrer_id == user_id:
            referrer_id = None

        cursor.execute(
            "INSERT INTO users (user_id, invited_by) VALUES (?, ?)",
            (user_id, referrer_id)
        )
        conn.commit()

    # چک عضویت
    if not is_user_member(user_id):
        bot.send_message(
            message.chat.id,
            "❌ کاربر عزیز، برای استفاده از ربات باید در کانال های زیر جوین بشید.",
            reply_markup=join_keyboard()
        )
        return
    if not is_bot_active() and user_id != ADMIN_ID:
        bot.send_message(message.chat.id, "🚫 ظرفیت ربات به اتمام رسیده")
        return

    bot.send_message(
        message.chat.id,
        "🏠 منوی اصلی",
        reply_markup=main_menu()
    )

# ================= CALLBACK =================
@bot.callback_query_handler(func=lambda call: True)
def callback(call):
    user_id = call.from_user.id


    time.sleep(1)
    if not is_bot_active() and user_id != ADMIN_ID:
        bot.answer_callback_query(call.id, "🚫 ربات بسته است", show_alert=True)
        return

    cursor.execute("SELECT banned FROM users WHERE user_id=?", (user_id,))
    ban = cursor.fetchone()

    if ban and ban[0] == 1:
        bot.answer_callback_query(call.id, "🚫 شما بن شده‌اید ", show_alert=True)
        return

    elif call.data.startswith("unban_"):
        target = int(call.data.split("_")[1])

        cursor.execute("UPDATE users SET banned=0 WHERE user_id=?", (target,))
        conn.commit()

        bot.answer_callback_query(call.id, "✅ کاربر آنبن شد")

    elif call.data == "bot_off" and user_id == ADMIN_ID:
        cursor.execute("UPDATE settings SET bot_active=0 WHERE id=1")
        conn.commit()

        bot.answer_callback_query(call.id, "🔴 ربات بسته شد")

        # ارسال پیام به همه
        cursor.execute("SELECT user_id FROM users")
        users = cursor.fetchall()

        for u in users:
            try:
                bot.send_message(u[0], "🚫 ظرفیت ربات به اتمام رسید")
            except:
                pass

    elif call.data == "bot_on" and user_id == ADMIN_ID:
        cursor.execute("UPDATE settings SET bot_active=1 WHERE id=1")
        conn.commit()

        bot.answer_callback_query(call.id, "🟢 ربات باز شد")

    # چک عضویت
    if not is_user_member(user_id):
        bot.answer_callback_query(call.id, "❌ شما هنوز درچنل عضو نشدید", show_alert=True)
        try:
            bot.edit_message_text(
                "❌ هنوز عضو کانال نشدی!",
                call.message.chat.id,
                call.message.message_id,
                reply_markup=join_keyboard()
            )
        except:
            pass
        return

    # ================= CHECK JOIN =================
    if call.data == "check_join":

        cursor.execute("SELECT invited_by, joined FROM users WHERE user_id=?", (user_id,))
        data = cursor.fetchone()

        if data:
            invited_by, joined = data

            # فقط یکبار رفرال حساب بشه
            if invited_by and joined == 0:
                cursor.execute("UPDATE users SET joined=1 WHERE user_id=?", (user_id,))
                cursor.execute("UPDATE users SET referrals = referrals + 1 WHERE user_id=?", (invited_by,))
                conn.commit()

        bot.answer_callback_query(call.id, "✅ تایید شد")

        bot.edit_message_text(
            "🎉 عضویت تایید شد!\n\n🏠 منوی اصلی",
            call.message.chat.id,
            call.message.message_id,
            reply_markup=main_menu()
        )

    # ================= BACK =================
    elif call.data == "back":
        bot.edit_message_text(
            "🏠 منوی اصلی",
            call.message.chat.id,
            call.message.message_id,
            reply_markup=main_menu()
        )

    # ================= STATUS =================
    elif call.data == "status":
        cursor.execute("SELECT referrals, code FROM users WHERE user_id=?", (user_id,))
        referrals, code = cursor.fetchone()

        if referrals >= 6 and not code:
            code = generate_code()
            cursor.execute("UPDATE users SET code=? WHERE user_id=?", (code, user_id))
            conn.commit()

        # ================= قبل از رسیدن =================
        if referrals < 6:
            text = f"📊 تعداد رفرال های شما: {referrals}"
            text += f"\n"
            text += f"\n1️⃣ جهت به روز شدن امتیاز ها یکبار به منوی قبل رفته و مجدد به این صفحه بازگردید."
            text += f"\n"
            text += f"\n2️⃣جهت دریافت کانفیگ بعد از کامل کردن امتیاز ها به همین بخش مراجعه کنید."

        # ================= بعد از رسیدن =================
        else:
            text = f"📊 تعداد رفرال های شما: {referrals}"
            text += f"\nاین پیام را برای ادمین به آیدی @Nadin_vpn فوروارد کنید تا کانفیگ خودتون رو دریافت کنید"
            text += f"\n<code>{code}</code>"
            text += f"\n ❌ توجه کنین که پیام حتما باید فوروارد باشه در غیر این صورت مورد قبول نیست!"

        bot.edit_message_text(
            text,
            call.message.chat.id,
            call.message.message_id,
            reply_markup=back_menu(),
            parse_mode="HTML"
        )

    # ================= REF =================
    elif call.data == "ref":
        link = f"https://t.me/{BOT_USERNAME}?start={user_id}"

        bot.edit_message_text(
            f"🔗 لینک دعوت:\n{link}",
            call.message.chat.id,
            call.message.message_id,
            reply_markup=back_menu()
        )
# ================= help =================
    elif call.data == "help":

        text = (
            "📘 راهنمای ربات:\n\n"
            "👥 با دعوت دوستانت امتیاز بگیر\n"
            "🎁 هر 5 رفرال = دریافت کانفیگ رایگان اختصاصی به حجم 5 گیگابایت \n\n"
            "📌 مراحل:\n"
            "1. لینک دعوتت اختصاصی خودت رو از ربات در منوی قبلی بگیر\n"
            "2. برای دوستات بفرست\n"
            "3. وقتی عضو شدن امتیاز بگیر و زمانی که به 5 امتیاز رسیدی میتونی از ادمینمون کانفیگت رو تحویل بگیری\n\n"
            "⚠️ توجه:\n"
            "بعد از به دست اوردن 5 امتیاز کد اختصاصی خودت رو باید برای ادمین ارسال کنی و کانفیگت رو تحویل بگیری"
        )

        bot.edit_message_text(
            text,
            call.message.chat.id,
            call.message.message_id,
            reply_markup=back_menu()
        )
# ================= ADMIN =================
    elif call.data.startswith("add_"):
        target = int(call.data.split("_")[1])

        cursor.execute("UPDATE users SET referrals = referrals + 1 WHERE user_id=?", (target,))
        conn.commit()

        bot.answer_callback_query(call.id, "✅ امتیاز اضافه شد")
    elif call.data.startswith("reset_"):
        target = int(call.data.split("_")[1])

        cursor.execute("UPDATE users SET referrals=0 WHERE user_id=?", (target,))
        conn.commit()

        bot.answer_callback_query(call.id, "✅ امتیاز صفر شد")
    elif call.data.startswith("ban_"):
        target = int(call.data.split("_")[1])

        cursor.execute("UPDATE users SET banned=1 WHERE user_id=?", (target,))
        conn.commit()

        bot.answer_callback_query(call.id, "🚫 کاربر بن شد")

@bot.message_handler(func=lambda message: True)
def admin_panel(message):
    if message.from_user.id != ADMIN_ID:
        return

    code = message.text.strip()

    cursor.execute("SELECT user_id, referrals, banned FROM users WHERE code=?", (code,))
    data = cursor.fetchone()

    if not data:
        bot.send_message(message.chat.id, "❌ کد پیدا نشد")
        return

    target_id, referrals, banned = data
    status = "🚫 بن شده" if banned == 1 else "✅ فعال"

    markup = InlineKeyboardMarkup()
    markup = InlineKeyboardMarkup()
    markup.add(InlineKeyboardButton("➕ امتیاز", callback_data=f"add_{target_id}"))
    markup.add(InlineKeyboardButton("❌ صفر کردن", callback_data=f"reset_{target_id}"))
    markup.add(InlineKeyboardButton("🚫 بن کردن", callback_data=f"ban_{target_id}"))
    markup.add(InlineKeyboardButton("✅ آنبن", callback_data=f"unban_{target_id}"))
    markup.add(InlineKeyboardButton("🔴 بستن ربات", callback_data="bot_off"))
    markup.add(InlineKeyboardButton("🟢 باز کردن ربات", callback_data="bot_on"))

    bot.send_message(
        message.chat.id,
        f"👤 آیدی: {target_id}\n📊 امتیاز: {referrals}\n📌 وضعیت: {status}",
        reply_markup=markup
    )
# ================= RUN =================
print("Bot is running...")
bot.infinity_polling()