from telethon import Button
from database import get_settings

STATUS_FA = {
    'pending': '⏳ در انتظار', 'processing': '⚙️ در حال پردازش',
    'completed': '✅ تکمیل شده', 'failed': '❌ ناموفق', 'canceled': '🚫 لغو شده',
}


# استایل رنگی دکمه‌ها: Telegram از سه استایل primary/success/danger پشتیبانی می‌کند.
# برای اینکه لازم نباشد همه‌ی Button.inline های پروژه دستی تغییر کنند،
# یک لایه‌ی مرکزی روی Button.inline قرار می‌دهیم.
_ORIGINAL_INLINE = Button.inline


def _button_style(text, data):
    label = str(text or '').lower()
    danger_words = ('حذف', 'لغو', 'پاک', 'ریست', 'مسدود', 'رد ', 'ردکرد', 'بستن', 'کاهش')
    success_words = ('تایید', 'تأیید', 'ثبت', 'خرید', 'پرداخت', 'شارژ', 'افزایش', 'ادامه', 'ارسال', 'ذخیره', 'فعال')
    if any(word in label for word in danger_words):
        return 'danger'
    if any(word in label for word in success_words):
        return 'success'
    return 'primary'


def _styled_inline(text, data=None, style=None, icon=None):
    # اگر جایی استایل صریح داده شد، همان را نگه می‌داریم؛ در غیر این صورت
    # بر اساس متن دکمه یکی از رنگ‌های استاندارد Telegram انتخاب می‌شود.
    if style is None:
        style = _button_style(text, data)
    return _ORIGINAL_INLINE(text, data, style=style, icon=icon)


Button.inline = staticmethod(_styled_inline)


def main_menu():
    s = get_settings(['btn_shop', 'btn_guide', 'btn_support', 'btn_account', 'btn_track', 'btn_referral'])
    return [
        [Button.inline(s.get('btn_shop', '🛍 فروشگاه'), b'shop'), Button.inline(s.get('btn_account', '👤 حساب من'), b'account')],
        [Button.inline(s.get('btn_guide', '📖 راهنما'), b'guide'), Button.inline(s.get('btn_support', '🎧 پشتیبانی'), b'support')],
        [Button.inline(s.get('btn_track', '🔍 پیگیری سفارش'), b'track'), Button.inline(s.get('btn_referral', '🤝 رفرال'), b'referral')],
    ]


def account_menu(verified):
    v_label = f"وضعیت احراز: {'✅' if verified else '❌'}"
    return [
        [Button.inline(v_label, b'verify_info')],
        [Button.inline('🎁 کد هدیه', b'giftcode'), Button.inline('🎲 چالش روزانه', b'challenge')],
        [Button.inline('📊 وضعیت حساب', b'mystatus'), Button.inline('🧾 فاکتورهای من', b'myorders:0')],
        [Button.inline('💳 تراکنش‌های موفق', b'mytx:0'), Button.inline('🧮 حسابدار من', b'myledger')],
        [Button.inline('💳 افزایش موجودی', b'chargewallet'), Button.inline('🔁 انتقال موجودی', b'transfer')],
        [Button.inline('🤝 دعوت دوستان (رفرال)', b'referral')],
        *back(b'home'),
    ]


def admin_menu():
    return [
        [Button.inline('📦 محصولات', b'a:prod'), Button.inline('🗂 دسته‌بندی', b'a:cat')],
        [Button.inline('👥 مشتریان', b'a:users'), Button.inline('🧾 سفارش‌ها', b'a:orders')],
        [Button.inline('💳 شارژ کیف پول', b'a:charges'), Button.inline('🏦 روش‌های پرداخت', b'a:pm')],
        [Button.inline('🎁 کدهای هدیه', b'a:gift'), Button.inline('📊 آمار', b'a:stats')],
        [Button.inline('📝 متن‌ها و دکمه‌ها', b'a:texts'), Button.inline('📣 پیام همگانی', b'a:bc')],
        [Button.inline('🔌 API', b'a:api')],
        [Button.inline('🔙 منوی اصلی', b'home')],
    ]


def api_menu():
    return [
        [Button.inline('🌐 تنظیم URL', b'a:url'), Button.inline('🔑 تنظیم API Key', b'a:key')],
        [Button.inline('🧪 تست اتصال', b'a:test'), Button.inline('💰 موجودی پنل', b'a:balance')],
        [Button.inline('👁 وضعیت', b'a:status'), Button.inline('🔄 Sync محصولات', b'a:sync')],
        [Button.inline('🔙 پنل مدیریت', b'admin')],
    ]


def back(target=b'home', label='🔙 بازگشت'):
    return [[Button.inline(label, target)]]


def grid(buttons, cols=2):
    """چیدن یک لیست از دکمه‌ها به‌صورت شبکه‌ای N-ستونه (پیش‌فرض ۲ در ۲)."""
    return [buttons[i:i + cols] for i in range(0, len(buttons), cols)]


def smart_grid(items, cols=2, threshold=22):
    """مثل grid، با این تفاوت که آیتم‌هایی با برچسب طولانی (بیشتر از threshold کاراکتر)
    تک‌دکمه و تمام‌عرض می‌شوند تا نامشان بریده نشود؛ بقیه به‌صورت N-ستونه (پیش‌فرض ۲ در ۲) کنار هم قرار می‌گیرند.
    items: لیستی از (label:str, callback_data:bytes)."""
    rows, buffer = [], []
    for label, cb in items:
        if len(label) > threshold:
            if buffer:
                rows.append(buffer); buffer = []
            rows.append([Button.inline(label, cb)])
        else:
            buffer.append(Button.inline(label, cb))
            if len(buffer) == cols:
                rows.append(buffer); buffer = []
    if buffer:
        rows.append(buffer)
    return rows


def pagination_row(prefix, page, has_next, extra=None):
    row = []
    if page > 0:
        row.append(Button.inline('◀️ قبلی', f'{prefix}:{page-1}'.encode()))
    if has_next:
        row.append(Button.inline('بعدی ▶️', f'{prefix}:{page+1}'.encode()))
    rows = [row] if row else []
    if extra:
        rows.append(extra)
    return rows
