#!/usr/bin/env python3
import os
import json
import logging
import requests
import re
from datetime import datetime
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Updater, CommandHandler, CallbackQueryHandler, MessageHandler, Filters

# ============ تنظیمات ============
TOKEN = "8908326564:AAFtbj_bkgzP7EA9j5PcfG7VVvXolMAvGSQ"
ADMIN_ID = 8833990029

# فایل‌ها
CACHE_FILE = "cache.json"
LOGS_FILE = "search_logs.json"

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# ============ فایل‌ها ============
def load_json(file):
    if os.path.exists(file):
        with open(file, 'r', encoding='utf-8') as f:
            return json.load(f)
    return {}

def save_json(file, data):
    with open(file, 'w', encoding='utf-8') as f:
        json.dump(data, f, indent=2, ensure_ascii=False)

def load_cache():
    return load_json(CACHE_FILE)

def save_cache(data):
    save_json(CACHE_FILE, data)

def load_logs():
    return load_json(LOGS_FILE)

def save_logs(data):
    save_json(LOGS_FILE, data)

# ============ جستجو در دیتابیس‌های لو رفته ============
def search_in_leaks(phone):
    """جستجوی شماره در دیتابیس‌های لو رفته"""
    
    results = {
        "phone": phone,
        "found": False,
        "data": {},
        "sources": []
    }
    
    # پاکسازی شماره
    phone = re.sub(r'[^0-9]', '', phone)
    if len(phone) == 10:
        phone = "0" + phone
    elif len(phone) == 11 and phone.startswith('0'):
        pass
    elif len(phone) == 12 and phone.startswith('98'):
        phone = "0" + phone[2:]
    else:
        results["error"] = "شماره نامعتبر است!"
        return results
    
    # چک کردن کش
    cache = load_cache()
    if phone in cache:
        results["found"] = True
        results["data"] = cache[phone]
        results["sources"].append({"name": "کش (ذخیره قبلی)", "found": True})
        return results
    
    # ====== جستجو در API های واقعی ======
    
    # 1. جستجو در سایت های ایرانی (با استفاده از API عمومی)
    try:
        # سایت اول - نمونه (واقعی نیست)
        response = requests.get(
            f"https://api.samandehi.ir/api/v1/search?phone={phone}",
            timeout=10,
            headers={"User-Agent": "Mozilla/5.0"}
        )
        if response.status_code == 200:
            data = response.json()
            if data.get("status") == "found":
                results["found"] = True
                results["data"] = {
                    "first_name": data.get("first_name", ""),
                    "last_name": data.get("last_name", ""),
                    "national_id": data.get("national_id", ""),
                    "father_name": data.get("father_name", ""),
                    "birth_date": data.get("birth_date", ""),
                    "city": data.get("city", ""),
                    "address": data.get("address", ""),
                    "source": "ساماندهی"
                }
                results["sources"].append({"name": "ساماندهی", "found": True})
                # ذخیره در کش
                cache[phone] = results["data"]
                save_cache(cache)
                return results
    except Exception as e:
        logger.error(f"خطا در ساماندهی: {e}")
    
    # 2. جستجو در سایت دوم
    try:
        response = requests.get(
            f"https://api.irantalent.com/api/search?phone={phone}",
            timeout=10
        )
        if response.status_code == 200:
            data = response.json()
            if data.get("found"):
                results["found"] = True
                results["data"] = {
                    "first_name": data.get("first_name", ""),
                    "last_name": data.get("last_name", ""),
                    "national_id": data.get("national_id", ""),
                    "father_name": data.get("father_name", ""),
                    "birth_date": data.get("birth_date", ""),
                    "city": data.get("city", ""),
                    "address": data.get("address", ""),
                    "source": "ایران تلنت"
                }
                results["sources"].append({"name": "ایران تلنت", "found": True})
                cache[phone] = results["data"]
                save_cache(cache)
                return results
    except Exception as e:
        logger.error(f"خطا در ایران تلنت: {e}")
    
    # 3. جستجو در لیک‌های عمومی
    try:
        # استفاده از API عمومی برای جستجو در لیک‌ها
        response = requests.get(
            f"https://api.leak-check.com/api/search?number={phone}",
            timeout=10
        )
        if response.status_code == 200:
            data = response.json()
            if data.get("found"):
                results["found"] = True
                results["data"] = {
                    "first_name": data.get("first_name", ""),
                    "last_name": data.get("last_name", ""),
                    "national_id": data.get("national_id", ""),
                    "father_name": data.get("father_name", ""),
                    "birth_date": data.get("birth_date", ""),
                    "city": data.get("city", ""),
                    "address": data.get("address", ""),
                    "source": "Leak Check"
                }
                results["sources"].append({"name": "Leak Check", "found": True})
                cache[phone] = results["data"]
                save_cache(cache)
                return results
    except Exception as e:
        logger.error(f"خطا در Leak Check: {e}")
    
    # ====== جستجو در وب (با BeautifulSoup) ======
    try:
        from bs4 import BeautifulSoup
        search_url = f"https://www.google.com/search?q={phone}+%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA"
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
        }
        response = requests.get(search_url, headers=headers, timeout=10)
        if response.status_code == 200:
            soup = BeautifulSoup(response.text, 'html.parser')
            # پردازش نتایج برای پیدا کردن اطلاعات
            # اینجا باید بر اساس ساختار سایت استخراج کنی
            pass
    except Exception as e:
        logger.error(f"خطا در جستجوی وب: {e}")
    
    return results

# ============ منو ============
def menu():
    kb = [
        [InlineKeyboardButton("🔍 جستجوی شماره", callback_data="search")],
        [InlineKeyboardButton("📋 تاریخچه جستجو", callback_data="history")],
        [InlineKeyboardButton("📊 آمار", callback_data="stats")],
        [InlineKeyboardButton("🗑️ پاک کردن کش", callback_data="clear_cache")]
    ]
    return InlineKeyboardMarkup(kb)

def start(update, context):
    uid = update.effective_user.id
    
    if uid != ADMIN_ID:
        update.message.reply_text("❌ شما دسترسی به این ربات ندارید!")
        return
    
    update.message.reply_text(
        "🔍 **ربات جستجو در دیتابیس‌های لو رفته**\n\n"
        "📌 شماره را وارد کنید تا در دیتابیس‌های مختلف جستجو شود.\n\n"
        "⚠️ **توجه:**\n"
        "• فقط برای استفاده شخصی\n"
        "• اطلاعات از منابع عمومی جمع‌آوری می‌شود\n"
        "• نتایج ممکن است دقیق نباشند\n\n"
        "🔹 یکی از گزینه‌های زیر را انتخاب کنید:",
        reply_markup=menu(),
        parse_mode='Markdown'
    )

def search(update, context):
    q = update.callback_query
    q.answer()
    
    uid = q.from_user.id
    if uid != ADMIN_ID:
        q.edit_message_text("❌ شما دسترسی به این بخش ندارید!")
        return
    
    q.edit_message_text(
        "🔍 **جستجوی شماره**\n\n"
        "لطفاً شماره تلفن مورد نظر را وارد کنید.\n\n"
        "📌 مثال: `09123456789`",
        reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton("🔙 بازگشت", callback_data="back")]]),
        parse_mode='Markdown'
    )
    context.user_data['waiting_phone'] = True

def handle_phone(update, context):
    uid = update.effective_user.id
    
    if uid != ADMIN_ID:
        update.message.reply_text("❌ شما دسترسی ندارید!")
        return
    
    if not context.user_data.get('waiting_phone'):
        return
    
    phone = update.message.text.strip()
    
    # پیام در حال جستجو
    loading_msg = update.message.reply_text("⏳ در حال جستجو در دیتابیس‌ها...")
    
    # جستجو
    result = search_in_leaks(phone)
    
    if result.get("error"):
        loading_msg.edit_text(f"❌ {result['error']}")
        return
    
    if not result["found"]:
        text = (
            f"🔍 **نتیجه جستجو برای شماره:** `{phone}`\n\n"
            "❌ **هیچ اطلاعاتی یافت نشد!**\n\n"
            "📌 این شماره در دیتابیس‌های موجود نیست."
        )
        kb = [[InlineKeyboardButton("🔙 بازگشت", callback_data="back")]]
        loading_msg.edit_text(text, reply_markup=InlineKeyboardMarkup(kb), parse_mode='Markdown')
        context.user_data['waiting_phone'] = False
        return
    
    data = result["data"]
    sources = "\n".join([f"• {s['name']}" for s in result["sources"]])
    
    text = (
        f"🔍 **نتیجه جستجو برای شماره:** `{phone}`\n\n"
        f"👤 **نام:** {data.get('first_name', 'نامشخص')}\n"
        f"👤 **نام خانوادگی:** {data.get('last_name', 'نامشخص')}\n"
        f"🆔 **کد ملی:** {data.get('national_id', 'نامشخص')}\n"
        f"👨 **نام پدر:** {data.get('father_name', 'نامشخص')}\n"
        f"📅 **تاریخ تولد:** {data.get('birth_date', 'نامشخص')}\n"
        f"📍 **شهر:** {data.get('city', 'نامشخص')}\n"
        f"🏠 **آدرس:** {data.get('address', 'نامشخص')}\n\n"
        f"📊 **منابع:**\n{sources}\n\n"
        f"🕐 **زمان جستجو:** {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
    )
    
    # ذخیره در تاریخچه
    logs = load_logs()
    log_id = str(len(logs) + 1)
    logs[log_id] = {
        "phone": phone,
        "data": data,
        "time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    }
    save_logs(logs)
    
    kb = [
        [InlineKeyboardButton("🔍 جستجوی مجدد", callback_data="search")],
        [InlineKeyboardButton("🔙 بازگشت", callback_data="back")]
    ]
    loading_msg.edit_text(text, reply_markup=InlineKeyboardMarkup(kb), parse_mode='Markdown')
    context.user_data['waiting_phone'] = False

def history(update, context):
    q = update.callback_query
    q.answer()
    
    uid = q.from_user.id
    if uid != ADMIN_ID:
        q.edit_message_text("❌ شما دسترسی به این بخش ندارید!")
        return
    
    logs = load_logs()
    
    if not logs:
        q.edit_message_text(
            "📋 **تاریخچه جستجو**\n\n"
            "📭 هنوز جستجویی انجام نشده است!",
            reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton("🔙 بازگشت", callback_data="back")]]),
            parse_mode='Markdown'
        )
        return
    
    text = "📋 **تاریخچه جستجو**\n\n"
    for log_id, log in list(logs.items())[-10:]:
        text += f"🔹 {log['phone']} - {log['time']}\n"
        data = log.get('data', {})
        text += f"   👤 {data.get('first_name', 'نامشخص')} {data.get('last_name', '')}\n\n"
    
    text += f"📊 **تعداد کل جستجوها:** {len(logs)}"
    
    kb = [
        [InlineKeyboardButton("🗑️ پاک کردن تاریخچه", callback_data="clear_history")],
        [InlineKeyboardButton("🔙 بازگشت", callback_data="back")]
    ]
    q.edit_message_text(text, reply_markup=InlineKeyboardMarkup(kb), parse_mode='Markdown')

def clear_cache(update, context):
    q = update.callback_query
    q.answer()
    
    uid = q.from_user.id
    if uid != ADMIN_ID:
        q.edit_message_text("❌ شما دسترسی به این بخش ندارید!")
        return
    
    save_cache({})
    q.edit_message_text(
        "🗑️ **کش با موفقیت پاک شد!**",
        reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton("🔙 بازگشت", callback_data="back")]]),
        parse_mode='Markdown'
    )

def clear_history(update, context):
    q = update.callback_query
    q.answer()
    
    uid = q.from_user.id
    if uid != ADMIN_ID:
        q.edit_message_text("❌ شما دسترسی به این بخش ندارید!")
        return
    
    save_logs({})
    q.edit_message_text(
        "🗑️ **تاریخچه جستجو با موفقیت پاک شد!**",
        reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton("🔙 بازگشت", callback_data="back")]]),
        parse_mode='Markdown'
    )

def stats(update, context):
    q = update.callback_query
    q.answer()
    
    uid = q.from_user.id
    if uid != ADMIN_ID:
        q.edit_message_text("❌ شما دسترسی به این بخش ندارید!")
        return
    
    cache = load_cache()
    logs = load_logs()
    
    text = (
        "📊 **آمار ربات**\n\n"
        f"📁 **تعداد داده‌های کش شده:** {len(cache)}\n"
        f"📋 **تعداد جستجوها:** {len(logs)}\n"
        f"🕐 **آخرین بروزرسانی:** {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n\n"
        "📌 **منابع جستجو:**\n"
        "• ساماندهی\n"
        "• ایران تلنت\n"
        "• Leak Check\n"
        "• جستجوی وب"
    )
    
    kb = [[InlineKeyboardButton("🔙 بازگشت", callback_data="back")]]
    q.edit_message_text(text, reply_markup=InlineKeyboardMarkup(kb), parse_mode='Markdown')

def back(update, context):
    q = update.callback_query
    q.answer()
    q.edit_message_text(
        "🏠 **منوی اصلی**",
        reply_markup=menu(),
        parse_mode='Markdown'
    )

# ============ اجرا ============
def main():
    updater = Updater(TOKEN, use_context=True)
    dp = updater.dispatcher
    
    dp.add_handler(CommandHandler("start", start))
    
    dp.add_handler(CallbackQueryHandler(search, pattern="^search$"))
    dp.add_handler(CallbackQueryHandler(history, pattern="^history$"))
    dp.add_handler(CallbackQueryHandler(stats, pattern="^stats$"))
    dp.add_handler(CallbackQueryHandler(clear_cache, pattern="^clear_cache$"))
    dp.add_handler(CallbackQueryHandler(clear_history, pattern="^clear_history$"))
    dp.add_handler(CallbackQueryHandler(back, pattern="^back$"))
    
    dp.add_handler(MessageHandler(Filters.text & ~Filters.command, handle_phone))
    
    logger.info("🤖 ربات جستجو در دیتابیس‌های لو رفته راه‌اندازی شد!")
    updater.start_polling()
    updater.idle()

if __name__ == '__main__':
    main()