import asyncio
import requests
from bs4 import BeautifulSoup
from telegram import Bot
import re

# ─── پیکربندی ────────────────────────────────────────────────────────────────

BOT_TOKEN        = "7822307770:AAFOPReDk2Z0EGsNdjJYmUDHcay62IsT65Q"
CHANNEL_USERNAME = "@havale_live"
SOURCE_CHANNEL   = "ttprice"
ADMIN_ID         = "havale_live_support"
IMAGE_PATH       = "post-payment1.jpg"
COUNTER_FILE     = "send_counter.txt"
IMAGE_EVERY      = 3        # هر چند پیام یک بار عکس بفرست

SEPARATOR = "━━━━━━━━━━━━━━━"

def read_counter():
    try:
        return int(open(COUNTER_FILE).read().strip())
    except:
        return 0

def write_counter(n):
    with open(COUNTER_FILE, "w") as f:
        f.write(str(n))

# ─── دریافت پست ──────────────────────────────────────────────────────────────

def fetch_latest_post():
    url = f"https://t.me/s/{SOURCE_CHANNEL}"
    try:
        page = requests.get(url, timeout=10)
        page.raise_for_status()
        soup = BeautifulSoup(page.text, "html.parser")
        all_posts = soup.find_all("div", {"class": "tgme_widget_message_text"})
        return all_posts[-1].text.strip() if all_posts else None
    except Exception as e:
        print("❌ خطا:", e)
        return None

# ─── استخراج داده ────────────────────────────────────────────────────────────

def extract_price(text, pattern):
    match = re.search(pattern, text)
    return match.group(1).replace(",", "") if match else ""

def extract_block(text, pattern):
    return re.findall(pattern, text)

def extract_section(text, title, next_title=None):
    try:
        start = text.index(title)
        end   = text.index(next_title, start) if next_title else len(text)
        return text[start:end].strip()
    except ValueError:
        return ""

def parse_tether_rows(block):
    # فرمت: 158,008 ▫️|158,009 ▪️|اکسیر158,700 ...  (بدون newline بین ردیف‌ها)
    pattern = r"([\d,]+)\s*[▫️▪️]+\s*\|\s*([\d,]+)\s*[▫️▪️]+\s*\|([^\d▫▪|ـ]+)"
    rows = []
    for buy, sell, name in re.findall(pattern, block):
        name = name.strip()
        if name:
            rows.append((name, buy.replace(",", ""), sell.replace(",", "")))
    return rows

def extract_all(text):
    time_match = re.search(r"📅\s*(.*?)\s*ساعت\s*([\d:]+)", text)
    datetime_str = (
        f"{time_match.group(1)} ساعت {time_match.group(2)}"
        if time_match else ""
    )

    tether_block = extract_section(text, "💵 تتر USDT (صرافی های ایرانی)", "🇺🇸")

    return {
        "datetime":   datetime_str,
        "dollar":     extract_price(text, r"قیمت دلار آزاد\s*:\s*([\d,]+)"),
        "btc":        extract_price(text, r"بیتکوین\s*:\s*([\d,.]+)"),
        "eth":        extract_price(text, r"اتریوم\s*:\s*([\d,.]+)"),
        "sol":        extract_price(text, r"سولانا\s*:\s*([\d,.]+)"),
        "trx":        extract_price(text, r"ترون\s*:\s*([\d,.]+)"),
        "tether":     parse_tether_rows(tether_block),
        "currencies": extract_block(text, r"(🇺🇸[^\n:]+|🇪🇺[^\n:]+|🇬🇧[^\n:]+|🇦🇪[^\n:]+|🇹🇷[^\n:]+|🇨🇦[^\n:]+|🇨🇳[^\n:]+|🇷🇺[^\n:]+|🇦🇺[^\n:]+)\s*:\s*([\d,]+)"),
        "coins":      extract_block(text, r"(🌕[^\n:]+)\s*:\s*([\d,]+)"),
        "gold":       extract_block(text, r"(〽️[^\n:]+)\s*:\s*([\d,.]+(?:\s*دلار)?)"),
    }

# ─── ابزارهای فرمت‌بندی ──────────────────────────────────────────────────────

def fmt(n):
    """اضافه کردن جداکننده هزارگان به عدد صحیح"""
    return f"{int(n):,}" if n and n.isdigit() else n

def fmt_crypto(n):
    """فرمت عدد کریپتو — صحیح یا اعشاری"""
    if not n:
        return "—"
    try:
        f = float(n.replace(",", ""))
        return f"{int(f):,}" if f == int(f) else str(f)
    except ValueError:
        return n

def display_width(s):
    """
    محاسبه عرض نمایشی در فونت monospace تلگرام.
    - variation selector  → صفر
    - پرچم (دو regional indicator) → ۲
    - بقیه emoji / unicode > 0x2000 → ۲
    - ASCII و فارسی → ۱
    """
    w, i = 0, 0
    while i < len(s):
        cp = ord(s[i])
        if 0xFE00 <= cp <= 0xFE0F:       # variation selector
            i += 1; continue
        if 0x1F1E0 <= cp <= 0x1F1FF:     # پرچم (دو کاراکتر)
            w += 2; i += 2; continue
        w += 2 if cp >= 0x2000 else 1
        i += 1
    return w

def rpad(s, width):
    """چپ‌چین: پد از راست تا عرض مشخص"""
    return s + " " * max(0, width - display_width(s))

def lpad(s, width):
    """راست‌چین: پد از چپ تا عرض مشخص"""
    return " " * max(0, width - display_width(s)) + s

def code_block(lines):
    return "\n".join(lines)

# ─── سازنده‌های جدول ─────────────────────────────────────────────────────────

def tether_table(rows):
    """جدول صرافی‌های تتر: خرید چپ‌چین | فروش چپ‌چین | نام صرافی"""
    BUY_W = SELL_W = 16
    lines = [rpad("📉 خرید", BUY_W) + rpad("📈 فروش", SELL_W) + "🔁 صرافی"]
    for name, buy, sell in rows:
        lines.append(rpad("▫️ " + fmt(buy), BUY_W) + rpad(fmt(sell), SELL_W) + name)
    return code_block(lines)

def price_table(items):
    """جدول قیمت: برچسب چپ‌چین | قیمت راست‌چین"""
    if not items:
        return ""
    label_w = max(display_width(l.strip()) for l, _ in items) + 2
    price_w = max(display_width(p)         for _, p in items) + 1
    lines = [rpad(l.strip(), label_w) + lpad(p, price_w) for l, p in items]
    return code_block(lines)

# ─── ساخت پیام نهایی ─────────────────────────────────────────────────────────

def format_post(data):
    lines = []

    # تاریخ و زمان
    lines += [f"📅 {data['datetime']}", SEPARATOR]

    # نرخ ارز دیجیتال
    lines += [
        "💸 نرخ ارز دیجیتال\n",
        f"💲 دلار آزاد:   {fmt(data['dollar'])} تومان",
        f"🟡 بیت‌کوین:    {fmt_crypto(data['btc'])} USDT",
        f"🔷 اتریوم:      {fmt_crypto(data['eth'])} USDT",
        f"🟣 سولانا:      {fmt_crypto(data['sol'])} USDT",
        f"🔴 ترون:        {fmt_crypto(data['trx'])} USDT",
        SEPARATOR,
    ]

    # تتر صرافی‌های ایرانی
    lines += [
        "💵 تتر USDT (صرافی های ایرانی)\n",
        tether_table(data["tether"]),
        SEPARATOR,
    ]

    # قیمت ارز در بازار آزاد
    lines += ["💱 قیمت ارز در بازار آزاد", price_table(data["currencies"]), SEPARATOR]

    # قیمت سکه
    lines += ["🪙 قیمت سکه در بازار", price_table(data["coins"]), SEPARATOR]

    # قیمت طلا
    lines += ["💰 قیمت طلا", price_table(data["gold"]), SEPARATOR]

    # تبلیغ و لینک ادمین
    lines.append(
        f'<a href="https://t.me/{ADMIN_ID}"><b>'
        "🚀  خدمات پرداخت انتقال و نقد کردن درآمد ارزی "
        "برای فریلنسرها و کسب‌وکارها سریع امن و بدون دردسر"
        "</b></a>"
    )
    lines.append(f'\u200e👨‍💼 <a href="https://t.me/{ADMIN_ID}">@{ADMIN_ID}</a>')
    lines.append(f"\n📢 {CHANNEL_USERNAME}")

    return "\n".join(lines)

# ─── اجرا ────────────────────────────────────────────────────────────────────

async def main():
    bot  = Bot(token=BOT_TOKEN)
    text = fetch_latest_post()
    if not text:
        print("❌ پستی پیدا نشد.")
        return

    data       = extract_all(text)
    final_text = format_post(data)

    counter = read_counter() + 1
    write_counter(counter)

    if IMAGE_PATH and counter % IMAGE_EVERY == 0:
        photo_caption = (
            f'<a href="https://t.me/{ADMIN_ID}"><b>'
            "🚀  خدمات پرداخت آنلاین، انتقال و نقد کردن درآمد ارزی "
            "برای فریلنسرها و کسب‌وکارها. سریع امن و بدون دردسر"
            "</b></a>"
            f"\n\u200e👨‍💼 @{ADMIN_ID}"
            f"\n\n📢 {CHANNEL_USERNAME}"
        )
        with open(IMAGE_PATH, "rb") as img:
            await bot.send_photo(
                chat_id=CHANNEL_USERNAME,
                photo=img,
                caption=photo_caption,
                parse_mode="HTML",
            )

    await bot.send_message(
        chat_id=CHANNEL_USERNAME,
        text=final_text,
        parse_mode="HTML",
        disable_web_page_preview=True,
    )

    print("✅ پست با موفقیت ارسال شد.")

if __name__ == "__main__":
    asyncio.run(main())
