"""
Inline keyboards for the user-facing side of the bot.
All labels in Persian (فارسی).

Buttons are CLASSIC plain-text buttons. Every emoji shown on a button comes
from the shared list in utils/emojis.py via ``get_plain_emoji()`` — no
``style`` and no ``icon_custom_emoji_id`` (those render duplicated emojis and
often don't fire callback_query on many clients).
"""

from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup
from aiogram.utils.keyboard import InlineKeyboardBuilder
from keyboards.callback_data import WelcomeCallback
from utils.emojis import get_plain_emoji
import random

CUSTOM_EMOJI_IDS = [
    "5958467095346813746",
    "5961017799114497020",
    "5960630362999626865",
    "5958726498486590755",
    "5958348403925590763",
    "5958279349441404348",
    "5958676509362231977",
    "5958421521448836687",
    "5958288437592210169",
    "5960620123797593722",
    "5958480611608895485",
    "5958371699828203567",
    "5958413958011428474",
    "5958624785071086859",
    "5960588869320580393",
    "5960518904303328686",
    "5960997221926183379",
    "5960977078529564896",
]


def _r_button(text_key: str, text: str, cb: str) -> InlineKeyboardButton:
    """Build an inline button with a random Telegram Custom Emoji."""
    return InlineKeyboardButton(
        text=text,
        callback_data=cb,
        icon_custom_emoji_id=random.choice(CUSTOM_EMOJI_IDS),
    )


# ─── Welcome Inline Keyboard ─────────────────────────────────────────

def welcome_inline_kb() -> InlineKeyboardMarkup:
    """Inline keyboard attached directly under the /start welcome text.

    Provides quick actions so the user doesn't have to scroll
    through the reply keyboard to get started.
    Layout: 2-column grid with last button full-width if odd count.
    """
    builder = InlineKeyboardBuilder()
    builder.button(
        text=f"{get_plain_emoji('store')} مشاهده دسته‌بندی‌ها",
        callback_data=WelcomeCallback(action="categories").pack(),
    )
    builder.button(
        text=f"{get_plain_emoji('fire')} تخفیف‌های ویژه",
        callback_data=WelcomeCallback(action="deals").pack(),
    )
    builder.button(
        text=f"{get_plain_emoji('clipboard')} پیگیری سفارشات",
        callback_data="menu:my_orders",
    )
    builder.adjust(2)  # 2-column layout; last button full-width if odd
    return builder.as_markup()


# ─── Dynamic Main Menu (shop menu with live DB prices) ────────────────

# Ordered list of (callback_data, label, emoji_key) for the menu rows.
# The label is plain text — the emoji comes from ``get_plain_emoji``.
_MENU_ROWS: list[tuple[str, str, str]] = [
    ("menu:virtual_number", "شماره مجازی",     "key_lock"),
    ("menu:premium",     "تلگرام پرمیوم",      "star"),
    ("menu:stars",       "خرید استارز",        "star"),
    ("menu:stars_gift",  "گیفت‌های استارز",     "heart_ribbon"),
    ("menu:ai_accounts", "اکانت هوش مصنوعی",   "bot"),
    ("menu:design",      "خدمات طراحی",        "palette"),
    ("menu:security",    "امنیت صفحه",          "shield"),
    ("menu:market_rates", "قیمت لحظه‌ای ارزها", "chart"),
    ("menu:my_orders",   "پیگیری سفارشات",      "clipboard"),
]


async def main_menu_kb() -> InlineKeyboardMarkup:
    """Premium-style main shop menu.
    Callback data remains unchanged.
    """
    builder = InlineKeyboardBuilder()

    # خدمات اصلی
    builder.row(
        InlineKeyboardButton(
            text=f"{get_plain_emoji('key_lock')} شماره مجازی",
            callback_data="menu:virtual_number",
        ),
        InlineKeyboardButton(
            text=f"{get_plain_emoji('star')} تلگرام پرمیوم",
            callback_data="menu:premium",
        ),
    )

    # محصولات تلگرام
    builder.row(
        InlineKeyboardButton(
            text=f"{get_plain_emoji('star')} خرید استارز",
            callback_data="menu:stars",
        ),
        InlineKeyboardButton(
            text=f"{get_plain_emoji('heart_ribbon')} گیفت استارز",
            callback_data="menu:stars_gift",
        ),
    )

    # خدمات دیجیتال
    builder.row(
        InlineKeyboardButton(
            text=f"{get_plain_emoji('bot')} اکانت هوش مصنوعی",
            callback_data="menu:ai_accounts",
        ),
        InlineKeyboardButton(
            text=f"{get_plain_emoji('palette')} خدمات طراحی",
            callback_data="menu:design",
        ),
    )

    # ابزارها
    builder.row(
        InlineKeyboardButton(
            text=f"{get_plain_emoji('shield')} امنیت صفحه",
            callback_data="menu:security",
        ),
        InlineKeyboardButton(
            text=f"{get_plain_emoji('chart')} قیمت لحظه‌ای ارز",
            callback_data="menu:market_rates",
        ),
    )

    # سفارشات — تمام عرض
    builder.row(
        InlineKeyboardButton(
            text=f"{get_plain_emoji('clipboard')} سفارشات من",
            callback_data="menu:my_orders",
        )
    )

    return builder.as_markup()

# ─── Telegram Premium ────────────────────────────────────────────────

async def premium_duration_kb() -> InlineKeyboardMarkup:
    """Build premium duration buttons with dynamic DB prices.

    Each button takes full width (1 per row) to prevent text truncation.
    """
    from database.db import get_price_or_default
    from utils.pricing import price_display

    durations = [
        ("premium:monthly",     "ماهانه",    "telegram_premium_monthly",     "calendar"),
        ("premium:quarterly",   "سه‌ماهه",   "telegram_premium_quarterly",   "calendar"),
        ("premium:semi_annual", "شش‌ماهه",  "telegram_premium_semi_annual",  "calendar"),
        ("premium:yearly",      "سالانه",    "telegram_premium_yearly",       "calendar"),
    ]

    builder = InlineKeyboardBuilder()
    for cb_data, base_label, product_key, emoji_key in durations:
        usd = await get_price_or_default(product_key)
        toman_str = await price_display(usd)
        toman_num = toman_str.replace(" تومان", "")
        builder.button(
            text=f"{get_plain_emoji(emoji_key)} {base_label} — {toman_num} تومان",
            callback_data=cb_data,
        )
    builder.adjust(1)  # 1 button per row to show full text
    builder.row(InlineKeyboardButton(
        text=f"{get_plain_emoji('back_arrow')} بازگشت",
        callback_data="menu:back",
    ))
    return builder.as_markup()


def premium_target_kb() -> InlineKeyboardMarkup:
    return InlineKeyboardMarkup(inline_keyboard=[
        [_r_button("green_circle", "برای خودم", "premium:target:self")],
        [_r_button("users", "برای شخص دیگر", "premium:target:other")],
        [_r_button("back_arrow", "بازگشت", "premium:back")],
    ])


# ─── Telegram Stars (Standard) ─────────────────────────────────────

def stars_target_kb() -> InlineKeyboardMarkup:
    return InlineKeyboardMarkup(inline_keyboard=[
        [_r_button("green_circle", "برای خودم", "stars:target:self")],
        [_r_button("users", "برای شخص دیگر", "stars:target:other")],
        [_r_button("back_arrow", "بازگشت", "stars:back")],
    ])


# ─── Telegram Stars Gifts (individual items, 2-column layout) ───────

# Each gift: (emoji_key_for_button_icon, stars_count, product_key, display_name, static_price_toman)
# display_name is plain text — the emoji comes from get_plain_emoji().
# Only include products that exist in config.PRICES / product_prices DB.
_STARS_GIFTS = [
    ("heart_simple", 15,  "stars_gift_heart_15",   "قلب",      92000),
    ("teddy",        15,  "stars_gift_teddy_15",   "تدی",      92000),
    ("gift",         25,  "stars_gift_gift_25",    "کادو",     138000),
    ("rose",         25,  "stars_gift_rose_25",    "گل رز",    138000),
    ("cake",         50,  "stars_gift_cake_50",    "کیک",      290000),
    ("bouquet",      50,  "stars_gift_flower_50",  "گل",       290000),
    ("bottle",       50,  "stars_gift_bottle_50",  "بطری",     290000),
    ("rocket",       50,  "stars_gift_rocket_50",  "سفینه",    290000),
    ("trophy",       100, "stars_gift_trophy_100", "جام",      470000),
    ("ring",         100, "stars_gift_ring_100",   "حلقه",     470000),
    ("diamond",      100, "stars_gift_diamond_100","الماس",    470000),
]


async def stars_gift_items_kb() -> InlineKeyboardMarkup:
    """Build the Stars Gifts keyboard with dynamic live prices.

    Prices are computed from the DB USD price × live exchange rate × profit
    margin — the SAME value shown on the payment screen. Hardcoded fallback
    prices are used only when the live rate is unreachable.

    Each gift button takes full width (1 per row) to show full text.
    Format: [Emoji] [Name] [Stars] ⭐️ - [Price] تومان
    """
    from database.db import get_all_product_prices
    from utils.pricing import price_display_raw
    from config import config as _cfg

    price_rows = await get_all_product_prices()
    usd_map = {row["product_key"]: float(row["usd_price"]) for row in price_rows}
    builder = InlineKeyboardBuilder()

    price_map: dict[str, int] = {}
    for emoji_key, stars_count, pkey, display_name, static_price in _STARS_GIFTS:
        usd = usd_map.get(pkey) or _cfg.PRICES.get(pkey)
        if usd:
            final_irt, _ = await price_display_raw(usd)
            price_map[pkey] = final_irt
        else:
            price_map[pkey] = static_price  # no DB/default USD — static fallback

    for emoji_key, stars_count, pkey, display_name, static_price in _STARS_GIFTS:
        toman_num = f"{price_map[pkey]:,}".replace(",", "،")
        builder.button(
            text=f"{get_plain_emoji(emoji_key)} {display_name} {stars_count} {get_plain_emoji('star_raw')} - {toman_num} تومان",
            callback_data=f"stars_gift:item:{pkey}",
        )

    builder.adjust(1)  # 1 button per row to show full text

    # Back button
    builder.row(InlineKeyboardButton(
        text=f"{get_plain_emoji('back_arrow')} برگشت {get_plain_emoji('arrow_left')}",
        callback_data="menu:back",
    ))

    return builder.as_markup()


# ─── AI Accounts ────────────────────────────────────────────────────

async def ai_platform_kb() -> InlineKeyboardMarkup:
    """Build AI platform buttons with dynamic DB prices.

    Each button takes full width (1 per row) to prevent text truncation.
    """
    from database.db import get_price_or_default
    from utils.pricing import price_display

    platforms = [
        ("ai:platform:chatgpt", "ChatGPT Plus",  "chatgpt_premium", "bot"),
        ("ai:platform:gemini",  "Gemini Advanced", "gemini_premium", "sparkles"),
    ]

    builder = InlineKeyboardBuilder()
    for cb_data, base_label, product_key, emoji_key in platforms:
        usd = await get_price_or_default(product_key)
        toman_str = await price_display(usd)
        toman_num = toman_str.replace(" تومان", "")
        builder.button(
            text=f"{get_plain_emoji(emoji_key)} {base_label} — {toman_num} تومان",
            callback_data=cb_data,
        )
    builder.adjust(1)  # 1 button per row to show full text
    builder.row(InlineKeyboardButton(
        text=f"{get_plain_emoji('back_arrow')} بازگشت",
        callback_data="menu:back",
    ))
    return builder.as_markup()


# ─── Design Services (Category → Tier) ────────────────────────────

async def design_category_kb() -> InlineKeyboardMarkup:
    """Show the 3 design sub-categories: Video, Photo, Logo.

    Each button takes full width (1 per row) to prevent text truncation.
    """
    from database.db import get_price_or_default
    from utils.pricing import price_display

    # Get cheapest price per category for display
    categories = [
        ("design:cat:video", "ویدیو", "design_video_ai", "film"),
        ("design:cat:photo", "عکس",  "design_photo_ai", "camera"),
        ("design:cat:logo",  "لوگو",  "design_logo_ai", "palette"),
    ]

    builder = InlineKeyboardBuilder()
    for cb_data, base_label, product_key, emoji_key in categories:
        usd = await get_price_or_default(product_key)
        toman_str = await price_display(usd)
        toman_num = toman_str.replace(" تومان", "")
        builder.button(
            text=f"{get_plain_emoji(emoji_key)} {base_label} — از {toman_num}",
            callback_data=cb_data,
        )
    builder.adjust(1)  # 1 button per row to show full text
    builder.row(InlineKeyboardButton(
        text=f"{get_plain_emoji('back_arrow')} بازگشت",
        callback_data="menu:back",
    ))
    return builder.as_markup()


async def design_tier_kb(category: str = "video") -> InlineKeyboardMarkup:
    """Show 4 quality tiers for a given design category with dynamic prices.

    Each button takes full width (1 per row) to prevent text truncation.
    """
    from database.db import get_price_or_default
    from utils.pricing import price_display

    tiers = [
        (f"design:tier:{category}:ai",      "با هوش مصنوعی", f"design_{category}_ai",      "bot"),
        (f"design:tier:{category}:simple",  "ساده",           f"design_{category}_simple",  "sparkles"),
        (f"design:tier:{category}:pro",     "حرفه‌ای",        f"design_{category}_pro",     "star"),
        (f"design:tier:{category}:special", "ویژه",           f"design_{category}_special", "diamond"),
    ]

    builder = InlineKeyboardBuilder()
    for cb_data, base_label, product_key, emoji_key in tiers:
        usd = await get_price_or_default(product_key)
        toman_str = await price_display(usd)
        toman_num = toman_str.replace(" تومان", "")
        builder.button(
            text=f"{get_plain_emoji(emoji_key)} {base_label} — {toman_num} تومان",
            callback_data=cb_data,
        )
    builder.adjust(1)  # 1 button per row to show full text
    builder.row(InlineKeyboardButton(
        text=f"{get_plain_emoji('back_arrow')} بازگشت",
        callback_data="design:back_to_categories",
    ))
    return builder.as_markup()


# ─── Page Security ──────────────────────────────────────────────────

async def security_tariff_kb() -> InlineKeyboardMarkup:
    """Show security tariffs with dynamic prices from config.

    Each button takes full width (1 per row) to prevent text truncation.
    """
    from utils.pricing import price_display
    from config import config

    tariffs = [
        ("security:tariff:basic",     "پایه",       "basic",     "yellow_circle"),
        ("security:tariff:standard",  "استاندارد",  "standard",  "blue_circle"),
        ("security:tariff:advanced",  "پیشرفته",    "advanced",  "shield"),
    ]

    builder = InlineKeyboardBuilder()
    for cb_data, base_label, tariff_key, emoji_key in tariffs:
        tariff = config.SECURITY_TARIFFS.get(tariff_key, {})
        usd = tariff.get("usd", 0)
        toman_str = await price_display(usd)
        toman_num = toman_str.replace(" تومان", "")
        builder.button(
            text=f"{get_plain_emoji(emoji_key)} {base_label} — {toman_num} تومان",
            callback_data=cb_data,
        )
    builder.adjust(1)  # 1 button per row to show full text
    builder.row(InlineKeyboardButton(
        text=f"{get_plain_emoji('back_arrow')} بازگشت",
        callback_data="menu:back",
    ))
    return builder.as_markup()


# ─── Market Rates ───────────────────────────────────────────────────

def market_rates_refresh_kb() -> InlineKeyboardMarkup:
    return InlineKeyboardMarkup(inline_keyboard=[
        [_r_button("refresh", "به‌روزرسانی", "menu:market_rates")],
        [_r_button("back_arrow", "بازگشت به منو", "menu:back")],
    ])


# ─── Generic payment ────────────────────────────────────────────────

def payment_confirm_kb() -> InlineKeyboardMarkup:
    return InlineKeyboardMarkup(inline_keyboard=[
        [_r_button("green_circle", "پرداخت", "pay:confirm")],
        [_r_button("red_circle", "انصراف", "pay:cancel")],
    ])


def pay_link_kb(pay_url: str) -> InlineKeyboardMarkup:
    return InlineKeyboardMarkup(inline_keyboard=[
        [InlineKeyboardButton(
            text=f"{get_plain_emoji('card')} پرداخت از طریق زرین‌پال",
            url=pay_url,
        )],
        [_r_button("green_circle", "پرداخت کردم", "pay:check")],
        [_r_button("red_circle", "انصراف", "pay:cancel")],
    ])


# ─── Virtual Number (Kalino API — "شماره مجازی") ─────────────────────

async def virtual_services_kb(
    services_map: dict[str, int] | None = None,
    page: int = 0,
) -> InlineKeyboardMarkup:
    """Build a classic paginated application-selection grid.

    Each row maps a Persian display label (with emoji) to its numeric
    Kalino ``service_id``, e.g.:
        💎 تلگرام پنل اختصاصی → 1    ✳️ واتساپ → 2

    Layout: 4 rows × 2 columns per page.
    """
    if services_map is None:
        from utils.kalino import get_apps_display_map
        services_map = await get_apps_display_map()

    items = list(services_map.items())
    items_per_page = 8
    start = page * items_per_page
    end = start + items_per_page

    builder = InlineKeyboardBuilder()
    for label, service_id in items[start:end]:
        builder.button(
            text=label,
            callback_data=f"v_app:{service_id}",
        )
    builder.adjust(2)

    # Pagination for the app grid
    if start > 0 or end < len(items):
        nav = []
        if start > 0:
            nav.append(_r_button("arrow_left", "قبلی", f"vs_page:{page - 1}"))
        if end < len(items):
            nav.append(_r_button("arrow_right", "بعدی", f"vs_page:{page + 1}"))
        builder.row(*nav)

    builder.row(_r_button("back_arrow", "بازگشت به منو", "menu:back_main"))
    return builder.as_markup()


def virtual_country_kb(
    countries: list,
    service_id,
    page: int = 0,
    non_report: bool = False,
) -> InlineKeyboardMarkup:
    """Build a classic table-style keyboard for virtual number purchase
    using the Kalino (range-based) callback format.

    Layout (up to 10 in-stock countries per page):
      Toggle (Telegram only): [🚀 شماره غیرریپورت] / [💎 پنل اختصاصی]
      Controls:               [🔵 فیلتر پیشرفته] [🛍️ خرید گروهی]
      Header:                 [💰 قیمت] [📦 موجودی] [🌍 نام کشور]
      Data rows:              [price] [✨ موجود] [country]
      Pagination:             [⬅️ قبلی] [بعدی ➡️]
      Footer:                 [🔙 سرویس‌ها] [🏠 منوی اصلی]
    """
    builder = InlineKeyboardBuilder()

    # 1. Non-report toggle (Telegram only)
    sid_str = str(service_id)
    if sid_str == "1":
        builder.row(_r_button("rocket", "تلگرام غیرریپورت", "v_app:tg_noreport"))
    elif sid_str == "tg_noreport":
        builder.row(_r_button("diamond", "تلگرام پنل اختصاصی", "v_app:1"))

    # 2. Filter / Bulk controls
    builder.row(
        _r_button("blue_circle", "فیلتر پیشرفته", f"v_filter:{service_id}"),
        _r_button("shopping", "خرید گروهی", f"v_bulk:{service_id}"),
    )

    # 3. Header row (clean column headers)
    builder.row(
        _r_button("money", "قیمت", "ignore"),
        _r_button("box", "موجودی", "ignore"),
        _r_button("earth", "نام کشور", "ignore"),
    )

    # 4. Data rows — show both available and unavailable countries
    items_per_page = 10
    start = page * items_per_page
    end = start + items_per_page
    page_items = countries[start:end]

    for c in page_items:
        price = c.get("final_price", c.get("base_price", 0))
        country_name = c.get("country", "نامشخص")[:15]
        country_range = str(c.get("range", "1"))

        in_stock = c.get("in_stock", False)
        if isinstance(in_stock, str):
            in_stock = in_stock.strip().lower() in (
                "1", "true", "yes", "y", "available", "in_stock"
            )
        else:
            in_stock = bool(in_stock)

        if in_stock:
            status_text = "🟢 موجود"
            cb_data = f"v_buy:{service_id}:{country_range}"
        else:
            status_text = "🔴 ناموجود"
            cb_data = "ignore"

        builder.row(
            InlineKeyboardButton(
                text=f"{get_plain_emoji('money')} {price:,}",
                callback_data=cb_data,
                style="primary",
            ),
            InlineKeyboardButton(
                text=status_text,
                callback_data=cb_data,
                style="success" if in_stock else "danger",
            ),
            InlineKeyboardButton(
                text=f"{get_plain_emoji('earth')} {country_name}",
                callback_data=cb_data,
                style="primary",
            ),
        )
    # 5. Pagination navigation
    nav = []
    if start > 0:
        nav.append(_r_button("arrow_left", "قبلی", f"v_page:{service_id}:{page - 1}"))
    if end < len(countries):
        nav.append(_r_button("arrow_right", "بعدی", f"v_page:{service_id}:{page + 1}"))
    if nav:
        builder.row(*nav)

    # 6. Footer — back to service list / main menu
    builder.row(
        _r_button("back_arrow", "سرویس‌ها", "menu:virtual_number"),
        _r_button("home", "منوی اصلی", "menu:back_main"),
    )

    return builder.as_markup()


def virtual_bulk_qty_kb(service_id) -> InlineKeyboardMarkup:
    """Quantity picker for the bulk-purchase flow."""
    return InlineKeyboardMarkup(inline_keyboard=[
        [_r_button("num2", "۲ شماره", f"v_bulk_qty:{service_id}:2"),
         _r_button("num3", "۳ شماره", f"v_bulk_qty:{service_id}:3")],
        [_r_button("num5", "۵ شماره", f"v_bulk_qty:{service_id}:5"),
         _r_button("keycap_10", "۱۰ شماره", f"v_bulk_qty:{service_id}:10")],
        [_r_button("red_circle", "انصراف", f"v_bulk_cancel:{service_id}")],
    ])


# ─── Back to menu ───────────────────────────────────────────────────

def back_to_menu_kb() -> InlineKeyboardMarkup:
    return InlineKeyboardMarkup(inline_keyboard=[
        [_r_button("back_arrow", "بازگشت به منو", "menu:back")],
    ])
