from rubka import Robot, Message
import requests
import jdatetime
import time
import re

bot = Robot(token="CDJDIE0KLEIPZMUZKOEINEORYHFUVDHQPMXQATBOWBTSUILEHHNJQCYYBTFJAXMB")
NAVASAN_API_KEY = "freeLbygOUAFpYaKKR09QPlMoM3iZkeh"

# ارزهای پشتیبانی‌شده (فقط تون، ترون، بیت‌کوین، دلار)
COINS = {
    "تون": "the-open-network", "ton": "the-open-network",
    "ترون": "tron", "trx": "tron",
    "بیت‌کوین": "bitcoin", "btc": "bitcoin",
    "دلار": "usd", "usd": "usd",
}

FA_NAMES = {
    "the-open-network": "تون",
    "tron": "ترون",
    "bitcoin": "بیت‌کوین",
    "usd": "دلار",
}

TOMAN_RATE_CACHE = None
TOMAN_RATE_TIME = 0

def get_toman_rate():
    global TOMAN_RATE_CACHE, TOMAN_RATE_TIME
    if TOMAN_RATE_CACHE and (time.time() - TOMAN_RATE_TIME) < 120:
        return TOMAN_RATE_CACHE
    try:
        url = f"http://api.navasan.tech/latest/?api_key={NAVASAN_API_KEY}&item=usd"
        data = requests.get(url, timeout=5).json()
        if "usd" in data and "value" in data["usd"]:
            TOMAN_RATE_CACHE = float(data["usd"]["value"])
            TOMAN_RATE_TIME = time.time()
            return TOMAN_RATE_CACHE
    except:
        pass
    return 70000  # نرخ پیش‌فرض در صورت قطعی

def get_price(coin_id):
    """دریافت قیمت از CoinGecko (برای تون، ترون، بیت‌کوین)"""
    if coin_id == "usd":
        return 1.0, 0.0  # قیمت دلار به خودش ۱ است
    try:
        url = f"https://api.coingecko.com/api/v3/simple/price?ids={coin_id}&vs_currencies=usd&include_24hr_change=true"
        data = requests.get(url, timeout=10).json()
        if coin_id in data:
            return data[coin_id]["usd"], data[coin_id].get("usd_24h_change", 0)
    except:
        pass
    return None, None

# ---------- توابع جدید برای استارز و پریمیوم تلگرام ----------
def get_telegram_stars_price(quantity=50):
    """
    دریافت قیمت استارز تلگرام از طریق API عمومی Fragment.
    quantity: تعداد استارز (پیش‌فرض ۵۰ عدد که مرجع قیمت‌گذاری است)
    خروجی: (قیمت به تون، قیمت به دلار) یا (None, None)
    """
    try:
        # استفاده از API عمومی Fragment (بدون نیاز به کلید)
        url = f"https://api.fragment.com/api/stars/price?quantity={quantity}"
        headers = {"User-Agent": "Mozilla/5.0"}
        resp = requests.get(url, headers=headers, timeout=10)
        if resp.status_code == 200:
            data = resp.json()
            # ساختار پاسخ ممکن است متفاوت باشد؛ معمولاً price_tom را برمی‌گرداند
            ton_price = data.get("price_ton") or data.get("price")
            if ton_price:
                # تبدیل تون به دلار با استفاده از قیمت لحظه‌ای تون
                ton_usd, _ = get_price("the-open-network")
                if ton_usd:
                    return float(ton_price), float(ton_price) * ton_usd
    except:
        pass
    # در صورت عدم دسترسی به API، از نرخ تقریبی استفاده می‌کنیم
    # هر ۵۰ استارز تقریباً ۰.۶۵ دلار (نرخ متغیر)
    return None, None

def get_telegram_premium_price(months=12):
    """
    دریافت قیمت اشتراک تلگرام پریمیوم برای مدت مشخص (۳، ۶ یا ۱۲ ماه).
    خروجی: (قیمت به تون، قیمت به دلار) یا (None, None)
    """
    try:
        url = f"https://api.fragment.com/api/premium/price?months={months}"
        headers = {"User-Agent": "Mozilla/5.0"}
        resp = requests.get(url, headers=headers, timeout=10)
        if resp.status_code == 200:
            data = resp.json()
            ton_price = data.get("price_ton") or data.get("price")
            if ton_price:
                ton_usd, _ = get_price("the-open-network")
                if ton_usd:
                    return float(ton_price), float(ton_price) * ton_usd
    except:
        pass
    # نرخ‌های تقریبی (بر اساس داده‌های تاریخی)
    fallback = {3: 5.7, 6: 7.61, 12: 13.8}  # به تون
    ton_price = fallback.get(months)
    if ton_price:
        ton_usd, _ = get_price("the-open-network")
        if ton_usd:
            return ton_price, ton_price * ton_usd
    return None, None

# ---------- تشخیص نوع کیف پول (فقط BTC, TRX, TON) ----------
def detect_wallet_type(address):
    address = address.strip()
    # بیت‌کوین: آدرس‌های Legacy (۱ یا ۳) و Bech32 (bc1)
    if re.match(r'^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$', address) or address.startswith('bc1'):
        return 'BTC'
    # ترون: شروع با T و طول ۳۴ کاراکتر
    if address.startswith('T') and len(address) == 34:
        return 'TRX'
    # تون: شروع با EQ یا UQ و طول بین ۴۰ تا ۶۰ کاراکتر
    if address.startswith(('EQ', 'UQ')) and 40 <= len(address) <= 60:
        return 'TON'
    return None

# ---------- بررسی موجودی کیف پول ----------
async def check_wallet_balance(message, address, coin_type):
    toman_rate = get_toman_rate()
    
    if coin_type == 'BTC':
        try:
            url = f"https://blockchain.info/q/addressbalance/{address}"
            data = requests.get(url, timeout=10).text
            balance = int(data) / 1e8
            price_usd, _ = get_price("bitcoin")
            total_usd = balance * price_usd if price_usd else 0
            total_toman = total_usd * toman_rate
            output = (
                f"╕ 💰 کیف پول بیت‌کوین\n"
                f"╡ 🪙 BTC: {balance:.8f}\n"
                f"╡ 🇺🇸 ${total_usd:,.2f} دلار\n"
                f"╡ 🇮🇷 {total_toman:,.0f} تومان\n"
                f"╛ 📅 {jdatetime.datetime.now().strftime('%Y/%m/%d | %H:%M')}"
            )
            await message.reply(output)
        except Exception as e:
            await message.reply(f"❌ خطا: {str(e)}")
    
    elif coin_type == 'TRX':
        try:
            # دریافت موجودی TRX
            url_trx = f"https://api.trongrid.io/v1/accounts/{address}"
            data = requests.get(url_trx, timeout=10).json()
            trx = data["data"][0].get("balance", 0) / 1e6 if data.get("data") else 0
            # دریافت موجودی توکن‌های TRC20 (فقط USDT برای نمایش)
            url_usdt = f"https://api.trongrid.io/v1/accounts/{address}/tokens"
            data = requests.get(url_usdt, timeout=10).json()
            usdt = 0
            if data.get("data"):
                for token in data["data"]:
                    if token.get("symbol") == "USDT":
                        usdt = token.get("balance", 0) / 1e6
                        break
            trx_price, _ = get_price("tron")
            usdt_price = 1.0  # تتر تقریباً برابر دلار
            total_usd = (trx * trx_price) + (usdt * usdt_price) if trx_price else 0
            total_toman = total_usd * toman_rate
            output = (
                f"╕ 💰 کیف پول ترون\n"
                f"╡ 🪙 TRX: {trx:.6f}\n"
                f"╡ 🪙 USDT: {usdt:.2f}\n"
                f"╡ 🇺🇸 ${total_usd:,.2f} دلار\n"
                f"╡ 🇮🇷 {total_toman:,.0f} تومان\n"
                f"╛ 📅 {jdatetime.datetime.now().strftime('%Y/%m/%d | %H:%M')}"
            )
            await message.reply(output)
        except Exception as e:
            await message.reply(f"❌ خطا در دریافت موجودی ترون: {str(e)}")
    
    elif coin_type == 'TON':
        try:
            url = f"https://toncenter.com/api/v2/getAddressBalance?address={address}"
            data = requests.get(url, timeout=10).json()
            balance = int(data.get('result', 0)) / 1e9
            price_usd, _ = get_price("the-open-network")
            total_usd = balance * price_usd if price_usd else 0
            total_toman = total_usd * toman_rate
            output = (
                f"╕ 💰 کیف پول تون\n"
                f"╡ 🪙 TON: {balance:.4f}\n"
                f"╡ 🇺🇸 ${total_usd:,.2f} دلار\n"
                f"╡ 🇮🇷 {total_toman:,.0f} تومان\n"
                f"╛ 📅 {jdatetime.datetime.now().strftime('%Y/%m/%d | %H:%M')}"
            )
            await message.reply(output)
        except Exception as e:
            await message.reply(f"❌ خطا در دریافت موجودی تون: {str(e)}")
    
    else:
        await message.reply(f"❌ پشتیبانی از {coin_type} فعال نیست.")

# ---------- هندلر اصلی ----------
@bot.on_message()
async def handle_message(bot: Robot, message: Message):
    text = message.text.strip() if message.text else ''
    
    # ===== پیام خوش‌آمدگویی =====
    if text.lower() in ["/start", "start", "استارت", "شروع", "سلام", "hi", "hello"]:
        welcome_msg = (
            "👋 **به ربات قیمت ارز و خدمات تلگرام خوش آمدید!**\n\n"
            "💰 با این ربات می‌تونید:\n"
            "✅ قیمت لحظه‌ای تون، ترون، بیت‌کوین و دلار رو ببینید\n"
            "✅ قیمت استارز تلگرام و اشتراک پریمیوم رو دریافت کنید\n"
            "✅ موجودی کیف پول‌های بیت‌کوین، ترون و تون رو بررسی کنید\n\n"
            "📌 **ارزها و خدمات پشتیبانی‌شده:**\n"
            "• تون (ton)\n"
            "• ترون (trx)\n"
            "• بیت‌کوین (btc)\n"
            "• دلار (usd)\n"
            "• استارز تلگرام (stars)\n"
            "• تلگرام پریمیوم (premium)\n\n"
            "📌 **کیف پول‌های پشتیبانی‌شده:**\n"
            "• بیت‌کوین (شروع با 1, 3, bc1)\n"
            "• ترون (شروع با T)\n"
            "• تون (شروع با EQ یا UQ)\n\n"
            "🔹 **نحوه استفاده:**\n"
            "• برای قیمت: فقط اسم ارز رو بنویسید (مثلاً `ton` یا `btc`)\n"
            "• برای استارز: کلمه `stars` را بفرستید\n"
            "• برای پریمیوم: کلمه `premium` را بفرستید\n"
            "• برای موجودی: آدرس کیف پول رو بفرستید\n\n"
            "🔥 **نرخ تومان لحظه‌ای از بازار آزاد دریافت میشه!**\n"
            "⏰ تاریخ شمسی نیز در پاسخ‌ها درج شده.\n\n"
            "🧡 موفق باشید!"
        )
        await message.reply(welcome_msg)
        return
    
    # ===== تشخیص کیف پول =====
    coin_type = detect_wallet_type(text)
    if coin_type:
        await check_wallet_balance(message, text, coin_type)
        return
    
    # ===== تشخیص قیمت ارزهای معمولی =====
    coin_id = COINS.get(text.lower())
    if coin_id:
        price_usd, change_24h = get_price(coin_id)
        if price_usd is None:
            await message.reply("❌ خطا در دریافت قیمت")
            return
        
        toman_rate = get_toman_rate()
        price_toman = price_usd * toman_rate
        change_toman = (change_24h / 100) * price_usd * toman_rate
        
        fa_name = FA_NAMES.get(coin_id, coin_id.capitalize())
        now = jdatetime.datetime.now()
        shamsi_date = now.strftime("%Y/%m/%d | %H:%M")
        
        change_sign = "📈" if change_24h >= 0 else "📉"
        change_str = f"{change_sign} {change_24h:+.2f}%"
        change_price_str = f"{change_toman:+,.0f} تومان"
        
        output = (
            f"╕ 💰 1 {fa_name} ({coin_id.capitalize()})\n"
            f"╡ 🇺🇸 ${price_usd:,.3f} دلار\n"
            f"╡ 🇮🇷 {price_toman:,.0f} تومان\n"
            f"╡ {change_str}\n"
            f"╛ 🔻 {change_price_str}\n"
            f"\n{shamsi_date}"
        )
        await message.reply(output)
        return
    
    # ===== قیمت استارز تلگرام =====
    if text.lower() in ["stars", "استارز", "ستاره", "telegram stars"]:
        ton_price, usd_price = get_telegram_stars_price(50)  # مرجع ۵۰ استارز
        if ton_price is None:
            await message.reply("❌ خطا در دریافت قیمت استارز. لطفاً بعداً تلاش کنید.")
            return
        
        toman_rate = get_toman_rate()
        toman_price = usd_price * toman_rate
        now = jdatetime.datetime.now().strftime('%Y/%m/%d | %H:%M')
        
        output = (
            f"╕ ⭐ قیمت استارز تلگرام (۵۰ عدد)\n"
            f"╡ 🪙 {ton_price:.4f} TON\n"
            f"╡ 🇺🇸 ${usd_price:,.2f} دلار\n"
            f"╡ 🇮🇷 {toman_price:,.0f} تومان\n"
            f"╛ 📅 {now}"
        )
        await message.reply(output)
        return
    
    # ===== قیمت تلگرام پریمیوم =====
    if text.lower() in ["premium", "پریمیوم", "تلگرام پریمیوم", "telegram premium"]:
        lines = ["╕ 💎 قیمت اشتراک تلگرام پریمیوم"]
        toman_rate = get_toman_rate()
        for months in [3, 6, 12]:
            ton_price, usd_price = get_telegram_premium_price(months)
            if ton_price and usd_price:
                toman_price = usd_price * toman_rate
                lines.append(
                    f"╡ 📅 {months} ماه:\n"
                    f"╡   🪙 {ton_price:.4f} TON\n"
                    f"╡   🇺🇸 ${usd_price:,.2f}\n"
                    f"╡   🇮🇷 {toman_price:,.0f} تومان"
                )
        now = jdatetime.datetime.now().strftime('%Y/%m/%d | %H:%M')
        lines.append(f"╛ 📅 {now}")
        await message.reply("\n".join(lines))
        return
    
    # ===== پیام راهنما در صورت عدم تطابق =====
    await message.reply(
        "❌ ارز یا آدرس نامعتبر.\n\n"
        "📌 برای قیمت ارز:\n"
        "ton, trx, btc, usd\n\n"
        "📌 برای خدمات تلگرام:\n"
        "stars (استارز)\n"
        "premium (پریمیوم)\n\n"
        "📌 برای موجودی کیف پول:\n"
        "آدرس بیت‌کوین (1,3,bc1)\n"
        "آدرس ترون (T...)\n"
        "آدرس تون (EQ... یا UQ...)"
    )

print("✅ ربات روبیکا روشن شد...")
bot.run()