import sqlite3
import re
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Updater, CommandHandler, CallbackQueryHandler, MessageHandler, Filters, CallbackContext

# ========== تنظیمات ==========
BOT_TOKEN = "8647425702:AAFlbWJCibRyMlVtev9XobxO2OH5s6orv_U"
CHANNEL_ID = "@ffreedogs"
CHANNEL_LINK = "https://t.me/ffreedogs"
ADMIN_IDS = [8833990029]
# =============================

# ========== دیتابیس ==========
def init_db():
    conn = sqlite3.connect('bot.db')
    c = conn.cursor()
    c.execute('''CREATE TABLE IF NOT EXISTS users
                 (user_id INTEGER PRIMARY KEY, referrer_id INTEGER, balance INTEGER DEFAULT 0)''')
    c.execute('''CREATE TABLE IF NOT EXISTS referrals
                 (referrer_id INTEGER, referred_id INTEGER)''')
    c.execute('''CREATE TABLE IF NOT EXISTS withdrawals
                 (user_id INTEGER, amount INTEGER, target TEXT, status TEXT, date TIMESTAMP DEFAULT CURRENT_TIMESTAMP)''')
    conn.commit()
    conn.close()

def add_user(user_id, referrer_id=None):
    conn = sqlite3.connect('bot.db')
    c = conn.cursor()
    c.execute("INSERT OR IGNORE INTO users (user_id, referrer_id) VALUES (?, ?)", (user_id, referrer_id))
    conn.commit()
    conn.close()

def update_balance(user_id, amount):
    conn = sqlite3.connect('bot.db')
    c = conn.cursor()
    c.execute("UPDATE users SET balance = balance + ? WHERE user_id = ?", (amount, user_id))
    conn.commit()
    conn.close()

def get_balance(user_id):
    conn = sqlite3.connect('bot.db')
    c = conn.cursor()
    c.execute("SELECT balance FROM users WHERE user_id = ?", (user_id,))
    result = c.fetchone()
    conn.close()
    return result[0] if result else 0

def add_referral(referrer_id, referred_id):
    conn = sqlite3.connect('bot.db')
    c = conn.cursor()
    c.execute("INSERT INTO referrals (referrer_id, referred_id) VALUES (?, ?)", (referrer_id, referred_id))
    conn.commit()
    conn.close()

def get_referral_count(user_id):
    conn = sqlite3.connect('bot.db')
    c = conn.cursor()
    c.execute("SELECT COUNT(*) FROM referrals WHERE referrer_id = ?", (user_id,))
    result = c.fetchone()
    conn.close()
    return result[0] if result else 0

def check_referral_exists(referred_id):
    conn = sqlite3.connect('bot.db')
    c = conn.cursor()
    c.execute("SELECT * FROM referrals WHERE referred_id = ?", (referred_id,))
    result = c.fetchone()
    conn.close()
    return result is not None

def add_withdrawal(user_id, amount, target):
    conn = sqlite3.connect('bot.db')
    c = conn.cursor()
    c.execute("INSERT INTO withdrawals (user_id, amount, target, status) VALUES (?, ?, ?, ?)", 
              (user_id, amount, target, 'pending'))
    conn.commit()
    conn.close()
# =============================

# ========== چک عضویت ==========
def is_user_in_channel(user_id, context):
    try:
        member = context.bot.get_chat_member(chat_id=CHANNEL_ID, user_id=user_id)
        return member.status in ['member', 'administrator', 'creator']
    except:
        return False

# ========== دکمه‌ها ==========
def get_main_menu():
    keyboard = [
        [InlineKeyboardButton("📊 موجودی", callback_data='balance')],
        [InlineKeyboardButton("🔗 لینک زیرمجموعه", callback_data='referral')],
        [InlineKeyboardButton("📋 تعداد زیرمجموعه‌ها", callback_data='count')],
        [InlineKeyboardButton("💸 برداشت", callback_data='withdraw')]
    ]
    return InlineKeyboardMarkup(keyboard)

def get_join_button():
    return InlineKeyboardMarkup([[InlineKeyboardButton("📢 عضویت در کانال", url=CHANNEL_LINK)]])

def get_back_menu():
    return InlineKeyboardMarkup([[InlineKeyboardButton("🔙 بازگشت به منو", callback_data='menu')]])

def get_confirm_menu():
    keyboard = [
        [InlineKeyboardButton("✅ تایید و ارسال", callback_data='confirm_withdraw')],
        [InlineKeyboardButton("❌ انصراف", callback_data='cancel_withdraw')]
    ]
    return InlineKeyboardMarkup(keyboard)
# =============================

# ========== استارت ==========
def start(update: Update, context):
    user = update.effective_user
    user_id = user.id
    ref_id = context.args[0] if context.args else None
    
    is_member = is_user_in_channel(user_id, context)
    if not is_member:
        update.message.reply_text(
            f"❌ برای استفاده از ربات، ابتدا در کانال عضو شوید:\n{CHANNEL_LINK}",
            reply_markup=get_join_button()
        )
        return
    
    add_user(user_id, ref_id)
    
    if ref_id and ref_id != str(user_id):
        is_new_member = is_user_in_channel(user_id, context)
        if is_new_member and not check_referral_exists(user_id):
            add_referral(int(ref_id), user_id)
            update_balance(int(ref_id), 100)
            try:
                context.bot.send_message(int(ref_id), f"🎉 +۱۰۰ داگز بخاطر عضو جدید!")
            except:
                pass
    
    update.message.reply_text(
        f"🐕 به ربات داگز خوش آمدید!",
        reply_markup=get_main_menu()
    )

# ========== دکمه‌های منو ==========
def button_handler(update: Update, context):
    query = update.callback_query
    user_id = query.from_user.id
    query.answer()
    
    print(f"🔘 کلیک شد: {query.data} از کاربر {user_id}")
    
    if query.data == 'menu':
        query.edit_message_text("🏠 منوی اصلی", reply_markup=get_main_menu())
        return
    
    is_member = is_user_in_channel(user_id, context)
    if not is_member:
        query.edit_message_text("❌ عضو کانال نیستید!", reply_markup=get_join_button())
        return
    
    if query.data == 'balance':
        balance = get_balance(user_id)
        query.edit_message_text(f"💰 موجودی: {balance} داگز", reply_markup=get_main_menu())
    
    elif query.data == 'referral':
        bot_username = context.bot.get_me().username
        ref_link = f"https://t.me/{bot_username}?start={user_id}"
        query.edit_message_text(
            f"🔗 لینک زیرمجموعه:\n`{ref_link}`\n\n✅ هر نفر = ۱۰۰ داگز",
            reply_markup=get_main_menu(),
            parse_mode='Markdown'
        )
    
    elif query.data == 'count':
        count = get_referral_count(user_id)
        query.edit_message_text(f"📋 تعداد زیرمجموعه‌ها: {count} نفر", reply_markup=get_main_menu())
    
    elif query.data == 'withdraw':
        balance = get_balance(user_id)
        if balance < 100:
            query.edit_message_text(
                f"❌ موجودی کمتر از ۱۰۰ داگز!\nموجودی: {balance}\nحداقل برداشت: ۱۰۰ داگز",
                reply_markup=get_main_menu()
            )
            return
        
        context.user_data['withdraw_step'] = 1
        query.edit_message_text(
            f"💸 **مرحله ۱ از ۳**\n\n"
            f"💰 موجودی قابل برداشت: **{balance} داگز**\n\n"
            f"📝 لطفاً **مبلغ** مورد نظر برای برداشت را وارد کنید:\n"
            f"مثال: `500`\n\n"
            f"⚠️ حداقل برداشت: ۱۰۰ داگز\n"
            f"برای لغو /cancel را بفرستید.",
            reply_markup=get_back_menu(),
            parse_mode='Markdown'
        )

# ========== دریافت پیام‌های متنی ==========
def handle_message(update: Update, context):
    user_id = update.effective_user.id
    text = update.message.text.strip()
    
    print(f"📥 پیام از {user_id}: {text}")
    
    step = context.user_data.get('withdraw_step')
    
    if step == 1:
        if not text.isdigit():
            update.message.reply_text(
                f"❌ **لطفاً یک عدد معتبر وارد کنید!**\n"
                f"مثال: `500`\n\n"
                f"برای لغو /cancel را بفرستید.",
                reply_markup=get_back_menu(),
                parse_mode='Markdown'
            )
            return
        
        amount = int(text)
        balance = get_balance(user_id)
        
        if amount < 100:
            update.message.reply_text(
                f"❌ **حداقل برداشت ۱۰۰ داگز است!**\n"
                f"مبلغ وارد شده: {amount} داگز\n\n"
                f"لطفاً دوباره وارد کنید.",
                reply_markup=get_back_menu()
            )
            return
        
        if amount > balance:
            update.message.reply_text(
                f"❌ **موجودی کافی نیست!**\n"
                f"💰 موجودی شما: {balance} داگز\n"
                f"📝 مبلغ درخواستی: {amount} داگز\n\n"
                f"لطفاً مبلغ کمتری وارد کنید.",
                reply_markup=get_back_menu()
            )
            return
        
        context.user_data['withdraw_amount'] = amount
        context.user_data['withdraw_step'] = 2
        
        update.message.reply_text(
            f"✅ **مبلغ تایید شد!**\n\n"
            f"💰 مبلغ برداشت: **{amount} داگز**\n\n"
            f"📤 **مرحله ۲ از ۳**\n"
            f"لطفاً **یوزرنیم** کاربر مقصد را وارد کنید:\n"
            f"مثال: `@username`\n\n"
            f"برای لغو /cancel را بفرستید.",
            reply_markup=get_back_menu(),
            parse_mode='Markdown'
        )
        return
    
    elif step == 2:
        if not text.startswith('@'):
            update.message.reply_text(
                f"❌ **یوزرنیم باید با @ شروع شود!**\n"
                f"مثال: `@username`\n\n"
                f"لطفاً دوباره وارد کنید.",
                reply_markup=get_back_menu(),
                parse_mode='Markdown'
            )
            return
        
        if len(text) < 2:
            update.message.reply_text(
                f"❌ **یوزرنیم نامعتبر!**",
                reply_markup=get_back_menu()
            )
            return
        
        context.user_data['target_username'] = text
        amount = context.user_data.get('withdraw_amount')
        context.user_data['withdraw_step'] = 3
        
        update.message.reply_text(
            f"💸 **مرحله ۳ از ۳ - تایید نهایی**\n\n"
            f"💰 مبلغ: **{amount} داگز**\n"
            f"📤 کاربر مقصد: {text}\n\n"
            f"آیا اطلاعات صحیح است؟",
            reply_markup=get_confirm_menu(),
            parse_mode='Markdown'
        )
        return
    
    else:
        update.message.reply_text(
            "❌ لطفاً از دکمه‌های منو استفاده کنید.",
            reply_markup=get_main_menu()
        )

# ========== دکمه‌های تایید برداشت ==========
def withdraw_confirm_handler(update: Update, context):
    query = update.callback_query
    user_id = query.from_user.id
    query.answer()
    
    print(f"🔘 کلیک تایید/انصراف: {query.data} از کاربر {user_id}")
    
    if query.data == 'cancel_withdraw':
        context.user_data.clear()
        query.edit_message_text("❌ برداشت لغو شد.", reply_markup=get_main_menu())
        return
    
    elif query.data == 'confirm_withdraw':
        target_username = context.user_data.get('target_username')
        amount = context.user_data.get('withdraw_amount')
        
        if not target_username or not amount:
            query.edit_message_text("❌ خطا! دوباره تلاش کنید.", reply_markup=get_main_menu())
            context.user_data.clear()
            return
        
        update_balance(user_id, -amount)
        balance = get_balance(user_id)
        add_withdrawal(user_id, amount, target_username)
        
        channel_msg = (
            f"🟢 **درخواست برداشت جدید**\n"
            f"━━━━━━━━━━━━━━━\n"
            f"👤 از کاربر: `{user_id}`\n"
            f"📤 به کاربر: {target_username}\n"
            f"💰 مبلغ: **{amount} داگز**\n"
            f"━━━━━━━━━━━━━━━\n"
            f"⏳ وضعیت: در انتظار تایید"
        )
        
        try:
            context.bot.send_message(CHANNEL_ID, channel_msg, parse_mode='Markdown')
            print(f"✅ پیام به کانال ارسال شد")
        except Exception as e:
            print(f"❌ خطا در ارسال به کانال: {e}")
        
        admin_msg = (
            f"🔔 **درخواست برداشت - نیاز به تایید**\n"
            f"━━━━━━━━━━━━━━━\n"
            f"👤 از: `{user_id}`\n"
            f"📤 به: {target_username}\n"
            f"💰 مبلغ: **{amount} داگز**\n"
            f"━━━━━━━━━━━━━━━\n"
            f"✅ مبلغ را به کاربر مقصد ارسال کنید.\n"
            f"⚠️ موجودی کاربر بعد از برداشت: {balance} داگز"
        )
        
        for admin_id in ADMIN_IDS:
            try:
                context.bot.send_message(admin_id, admin_msg, parse_mode='Markdown')
                print(f"✅ پیام به ادمین {admin_id} ارسال شد")
            except Exception as e:
                print(f"❌ خطا در ارسال به ادمین: {e}")
        
        query.edit_message_text(
            f"✅ **درخواست برداشت ارسال شد!**\n\n"
            f"💰 مبلغ: **{amount} داگز**\n"
            f"📤 به: {target_username}\n"
            f"💰 موجودی جدید: **{balance} داگز**\n\n"
            f"⏳ منتظر تایید مدیریت...",
            reply_markup=get_main_menu(),
            parse_mode='Markdown'
        )
        
        context.user_data.clear()

# ========== لغو ==========
def cancel(update: Update, context):
    context.user_data.clear()
    update.message.reply_text(
        "❌ عملیات لغو شد.",
        reply_markup=get_main_menu()
    )

# ========== اجرا ==========
def main():
    init_db()
    
    updater = Updater(BOT_TOKEN, use_context=True)
    dp = updater.dispatcher
    
    dp.add_handler(CommandHandler("start", start))
    dp.add_handler(CommandHandler("help", start))
    dp.add_handler(CommandHandler("cancel", cancel))
    
    dp.add_handler(CallbackQueryHandler(withdraw_confirm_handler, pattern='^(confirm_withdraw|cancel_withdraw)$'))
    dp.add_handler(CallbackQueryHandler(button_handler))
    dp.add_handler(MessageHandler(Filters.text & ~Filters.command, handle_message))
    
    print("=" * 50)
    print("🤖 ربات داگز روشن شد!")
    print(f"📢 کانال: {CHANNEL_ID}")
    print(f"👤 مدیران: {ADMIN_IDS}")
    print("=" * 50)
    
    updater.start_polling()
    updater.idle()

if __name__ == "__main__":
    main()