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

# ================= CONFIG =================

BOT_TOKEN = "8713927088:AAEIf2Hcd-cfcUckrAyOghtAAectuewpJis"
ADMIN_ID = 8777992150

REFERRAL_BONUS = 20
MIN_WITHDRAW = 300

PROOF_CHANNEL = "https://t.me/earnwithasking"
UPDATES_CHANNEL = "https://t.me/technostellar_official"
HELP_BOT = "https://t.me/Details_provider_50_bot"

bot = telebot.TeleBot(BOT_TOKEN)

# ================= DATABASE =================

USERS_FILE = "users.json"
WITHDRAWS_FILE = "withdraws.json"

if not os.path.exists(USERS_FILE):
    with open(USERS_FILE, "w") as f:
        json.dump({}, f)

if not os.path.exists(WITHDRAWS_FILE):
    with open(WITHDRAWS_FILE, "w") as f:
        json.dump([], f)


def load_users():
    with open(USERS_FILE, "r") as f:
        return json.load(f)


def save_users(data):
    with open(USERS_FILE, "w") as f:
        json.dump(data, f, indent=4)


def load_withdraws():
    with open(WITHDRAWS_FILE, "r") as f:
        return json.load(f)


def save_withdraws(data):
    with open(WITHDRAWS_FILE, "w") as f:
        json.dump(data, f, indent=4)


# ================= MENU =================

def main_menu():
    markup = InlineKeyboardMarkup()

    markup.row(
        InlineKeyboardButton("💰 Wallet", callback_data="wallet"),
        InlineKeyboardButton("👥 Refer", callback_data="refer")
    )

    markup.row(
        InlineKeyboardButton("🏧 Withdraw", callback_data="withdraw"),
        InlineKeyboardButton("🏆 Leaderboard", callback_data="leaderboard")
    )

    markup.row(
        InlineKeyboardButton("💳 Set UPI", callback_data="setupi")
    )

    markup.row(
        InlineKeyboardButton("📢 Payout Proofs", url=PROOF_CHANNEL)
    )

    markup.row(
        InlineKeyboardButton("📣 Updates", url=UPDATES_CHANNEL)
    )

    markup.row(
        InlineKeyboardButton("🤖 Helpful Bot Click Here", url=HELP_BOT)
    )

    return markup


# ================= START =================

@bot.message_handler(commands=['start'])
def start(message):
    users = load_users()

    user_id = str(message.from_user.id)
    name = message.from_user.first_name

    args = message.text.split()

    ref = None

    if len(args) > 1:
        ref = args[1]

    if user_id not in users:

        users[user_id] = {
            "name": name,
            "balance": 0,
            "referrals": 0,
            "upi": None
        }

        # ===== REFERRAL BONUS =====

        if ref and ref != user_id and ref in users:

            users[ref]["balance"] += REFERRAL_BONUS
            users[ref]["referrals"] += 1

            bot.send_message(
                ref,
                f"🎉 New Referral Joined!\n\n💰 ₹{REFERRAL_BONUS} Added To Your Wallet."
            )

        save_users(users)

    text = f"""
🎉 Welcome {name}

💸 Earn ₹20 Per Referral

🏧 Minimum Withdrawal: ₹{MIN_WITHDRAW}

👥 Invite Friends And Earn Money

🔥 Fast Withdrawals
🔥 Trusted Payments
🔥 High Quality Bot
"""

    bot.send_message(
        message.chat.id,
        text,
        reply_markup=main_menu()
    )


# ================= SETUPI =================

@bot.message_handler(commands=['setupi'])
def setupi(message):
    users = load_users()

    user_id = str(message.from_user.id)

    args = message.text.split()

    if len(args) < 2:
        bot.reply_to(
            message,
            "Usage:\n/setupi yourupi@bank"
        )
        return

    upi = args[1]

    if user_id not in users:
        users[user_id] = {
            "name": message.from_user.first_name,
            "balance": 0,
            "referrals": 0,
            "upi": None
        }

    users[user_id]["upi"] = upi

    save_users(users)

    bot.reply_to(
        message,
        f"✅ UPI Saved Successfully\n\n🏧 Your UPI:\n{upi}"
    )


# ================= ADMIN PANEL =================

@bot.message_handler(commands=['admin'])
def admin_panel(message):

    if message.from_user.id != ADMIN_ID:
        return

    users = load_users()
    withdraws = load_withdraws()

    text = f"""
👑 ADMIN PANEL

👥 Total Users: {len(users)}

💸 Withdraw Requests: {len(withdraws)}

📩 Reply System Active
📡 Broadcast System Active
"""

    bot.send_message(message.chat.id, text)


# ================= REPLY =================

@bot.message_handler(commands=['reply'])
def reply_user(message):

    if message.from_user.id != ADMIN_ID:
        return

    parts = message.text.split(maxsplit=2)

    if len(parts) < 3:
        bot.reply_to(
            message,
            "Usage:\n/reply user_id message"
        )
        return

    target = parts[1]
    msg = parts[2]

    try:
        bot.send_message(
            target,
            f"📩 MESSAGE FROM ADMIN\n\n{msg}"
        )

        bot.reply_to(message, "✅ Reply Sent Successfully")

    except:
        bot.reply_to(message, "❌ Failed To Send Reply")


# ================= BROADCAST =================

@bot.message_handler(commands=['broadcast'])
def broadcast(message):

    if message.from_user.id != ADMIN_ID:
        return

    parts = message.text.split(maxsplit=1)

    if len(parts) < 2:
        bot.reply_to(
            message,
            "Usage:\n/broadcast your message"
        )
        return

    msg = parts[1]

    users = load_users()

    success = 0
    failed = 0

    for uid in users:

        try:
            bot.send_message(
                uid,
                f"📢 BROADCAST MESSAGE\n\n{msg}"
            )
            success += 1

        except:
            failed += 1

    bot.reply_to(
        message,
        f"✅ Broadcast Completed\n\n✔️ Sent: {success}\n\n❌ Failed: {failed}"
    )


# ================= CALLBACKS =================

@bot.callback_query_handler(func=lambda call: True)
def callbacks(call):

    users = load_users()

    user_id = str(call.from_user.id)

    if user_id not in users:
        return

    user = users[user_id]

    # ===== WALLET =====

    if call.data == "wallet":

        text = f"""
💰 YOUR WALLET

👥 Referrals: {user['referrals']}

💵 Balance: ₹{user['balance']}

🏧 Minimum Withdraw: ₹{MIN_WITHDRAW}
"""

        bot.edit_message_text(
            text,
            call.message.chat.id,
            call.message.message_id,
            reply_markup=main_menu()
        )

    # ===== REFER =====

    elif call.data == "refer":

        me = bot.get_me()

        link = f"https://t.me/{me.username}?start={user_id}"

        text = f"""
👥 YOUR REFERRAL LINK

{link}

💸 Earn ₹20 Per Referral
"""

        bot.edit_message_text(
            text,
            call.message.chat.id,
            call.message.message_id,
            disable_web_page_preview=True,
            reply_markup=main_menu()
        )

    # ===== SETUPI =====

    elif call.data == "setupi":

        bot.send_message(
            call.message.chat.id,
            "💳 Send Your UPI ID Like:\n\n/setupi yourupi@bank"
        )

    # ===== WITHDRAW =====

    elif call.data == "withdraw":

        if user["balance"] < MIN_WITHDRAW:

            bot.answer_callback_query(
                call.id,
                f"Minimum Withdrawal Is ₹{MIN_WITHDRAW}",
                show_alert=True
            )
            return

        if not user["upi"]:

            bot.send_message(
                call.message.chat.id,
                "⚠️ First Save Your UPI ID\n\nUse:\n/setupi yourupi@bank"
            )
            return

        withdraws = load_withdraws()

        withdraws.append({
            "user_id": user_id,
            "amount": user["balance"],
            "upi": user["upi"]
        })

        save_withdraws(withdraws)

        bot.send_message(
            ADMIN_ID,
            f"""
💸 NEW WITHDRAW REQUEST

👤 User ID: {user_id}

💰 Amount: ₹{user['balance']}

🏧 UPI: {user['upi']}

Reply:
/reply {user_id} message
"""
        )

        users[user_id]["balance"] = 0

        save_users(users)

        bot.send_message(
            call.message.chat.id,
            "✅ Withdraw Request Submitted\n\n⏳ Please Wait For Admin Approval."
        )

    # ===== LEADERBOARD =====

    elif call.data == "leaderboard":

        sorted_users = sorted(
            users.items(),
            key=lambda x: x[1]["referrals"],
            reverse=True
        )

        text = "🏆 TOP REFERRERS\n\n"

        count = 1

        for uid, u in sorted_users:

            text += f"{count}. {u['name']} → {u['referrals']} referrals\n"

            count += 1

            if count > 10:
                break

        bot.edit_message_text(
            text,
            call.message.chat.id,
            call.message.message_id,
            reply_markup=main_menu()
        )


# ================= RUN BOT =================

print("Bot Running...")

bot.infinity_polling()