# -*- coding: utf-8 -*-
"""تمام کیبوردهای ربات (شیشه‌ای و معمولی) اینجا تعریف شدن."""

from telebot import types

import database as db
import texts as texts_registry
import utils


# ---------------------------------------------------------------------------
# منوی اصلی کاربر
# ---------------------------------------------------------------------------
def main_menu(user_id):
    kb = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2)
    buttons = db.list_enabled_menu_buttons()
    row = []
    for b in buttons:
        row.append(types.KeyboardButton(b["label"]))
        if len(row) == 2:
            kb.row(*row)
            row = []
    if row:
        kb.row(*row)
    if db.is_admin(user_id):
        kb.row(types.KeyboardButton("🛠 پنل مدیریت"))
    return kb


def cancel_kb():
    kb = types.ReplyKeyboardMarkup(resize_keyboard=True)
    kb.add(types.KeyboardButton("❌ انصراف"))
    return kb


# ---------------------------------------------------------------------------
# خرید کوین - مبلغ‌های پیشنهادی سریع
# ---------------------------------------------------------------------------
def buy_amounts_kb():
    min_buy = db.get_int_setting("min_purchase_coins", 50)
    presets = sorted(set([min_buy, min_buy * 2, min_buy * 4, min_buy * 10]))
    kb = types.InlineKeyboardMarkup(row_width=2)
    buttons = [
        types.InlineKeyboardButton(f"{utils.fmt_num(p)} کوین", callback_data=f"buyamt_{p}")
        for p in presets
    ]
    kb.add(*buttons)
    kb.add(types.InlineKeyboardButton("✏️ مبلغ دلخواه", callback_data="buyamt_custom"))
    return kb


# ---------------------------------------------------------------------------
# لیست کانال‌ها برای کسب کوین
# ---------------------------------------------------------------------------
def join_campaign_kb(campaign):
    kb = types.InlineKeyboardMarkup()
    link = campaign["channel_link"] or utils.channel_link(campaign["channel_id"])
    kb.add(types.InlineKeyboardButton("🚀 ورود به کانال", url=link))
    kb.add(
        types.InlineKeyboardButton(
            "✅ عضو شدم، کوینم رو بده", callback_data=f"verify_{campaign['id']}"
        )
    )
    return kb


def earn_single_kb(campaign, index, total):
    """
    کارت تک‌کاناله برای کسب کوین:
    ردیف ۱: دکمه‌ی لینک با اسم کانال (باز کردن کانال)
    ردیف ۲: دکمه‌ی «عضو شدم» برای تایید و گرفتن کوین
    ردیف ۳: ناوبری کانال قبلی / بعدی (فقط وقتی لازمه نشون داده میشه)
    ردیف ۴: بازگشت به منوی اصلی
    """
    kb = types.InlineKeyboardMarkup(row_width=1)
    link = campaign["channel_link"] or utils.channel_link(campaign["channel_id"])
    title = campaign["channel_title"] or campaign["channel_id"]
    kb.row(types.InlineKeyboardButton(f"📢 {title}", url=link))
    kb.row(types.InlineKeyboardButton("✅ عضو شدم", callback_data=f"verify_{campaign['id']}"))

    nav_row = []
    if index > 0:
        nav_row.append(types.InlineKeyboardButton("⏮ کانال قبلی", callback_data=f"earnnav_{index - 1}"))
    if index < total - 1:
        nav_row.append(types.InlineKeyboardButton("کانال بعدی ⏭", callback_data=f"earnnav_{index + 1}"))
    if nav_row:
        kb.row(*nav_row)

    kb.row(types.InlineKeyboardButton("🏠 منوی اصلی", callback_data="earn_home"))
    return kb


def force_join_kb(channels):
    kb = types.InlineKeyboardMarkup()
    for ch in channels:
        link = ch["channel_link"] or utils.channel_link(ch["channel_id"], ch["title"])
        kb.add(types.InlineKeyboardButton(f"🔔 {ch['title'] or ch['channel_id']}", url=link))
    kb.add(types.InlineKeyboardButton("✅ عضو شدم", callback_data="check_force_join"))
    return kb


# ---------------------------------------------------------------------------
# پنل ادمین
# ---------------------------------------------------------------------------
def admin_main_kb():
    kb = types.InlineKeyboardMarkup(row_width=2)
    kb.add(
        types.InlineKeyboardButton("📊 آمار ربات", callback_data="adm_stats"),
        types.InlineKeyboardButton("⚙️ تنظیمات قیمت‌ها", callback_data="adm_prices"),
    )
    kb.add(
        types.InlineKeyboardButton("💳 کارت بانکی", callback_data="adm_card"),
        types.InlineKeyboardButton("📢 کانال اجباری", callback_data="adm_force"),
    )
    kb.add(
        types.InlineKeyboardButton("📥 کانال لاگ خریدها", callback_data="adm_logch"),
        types.InlineKeyboardButton("💰 پرداخت‌های در انتظار", callback_data="adm_payments"),
    )
    kb.add(
        types.InlineKeyboardButton("📣 پیام همگانی", callback_data="adm_broadcast"),
        types.InlineKeyboardButton("👤 مدیریت ادمین‌ها", callback_data="adm_admins"),
    )
    kb.add(
        types.InlineKeyboardButton("🔍 مدیریت کاربر", callback_data="adm_finduser"),
        types.InlineKeyboardButton("🎫 تیکت‌های پشتیبانی", callback_data="adm_tickets"),
    )
    kb.add(
        types.InlineKeyboardButton("🧩 مدیریت دکمه‌ها", callback_data="adm_buttons"),
        types.InlineKeyboardButton("✏️ مدیریت متن‌ها", callback_data="adm_texts"),
    )
    kb.add(types.InlineKeyboardButton("📞 آیدی پشتیبانی", callback_data="adm_support"))
    return kb


def admin_back_kb():
    kb = types.InlineKeyboardMarkup()
    kb.add(types.InlineKeyboardButton("🔙 بازگشت به پنل", callback_data="adm_back"))
    return kb


def prices_kb():
    kb = types.InlineKeyboardMarkup(row_width=1)
    kb.add(
        types.InlineKeyboardButton(
            f"🎯 جایزه عضویت (کوین هر جوین) = {db.get_setting('coin_per_join')}",
            callback_data="set_coin_per_join",
        ),
        types.InlineKeyboardButton(
            f"📦 واحد کوین = {db.get_setting('coins_unit')}",
            callback_data="set_coins_unit",
        ),
        types.InlineKeyboardButton(
            f"💵 قیمت هر واحد = {utils.toman(db.get_setting('price_per_unit'))}",
            callback_data="set_price_per_unit",
        ),
        types.InlineKeyboardButton(
            f"⬇️ حداقل خرید = {db.get_setting('min_purchase_coins')} کوین",
            callback_data="set_min_purchase",
        ),
        types.InlineKeyboardButton(
            f"🎁 پاداش زیرمجموعه = {db.get_setting('referral_bonus')} کوین",
            callback_data="set_referral_bonus",
        ),
        types.InlineKeyboardButton(
            f"📅 پاداش روزانه = {db.get_setting('daily_bonus')} کوین",
            callback_data="set_daily_bonus",
        ),
    )
    kb.add(types.InlineKeyboardButton("🔙 بازگشت", callback_data="adm_back"))
    return kb


def user_manage_kb(target_id, is_banned):
    kb = types.InlineKeyboardMarkup(row_width=2)
    kb.add(
        types.InlineKeyboardButton("➕ افزودن کوین", callback_data=f"u_add_{target_id}"),
        types.InlineKeyboardButton("➖ کسر کوین", callback_data=f"u_sub_{target_id}"),
    )
    kb.add(
        types.InlineKeyboardButton("🎯 تنظیم دقیق موجودی", callback_data=f"u_set_{target_id}"),
    )
    if is_banned:
        kb.add(types.InlineKeyboardButton("✅ رفع مسدودیت", callback_data=f"u_unban_{target_id}"))
    else:
        kb.add(types.InlineKeyboardButton("⛔️ مسدود کردن", callback_data=f"u_ban_{target_id}"))
    kb.add(types.InlineKeyboardButton("✉️ ارسال پیام مستقیم", callback_data=f"u_msg_{target_id}"))
    kb.add(types.InlineKeyboardButton("📋 کمپین‌های این کاربر", callback_data=f"u_camps_{target_id}"))
    kb.add(types.InlineKeyboardButton("🔙 بازگشت", callback_data="adm_back"))
    return kb


def ticket_reply_kb(ticket_id, user_id):
    kb = types.InlineKeyboardMarkup()
    kb.add(types.InlineKeyboardButton("✍️ پاسخ به کاربر", callback_data=f"tk_reply_{ticket_id}_{user_id}"))
    kb.add(types.InlineKeyboardButton("✅ بستن تیکت", callback_data=f"tk_close_{ticket_id}"))
    return kb


# ---------------------------------------------------------------------------
# ارسال همگانی - منوی گسترده
# ---------------------------------------------------------------------------
def broadcast_menu_kb():
    kb = types.InlineKeyboardMarkup(row_width=1)
    kb.add(
        types.InlineKeyboardButton("📝 پیام ساده (متن یا عکس)", callback_data="bc_simple"),
        types.InlineKeyboardButton("🔗 پیام با دکمه‌ی لینک‌دار", callback_data="bc_button"),
        types.InlineKeyboardButton("💰 شارژ کوین همگانی", callback_data="bc_addcoins"),
        types.InlineKeyboardButton("➖ کسر کوین همگانی", callback_data="bc_subcoins"),
    )
    kb.add(types.InlineKeyboardButton("🔙 بازگشت", callback_data="adm_back"))
    return kb


def broadcast_add_button_confirm_kb():
    kb = types.InlineKeyboardMarkup(row_width=2)
    kb.add(
        types.InlineKeyboardButton("✅ بله، دکمه اضافه کن", callback_data="bc_addbtn_yes"),
        types.InlineKeyboardButton("❌ نه، بدون دکمه بفرست", callback_data="bc_addbtn_no"),
    )
    return kb


def confirm_bulk_coins_kb():
    kb = types.InlineKeyboardMarkup(row_width=2)
    kb.add(
        types.InlineKeyboardButton("✅ تایید و اجرا", callback_data="bc_confirm_yes"),
        types.InlineKeyboardButton("❌ انصراف", callback_data="bc_confirm_no"),
    )
    return kb


def confirm_broadcast_kb(kind):
    kb = types.InlineKeyboardMarkup(row_width=2)
    kb.add(
        types.InlineKeyboardButton("✅ تایید و ارسال", callback_data=f"bcconfirm_{kind}_yes"),
        types.InlineKeyboardButton("❌ انصراف", callback_data=f"bcconfirm_{kind}_no"),
    )
    return kb


# ---------------------------------------------------------------------------
# مدیریت دکمه‌های منو
# ---------------------------------------------------------------------------
def buttons_list_kb():
    kb = types.InlineKeyboardMarkup(row_width=1)
    for b in db.list_menu_buttons():
        status = "✅" if b["enabled"] else "🚫"
        kind_icon = "" if b["kind"] == "core" else "🆕 "
        kb.add(
            types.InlineKeyboardButton(
                f"{status} {kind_icon}{b['label']}", callback_data=f"btnview_{b['id']}"
            )
        )
    kb.add(types.InlineKeyboardButton("➕ افزودن دکمه سفارشی", callback_data="btn_add_custom"))
    kb.add(types.InlineKeyboardButton("🔙 بازگشت", callback_data="adm_back"))
    return kb


def button_detail_kb(button):
    kb = types.InlineKeyboardMarkup(row_width=2)
    toggle_text = "🚫 غیرفعال کن" if button["enabled"] else "✅ فعال کن"
    kb.add(
        types.InlineKeyboardButton("✏️ تغییر نام", callback_data=f"btnrename_{button['id']}"),
        types.InlineKeyboardButton(toggle_text, callback_data=f"btntoggle_{button['id']}"),
    )
    if button["kind"] == "custom":
        kb.add(
            types.InlineKeyboardButton("📝 تغییر متن پاسخ", callback_data=f"btnedittext_{button['id']}"),
        )
    kb.add(
        types.InlineKeyboardButton("⬆️ جابه‌جایی به بالا", callback_data=f"btnup_{button['id']}"),
        types.InlineKeyboardButton("⬇️ جابه‌جایی به پایین", callback_data=f"btndown_{button['id']}"),
    )
    if button["kind"] == "custom":
        kb.add(types.InlineKeyboardButton("🗑 حذف کامل این دکمه", callback_data=f"btndelete_{button['id']}"))
    kb.add(types.InlineKeyboardButton("🔙 بازگشت به لیست دکمه‌ها", callback_data="adm_buttons"))
    return kb


# ---------------------------------------------------------------------------
# مدیریت متن‌ها
# ---------------------------------------------------------------------------
def text_categories_kb():
    kb = types.InlineKeyboardMarkup(row_width=1)
    for key, label in texts_registry.CATEGORIES.items():
        kb.add(types.InlineKeyboardButton(label, callback_data=f"txtcat_{key}"))
    kb.add(types.InlineKeyboardButton("🔙 بازگشت", callback_data="adm_back"))
    return kb


def texts_in_category_kb(category):
    kb = types.InlineKeyboardMarkup(row_width=1)
    for key, (cat, label, _default) in texts_registry.TEXT_DEFAULTS.items():
        if cat == category:
            mark = "✏️ " if db.is_text_customized(key) else ""
            kb.add(types.InlineKeyboardButton(f"{mark}{label}", callback_data=f"txtedit_{key}"))
    kb.add(types.InlineKeyboardButton("🔙 بازگشت", callback_data="adm_texts"))
    return kb


def force_channels_kb():
    kb = types.InlineKeyboardMarkup(row_width=1)
    for ch in db.list_force_channels():
        kb.add(
            types.InlineKeyboardButton(
                f"❌ حذف {ch['title'] or ch['channel_id']}",
                callback_data=f"rm_force_{ch['id']}",
            )
        )
    kb.add(types.InlineKeyboardButton("➕ افزودن کانال اجباری", callback_data="add_force"))
    kb.add(types.InlineKeyboardButton("🔙 بازگشت", callback_data="adm_back"))
    return kb


def payment_review_kb(payment_id):
    kb = types.InlineKeyboardMarkup()
    kb.add(
        types.InlineKeyboardButton("✅ تایید", callback_data=f"pay_ok_{payment_id}"),
        types.InlineKeyboardButton("❌ رد", callback_data=f"pay_no_{payment_id}"),
    )
    return kb


def admins_kb():
    kb = types.InlineKeyboardMarkup(row_width=1)
    for uid in db.list_admins():
        kb.add(
            types.InlineKeyboardButton(f"❌ حذف ادمین {uid}", callback_data=f"rm_admin_{uid}")
        )
    kb.add(types.InlineKeyboardButton("➕ افزودن ادمین", callback_data="add_admin"))
    kb.add(types.InlineKeyboardButton("🔙 بازگشت", callback_data="adm_back"))
    return kb


def confirm_campaign_kb():
    kb = types.InlineKeyboardMarkup()
    kb.add(
        types.InlineKeyboardButton("✅ تایید و شروع تبلیغ", callback_data="campaign_confirm"),
        types.InlineKeyboardButton("❌ انصراف", callback_data="campaign_cancel"),
    )
    return kb
