"""
Shop handlers — both coach panel (manage) and athlete panel (browse/order).
"""
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import (
    ContextTypes, ConversationHandler,
    MessageHandler, CallbackQueryHandler, filters,
)
import database.db as db
from config.settings import (
    SHOP_ADD_BAND_NAME, SHOP_ADD_ITEM_NAME,
    SHOP_ADD_ITEM_PRICE, SHOP_ADD_ITEM_DESC, SHOP_ADD_ITEM_VOICE,
    SHOP_ADD_ITEM_PHOTO, SHOP_ORDER_COUNT,
)
from utils.keyboards import MAIN_COACH_KB, BACK_KB
from utils.helpers import go_main_menu, track_message, delete_bot_messages, normalize_digits


def _build(rows):
    return InlineKeyboardMarkup([[InlineKeyboardButton(l, callback_data=d) for l, d in row] for row in rows])


async def _cancel(update, context):
    await go_main_menu(update, context)
    return ConversationHandler.END


# ══════════════════════════════════════════════════════════════════════════════
#  COACH — SHOP MANAGEMENT
# ══════════════════════════════════════════════════════════════════════════════

async def coach_shop_menu(update: Update, context: ContextTypes.DEFAULT_TYPE):
    chat_id = update.effective_chat.id
    await delete_bot_messages(context, chat_id)
    kb = _build([
        [("🏷 دستبندها", "shop_bands_list"), ("➕ افزودن دستبند", "shop_add_band")],
        [("📦 سفارشات", "shop_orders_list")],
        [("🏠 بازگشت", "main_menu")],
    ])
    sent = await update.effective_message.reply_text(
        "🛒 *پنل فروشگاه*\nمدیریت محصولات و سفارشات:", reply_markup=kb, parse_mode="Markdown")
    track_message(context, chat_id, sent.message_id)


# ─── Bands ────────────────────────────────────────────────────────────────────

async def shop_bands_list(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    bands = db.get_all_shop_bands()
    chat_id = query.message.chat_id
    await delete_bot_messages(context, chat_id)
    if not bands:
        sent = await query.message.reply_text("❌ هیچ دستبندی ثبت نشده. ابتدا دستبند اضافه کنید.")
        track_message(context, chat_id, sent.message_id)
        return
    rows = [[InlineKeyboardButton(f"🏷 {b['name']}", callback_data=f"shop_band_{b['id']}")] for b in bands]
    rows.append([InlineKeyboardButton("➕ افزودن دستبند", callback_data="shop_add_band")])
    rows.append([InlineKeyboardButton("🏠 بازگشت", callback_data="main_menu")])
    sent = await query.message.reply_text("🏷 *دستبندهای فروشگاه:*",
                                          reply_markup=InlineKeyboardMarkup(rows), parse_mode="Markdown")
    track_message(context, chat_id, sent.message_id)


async def shop_band_detail(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    band_id = int(query.data.split("_")[-1])
    context.user_data["shop_band_id"] = band_id
    band = db.get_shop_band(band_id)
    items = db.get_items_by_band(band_id)
    chat_id = query.message.chat_id
    await delete_bot_messages(context, chat_id)
    rows = [[InlineKeyboardButton(f"🛍 {it['name']} — {it['price']:,} تومان",
                                  callback_data=f"shop_item_{it['id']}")] for it in items]
    rows.append([InlineKeyboardButton("➕ افزودن کالا", callback_data=f"shop_additem_{band_id}")])
    rows.append([InlineKeyboardButton("🗑 حذف دستبند", callback_data=f"shop_delband_{band_id}"),
                 InlineKeyboardButton("🔙 بازگشت", callback_data="shop_bands_list")])
    sent = await query.message.reply_text(
        f"🏷 *دستبند: {band['name']}*\n{len(items)} محصول ثبت شده:",
        reply_markup=InlineKeyboardMarkup(rows), parse_mode="Markdown")
    track_message(context, chat_id, sent.message_id)


async def shop_delete_band(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    band_id = int(query.data.split("_")[-1])
    band = db.get_shop_band(band_id)
    db.delete_shop_band(band_id)
    sent = await query.message.reply_text(f"🗑 دستبند «{band['name']}» و تمام محصولاتش حذف شد.", reply_markup=MAIN_COACH_KB)
    track_message(context, query.message.chat_id, sent.message_id)


# ─── Add Band Conversation ────────────────────────────────────────────────────

async def shop_add_band_start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    sent = await query.message.reply_text("🏷 نام دستبند جدید را وارد کن:", reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton("🔙 بازگشت", callback_data="main_menu")]]))
    track_message(context, query.message.chat_id, sent.message_id)
    return SHOP_ADD_BAND_NAME


async def shop_add_band_got_name(update: Update, context: ContextTypes.DEFAULT_TYPE):
    name = update.message.text.strip()
    db.create_shop_band(name)
    sent = await update.message.reply_text(f"✅ دستبند «{name}» ایجاد شد! 🎉", reply_markup=MAIN_COACH_KB)
    track_message(context, update.effective_chat.id, sent.message_id)
    return ConversationHandler.END


# ─── Add Item Conversation ────────────────────────────────────────────────────

async def shop_additem_start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    band_id = int(query.data.split("_")[-1])
    context.user_data["new_item_band"] = band_id
    sent = await query.message.reply_text("📦 نام محصول را وارد کن:", reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton("🔙 بازگشت", callback_data="main_menu")]]))
    track_message(context, query.message.chat_id, sent.message_id)
    return SHOP_ADD_ITEM_NAME


async def shop_additem_got_name(update: Update, context: ContextTypes.DEFAULT_TYPE):
    context.user_data["new_item_name"] = update.message.text.strip()
    sent = await update.message.reply_text("💰 قیمت محصول را وارد کن (عدد — تومان):", reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton("🔙 بازگشت", callback_data="main_menu")]]))
    track_message(context, update.effective_chat.id, sent.message_id)
    return SHOP_ADD_ITEM_PRICE


async def shop_additem_got_price(update: Update, context: ContextTypes.DEFAULT_TYPE):
    text = normalize_digits(update.message.text.strip().replace(",", ""))
    if not text.isdigit():
        sent = await update.message.reply_text("❗️ فقط عدد وارد کن.")
        track_message(context, update.effective_chat.id, sent.message_id)
        return SHOP_ADD_ITEM_PRICE
    context.user_data["new_item_price"] = int(text)
    sent = await update.message.reply_text("📝 توضیحات محصول را بنویس:", reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton("🔙 بازگشت", callback_data="main_menu")]]))
    track_message(context, update.effective_chat.id, sent.message_id)
    return SHOP_ADD_ITEM_DESC


async def shop_additem_got_desc(update: Update, context: ContextTypes.DEFAULT_TYPE):
    context.user_data["new_item_desc"] = update.message.text.strip()
    kb = _build([
        [("⏭ رد کردن", "skip_item_voice"), ("🏠 بازگشت", "main_menu")],
    ])
    sent = await update.message.reply_text("🎤 ویس توضیحی ارسال کن (یا رد کن):", reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton("🔙 بازگشت", callback_data="main_menu")]]))
    track_message(context, update.effective_chat.id, sent.message_id)
    s2 = await update.message.reply_text(":", reply_markup=kb)
    track_message(context, update.effective_chat.id, s2.message_id)
    return SHOP_ADD_ITEM_VOICE


async def shop_additem_skip_voice(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    context.user_data["new_item_voice"] = None
    kb = _build([[("⏭ رد کردن", "skip_item_photo"), ("🏠 بازگشت", "main_menu")]])
    sent = await query.message.reply_text("🖼 عکس محصول را ارسال کن (یا رد کن):", reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton("🔙 بازگشت", callback_data="main_menu")]]))
    track_message(context, query.message.chat_id, sent.message_id)
    s2 = await query.message.reply_text(":", reply_markup=kb)
    track_message(context, query.message.chat_id, s2.message_id)
    return SHOP_ADD_ITEM_PHOTO


async def shop_additem_got_voice(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if update.message.voice:
        context.user_data["new_item_voice"] = update.message.voice.file_id
    else:
        context.user_data["new_item_voice"] = None
    kb = _build([[("⏭ رد کردن", "skip_item_photo"), ("🏠 بازگشت", "main_menu")]])
    sent = await update.message.reply_text("🖼 عکس محصول را ارسال کن (یا رد کن):", reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton("🔙 بازگشت", callback_data="main_menu")]]))
    track_message(context, update.effective_chat.id, sent.message_id)
    s2 = await update.message.reply_text(":", reply_markup=kb)
    track_message(context, update.effective_chat.id, s2.message_id)
    return SHOP_ADD_ITEM_PHOTO


async def shop_additem_skip_photo(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    context.user_data["new_item_photo"] = None
    return await _save_item(query.message, context)


async def shop_additem_got_photo(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if update.message.photo:
        context.user_data["new_item_photo"] = update.message.photo[-1].file_id
    else:
        context.user_data["new_item_photo"] = None
    return await _save_item(update.message, context)


async def _save_item(message, context):
    ud = context.user_data
    db.create_shop_item(
        ud["new_item_band"], ud["new_item_name"], ud["new_item_price"],
        ud["new_item_desc"], ud.get("new_item_voice"), ud.get("new_item_photo")
    )
    sent = await message.reply_text(f"✅ محصول «{ud['new_item_name']}» ثبت شد! 🛍", reply_markup=MAIN_COACH_KB)
    track_message(context, message.chat_id, sent.message_id)
    return ConversationHandler.END


# ─── Item Detail (Coach) ──────────────────────────────────────────────────────

async def shop_item_detail_coach(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    item_id = int(query.data.split("_")[-1])
    item = db.get_shop_item(item_id)
    chat_id = query.message.chat_id
    await delete_bot_messages(context, chat_id)
    kb = _build([
        [("🗑 حذف محصول", f"shop_delitem_{item_id}")],
        [("🔙 بازگشت", f"shop_band_{item['band_id']}")],
    ])
    caption = (f"🛍 *{item['name']}*\n"
               f"💰 قیمت: {item['price']:,} تومان\n"
               f"📝 {item['description'] or '---'}")
    if item.get("photo_file_id"):
        sent = await query.message.reply_photo(
            photo=item["photo_file_id"], caption=caption, reply_markup=kb, parse_mode="Markdown")
    else:
        sent = await query.message.reply_text(caption, reply_markup=kb, parse_mode="Markdown")
    if item.get("voice_file_id"):
        await query.message.reply_voice(voice=item["voice_file_id"])
    track_message(context, chat_id, sent.message_id)


async def shop_delete_item(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    item_id = int(query.data.split("_")[-1])
    item = db.get_shop_item(item_id)
    db.delete_shop_item(item_id)
    sent = await query.message.reply_text(f"🗑 محصول «{item['name']}» حذف شد.", reply_markup=MAIN_COACH_KB)
    track_message(context, query.message.chat_id, sent.message_id)


# ─── Orders (Coach) ───────────────────────────────────────────────────────────

async def shop_orders_list(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    orders = db.get_all_orders()
    chat_id = query.message.chat_id
    await delete_bot_messages(context, chat_id)
    if not orders:
        sent = await query.message.reply_text("📦 هیچ سفارشی ثبت نشده.")
        track_message(context, chat_id, sent.message_id)
        return
    STATUS_EMOJI = {"pending": "⏳", "confirmed": "✅", "shipped": "🚚", "done": "✔️"}
    rows = []
    for o in orders:
        em = STATUS_EMOJI.get(o["status"], "❓")
        label = f"{em} {o['athlete_name']} — {o['item_name']} × {o['quantity']}"
        rows.append([InlineKeyboardButton(label, callback_data=f"order_detail_{o['id']}")])
    rows.append([InlineKeyboardButton("🏠 بازگشت", callback_data="main_menu")])
    sent = await query.message.reply_text("📦 *لیست سفارشات:*",
                                          reply_markup=InlineKeyboardMarkup(rows), parse_mode="Markdown")
    track_message(context, chat_id, sent.message_id)


async def order_detail(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    order_id = int(query.data.split("_")[-1])
    orders = db.get_all_orders()
    o = next((x for x in orders if x["id"] == order_id), None)
    if not o:
        await query.answer("سفارش پیدا نشد", show_alert=True)
        return
    chat_id = query.message.chat_id
    await delete_bot_messages(context, chat_id)
    STATUS_MAP = {"pending":"⏳ در انتظار","confirmed":"✅ تأیید شد","shipped":"🚚 ارسال شد","done":"✔️ تحویل شد"}
    kb = _build([
        [("✅ تأیید", f"order_status_{order_id}_confirmed"),
         ("🚚 ارسال شد", f"order_status_{order_id}_shipped")],
        [("✔️ تحویل داده شد", f"order_status_{order_id}_done")],
        [("👤 مشخصات خریدار", f"order_buyer_{order_id}")],
        [("🔙 بازگشت", "shop_orders_list")],
    ])
    text = (
        f"📦 *جزئیات سفارش \\#{order_id}*\n\n"
        f"👤 ورزشکار: {o['athlete_name']}\n"
        f"🛍 محصول: {o['item_name']}\n"
        f"💰 قیمت واحد: {o['price']:,} تومان\n"
        f"🔢 تعداد: {o['quantity']}\n"
        f"💵 مجموع: {o['price']*o['quantity']:,} تومان\n"
        f"📅 تاریخ: {o['created_at']}\n"
        f"📊 وضعیت: {STATUS_MAP.get(o['status'], o['status'])}"
    )
    sent = await query.message.reply_text(text, reply_markup=kb, parse_mode="Markdown")
    track_message(context, chat_id, sent.message_id)


async def order_buyer_info(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """Show full buyer (athlete) info for an order."""
    query = update.callback_query; await query.answer()
    order_id = int(query.data.split("_")[-1])
    orders = db.get_all_orders()
    o = next((x for x in orders if x["id"] == order_id), None)
    if not o:
        await query.answer("سفارش پیدا نشد", show_alert=True)
        return
    # Get full athlete profile
    athlete = db.get_athlete_by_name(o["athlete_name"])
    chat_id = query.message.chat_id
    await delete_bot_messages(context, chat_id)
    kb = _build([[("🔙 بازگشت به سفارش", f"order_detail_{order_id}")]])
    if athlete:
        text = (
            f"👤 *مشخصات خریدار*\n\n"
            f"نام: {athlete.get('full_name','---')}\n"
            f"یوزرنیم: @{athlete.get('username','---')}\n"
            f"سن: {athlete.get('age') or '---'}\n"
            f"قد: {athlete.get('height') or '---'} سانتی‌متر\n"
            f"وزن: {athlete.get('weight') or '---'} کیلوگرم\n"
            f"📞 موبایل: {athlete.get('phone') or '---'}\n"
            f"📅 اشتراک: {athlete.get('subscription_days','---')} روز"
        )
    else:
        text = f"👤 *{o['athlete_name']}*\n\nاطلاعات بیشتری یافت نشد."
    sent = await query.message.reply_text(text, reply_markup=kb, parse_mode="Markdown")
    track_message(context, chat_id, sent.message_id)


async def order_update_status(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    parts = query.data.split("_")
    order_id = int(parts[-2])
    status = parts[-1]
    db.update_order_status(order_id, status)
    STATUS_TEXT = {"confirmed": "✅ تأیید شد", "shipped": "🚚 ارسال شد", "done": "✔️ تحویل داده شد"}
    sent = await query.message.reply_text(f"{STATUS_TEXT.get(status, status)} سفارش #{order_id}", reply_markup=MAIN_COACH_KB)
    track_message(context, query.message.chat_id, sent.message_id)


# ══════════════════════════════════════════════════════════════════════════════
#  ATHLETE — SHOP (accessed via /start for non-registered or athlete panel)
# ══════════════════════════════════════════════════════════════════════════════

async def athlete_shop_menu(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """Entry for both registered athletes and guests."""
    query = update.callback_query
    if query:
        await query.answer()
        chat_id = query.message.chat_id
        send = query.message.reply_text
    else:
        chat_id = update.effective_chat.id
        send = update.message.reply_text

    await delete_bot_messages(context, chat_id)
    bands = db.get_all_shop_bands()
    if not bands:
        sent = await send("🛒 فروشگاه در حال راه‌اندازی است. به زودی برمی‌گردیم! 🙏")
        track_message(context, chat_id, sent.message_id)
        return

    rows = [[InlineKeyboardButton(f"🏷 {b['name']}", callback_data=f"ath_shop_band_{b['id']}")] for b in bands]
    # Back to athlete panel if logged in
    if context.user_data.get("athlete_user_id"):
        rows.append([InlineKeyboardButton("🔙 بازگشت", callback_data="ath_back_panel")])

    sent = await send("🛒 *فروشگاه*\nدسته‌بندی مورد نظرت رو انتخاب کن:",
                      reply_markup=InlineKeyboardMarkup(rows), parse_mode="Markdown")
    track_message(context, chat_id, sent.message_id)


async def ath_shop_band(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    band_id = int(query.data.split("_")[-1])
    band = db.get_shop_band(band_id)
    items = db.get_items_by_band(band_id)
    chat_id = query.message.chat_id
    await delete_bot_messages(context, chat_id)
    if not items:
        sent = await query.message.reply_text(f"🏷 *{band['name']}*\n\nهنوز محصولی ثبت نشده.",
                                              parse_mode="Markdown")
        track_message(context, chat_id, sent.message_id)
        return
    rows = [[InlineKeyboardButton(f"🛍 {it['name']} — {it['price']:,} تومان",
                                  callback_data=f"ath_shop_item_{it['id']}")] for it in items]
    rows.append([InlineKeyboardButton("🔙 بازگشت", callback_data="ath_shop_menu")])
    sent = await query.message.reply_text(f"🏷 *{band['name']}*\nمحصولات موجود:",
                                          reply_markup=InlineKeyboardMarkup(rows), parse_mode="Markdown")
    track_message(context, chat_id, sent.message_id)


async def ath_shop_item(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    item_id = int(query.data.split("_")[-1])
    item = db.get_shop_item(item_id)
    context.user_data["ordering_item"] = item_id
    chat_id = query.message.chat_id
    await delete_bot_messages(context, chat_id)
    kb = InlineKeyboardMarkup([
        [InlineKeyboardButton("🛒 سفارش دادن", callback_data=f"ath_order_{item_id}")],
        [InlineKeyboardButton("🔙 بازگشت", callback_data=f"ath_shop_band_{item['band_id']}")],
    ])
    caption = (f"🛍 *{item['name']}*\n"
               f"💰 قیمت: {item['price']:,} تومان\n\n"
               f"📝 {item['description'] or '---'}")
    if item.get("photo_file_id"):
        sent = await query.message.reply_photo(photo=item["photo_file_id"], caption=caption,
                                               reply_markup=kb, parse_mode="Markdown")
    else:
        sent = await query.message.reply_text(caption, reply_markup=kb, parse_mode="Markdown")
    if item.get("voice_file_id"):
        await query.message.reply_voice(voice=item["voice_file_id"])
    track_message(context, chat_id, sent.message_id)


async def ath_order_start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    athlete_id = context.user_data.get("athlete_user_id")
    if not athlete_id:
        sent = await query.message.reply_text(
            "⚠️ برای ثبت سفارش باید با یوزرنیم تلگرام خود ثبت‌نام کرده باشید.\nبا مربی تماس بگیرید. 📞")
        track_message(context, query.message.chat_id, sent.message_id)
        return
    item_id = int(query.data.split("_")[-1])
    context.user_data["ordering_item"] = item_id
    sent = await query.message.reply_text("🔢 چند عدد میخوای سفارش بدی؟", reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton("🔙 بازگشت", callback_data="main_menu")]]))
    track_message(context, query.message.chat_id, sent.message_id)
    return SHOP_ORDER_COUNT


async def ath_order_got_count(update: Update, context: ContextTypes.DEFAULT_TYPE):
    text = normalize_digits(update.message.text.strip())
    if not text.isdigit() or int(text) < 1:
        sent = await update.message.reply_text("❗️ عدد معتبر وارد کن.")
        track_message(context, update.effective_chat.id, sent.message_id)
        return SHOP_ORDER_COUNT
    qty = int(text)
    athlete_id = context.user_data["athlete_user_id"]
    item_id = context.user_data["ordering_item"]
    item = db.get_shop_item(item_id)
    order_id = db.create_order(athlete_id, item_id, qty)
    athlete = db.get_athlete(athlete_id)
    chat_id = update.effective_chat.id
    await delete_bot_messages(context, chat_id)
    sent = await update.message.reply_text(
        f"✅ سفارش {qty} عدد «{item['name']}» ثبت شد!\n"
        f"💰 مبلغ کل: {item['price']*qty:,} تومان\n\n"
        f"مربی در اسرع وقت باهاتون تماس می‌گیره 🙏")
    track_message(context, chat_id, sent.message_id)

    # ── Notify coach ──
    from config.settings import COACHES, COACH_CHAT_ID
    notify_text = (
        f"🔔 *سفارش جدید!*\n\n"
        f"👤 خریدار: {athlete.get('full_name','---')}\n"
        f"📱 موبایل: {athlete.get('phone','---')}\n"
        f"🛍 محصول: {item['name']}\n"
        f"🔢 تعداد: {qty}\n"
        f"💰 مجموع: {item['price']*qty:,} تومان\n"
        f"🆔 شماره سفارش: #{order_id}"
    )
    if COACH_CHAT_ID:
        try:
            await context.bot.send_message(
                chat_id=COACH_CHAT_ID,
                text=notify_text,
                parse_mode="Markdown"
            )
        except Exception:
            pass

    return ConversationHandler.END



# ─── Conversations ────────────────────────────────────────────────────────────

add_band_conv = ConversationHandler(
    entry_points=[CallbackQueryHandler(shop_add_band_start, pattern="^shop_add_band$")],
    states={SHOP_ADD_BAND_NAME: [MessageHandler(filters.TEXT & ~filters.COMMAND, shop_add_band_got_name)]},
    fallbacks=[CallbackQueryHandler(_cancel, pattern="^main_menu$")],
    per_message=False,
)

add_item_conv = ConversationHandler(
    entry_points=[CallbackQueryHandler(shop_additem_start, pattern=r"^shop_additem_\d+$")],
    states={
        SHOP_ADD_ITEM_NAME:  [MessageHandler(filters.TEXT & ~filters.COMMAND, shop_additem_got_name)],
        SHOP_ADD_ITEM_PRICE: [MessageHandler(filters.TEXT & ~filters.COMMAND, shop_additem_got_price)],
        SHOP_ADD_ITEM_DESC:  [MessageHandler(filters.TEXT & ~filters.COMMAND, shop_additem_got_desc)],
        SHOP_ADD_ITEM_VOICE: [
            CallbackQueryHandler(shop_additem_skip_voice, pattern="^skip_item_voice$"),
            MessageHandler(filters.VOICE, shop_additem_got_voice),
            MessageHandler(filters.TEXT & ~filters.COMMAND, shop_additem_got_voice),
        ],
        SHOP_ADD_ITEM_PHOTO: [
            CallbackQueryHandler(shop_additem_skip_photo, pattern="^skip_item_photo$"),
            MessageHandler(filters.PHOTO, shop_additem_got_photo),
            MessageHandler(filters.TEXT & ~filters.COMMAND, shop_additem_got_photo),
        ],
    },
    fallbacks=[CallbackQueryHandler(_cancel, pattern="^main_menu$")],
    per_message=False,
)

ath_order_conv = ConversationHandler(
    entry_points=[CallbackQueryHandler(ath_order_start, pattern=r"^ath_order_\d+$")],
    states={SHOP_ORDER_COUNT: [MessageHandler(filters.TEXT & ~filters.COMMAND, ath_order_got_count)]},
    fallbacks=[CallbackQueryHandler(_cancel, pattern="^main_menu$")],
    per_message=False,
)


def register(app):
    # Coach shop
    app.add_handler(MessageHandler(filters.Regex("^🛒 فروشگاه$"), coach_shop_menu))
    app.add_handler(add_band_conv)
    app.add_handler(add_item_conv)
    app.add_handler(CallbackQueryHandler(shop_bands_list,       pattern="^shop_bands_list$"))
    app.add_handler(CallbackQueryHandler(shop_band_detail,      pattern=r"^shop_band_\d+$"))
    app.add_handler(CallbackQueryHandler(shop_delete_band,      pattern=r"^shop_delband_\d+$"))
    app.add_handler(CallbackQueryHandler(shop_item_detail_coach,pattern=r"^shop_item_\d+$"))
    app.add_handler(CallbackQueryHandler(shop_delete_item,      pattern=r"^shop_delitem_\d+$"))
    app.add_handler(CallbackQueryHandler(shop_orders_list,       pattern="^shop_orders_list$"))
    app.add_handler(CallbackQueryHandler(order_detail,           pattern=r"^order_detail_\d+$"))
    app.add_handler(CallbackQueryHandler(order_buyer_info,       pattern=r"^order_buyer_\d+$"))
    app.add_handler(CallbackQueryHandler(order_update_status,    pattern=r"^order_status_\d+_\w+$"))
    # Athlete shop
    app.add_handler(ath_order_conv)
    app.add_handler(CallbackQueryHandler(athlete_shop_menu,     pattern="^ath_shop_menu$"))
    app.add_handler(CallbackQueryHandler(ath_shop_band,         pattern=r"^ath_shop_band_\d+$"))
    app.add_handler(CallbackQueryHandler(ath_shop_item,         pattern=r"^ath_shop_item_\d+$"))
