"""Athlete training/diet/supplement/gallery handlers."""
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import (
    ContextTypes, ConversationHandler,
    MessageHandler, CallbackQueryHandler, filters,
)
import database.db as db
from config.settings import (
    ATH_TRAIN_SETS, ATH_TRAIN_REPS, ATH_DIET_TEXT, ATH_SUPP_TEXT,
    ATH_SEARCH_EX, ATH_PHOTO_UPLOAD, COACH_PHOTO_UPLOAD,
    ATH_EDIT_SELF_AGE, ATH_EDIT_SELF_HEIGHT, ATH_EDIT_SELF_WEIGHT,
    ATH_EDIT_SELF_PHONE, ATH_EX_PICK,
)
from utils.keyboards import (
    MAIN_COACH_KB, BACK_KB, SEARCH_EX_KB,
    athlete_training_menu_kb, new_or_default_kb,
    default_programs_kb, exercises_list_kb, save_or_add_kb, paginated_exercises_kb,
    athlete_days_kb, athlete_diet_menu_kb, default_diets_kb,
    athlete_panel_kb, SAVE_BACK_KB,
)
from utils.helpers import go_main_menu, track_message, delete_bot_messages, persian_num, normalize_digits
from utils.jalali import today_jalali, format_jalali


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


async def _cancel_to_athlete_panel(update, context):
    """لغو عملیات و بازگشت به پنل همان ورزشکار (نه منوی اصلی)."""
    query = update.callback_query
    if query:
        await query.answer()
        await _return_to_athlete_panel(query, context, from_message=False)
    else:
        await _return_to_athlete_panel(update, context, from_message=True)
    return ConversationHandler.END


async def _return_to_athlete_panel(query_or_update, context, from_message=False):
    athlete_id = context.user_data.get("selected_athlete")
    if not athlete_id:
        await go_main_menu(query_or_update, context)
        return
    athlete = db.get_athlete(athlete_id)
    if from_message:
        chat_id = query_or_update.effective_chat.id
        await delete_bot_messages(context, chat_id)
        sent = await query_or_update.effective_message.reply_text(
            f"👤 *{athlete['full_name']}*\n\n🔽 یکی از گزینه‌ها را انتخاب کن:",
            reply_markup=athlete_panel_kb(), parse_mode="Markdown")
    else:
        chat_id = query_or_update.message.chat_id
        await delete_bot_messages(context, chat_id)
        sent = await query_or_update.message.reply_text(
            f"👤 *{athlete['full_name']}*\n\n🔽 یکی از گزینه‌ها را انتخاب کن:",
            reply_markup=athlete_panel_kb(), parse_mode="Markdown")
    track_message(context, chat_id, sent.message_id)


# ══ TRAINING ══════════════════════════════════════════════════════════════════

async def ath_training_menu(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    chat_id = query.message.chat_id; await delete_bot_messages(context, chat_id)
    sent = await query.message.reply_text(
        "🏋️ *برنامه تمرینی*\nیکی از گزینه‌ها را انتخاب کن:",
        reply_markup=athlete_training_menu_kb(), parse_mode="Markdown")
    track_message(context, chat_id, sent.message_id)


async def ath_add_train(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    chat_id = query.message.chat_id; await delete_bot_messages(context, chat_id)
    sent = await query.message.reply_text("نوع برنامه را انتخاب کن:", reply_markup=new_or_default_kb())
    track_message(context, chat_id, sent.message_id)


async def ath_train_from_default(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    programs = db.get_all_default_programs()
    chat_id = query.message.chat_id; await delete_bot_messages(context, chat_id)
    if not programs:
        sent = await query.message.reply_text("❌ هیچ برنامه پیش‌فرضی ثبت نشده.")
        track_message(context, chat_id, sent.message_id); return
    sent = await query.message.reply_text("📋 یک برنامه پیش‌فرض انتخاب کن:",
        reply_markup=default_programs_kb(programs, prefix="ath_use_def"))
    track_message(context, chat_id, sent.message_id)


async def ath_use_default_program(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    program_id = int(query.data.split("_")[-1])
    athlete_id = context.user_data.get("selected_athlete")
    day_num = db.copy_default_program_to_athlete(athlete_id, program_id)
    prog = db.get_default_program(program_id)
    await query.message.reply_text(f"✅ برنامه *{prog['name']}* به عنوان روز {persian_num(day_num)} ذخیره شد! 💪",
                                   parse_mode="Markdown")
    await _return_to_athlete_panel(query, context)



def _ath_ex_kb(page=0, exercises=None):
    if exercises is None:
        exercises = db.get_all_exercises()
    return paginated_exercises_kb(
        exercises, prefix="ath_ex", page=page, nav_cb="athexpg",
        search_callback="search_exercise", back_cb="back_to_athlete_panel")


async def ath_ex_page(update, context):
    """ورق زدن صفحات لیست حرکات."""
    query = update.callback_query; await query.answer()
    page = int(query.data.split("_")[-1])
    try:
        await query.message.edit_reply_markup(reply_markup=_ath_ex_kb(page))
    except Exception:
        pass
    return ATH_EX_PICK

async def ath_train_new_start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    athlete_id = context.user_data.get("selected_athlete")
    day_num = db.get_athlete_day_count(athlete_id) + 1
    context.user_data["ath_day_num"] = day_num
    context.user_data.pop("ath_tmp_ex", None)
    exercises = db.get_all_exercises()
    if not exercises:
        sent = await query.message.reply_text("❌ ابتدا حرکاتی در کتابخانه ثبت کنید.")
        track_message(context, query.message.chat_id, sent.message_id)
        return ConversationHandler.END
    chat_id = query.message.chat_id; await delete_bot_messages(context, chat_id)
    ex_kb = _ath_ex_kb(0, exercises)
    sent = await query.message.reply_text(
        f"📅 *روز {persian_num(day_num)}*\n\n🏃 یک حرکت انتخاب کن 👇",
        reply_markup=ex_kb,
        parse_mode="Markdown")
    track_message(context, chat_id, sent.message_id)
    s2 = await query.message.reply_text("🔍 یا جستجو کن:", reply_markup=SEARCH_EX_KB)
    track_message(context, chat_id, s2.message_id)
    return ATH_EX_PICK


async def ath_search_exercise_start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """User pressed search button (callback)."""
    if update.callback_query:
        await update.callback_query.answer()
        chat_id = update.callback_query.message.chat_id
        send_func = update.callback_query.message.reply_text
    else:
        chat_id = update.effective_chat.id
        send_func = update.message.reply_text
    await delete_bot_messages(context, chat_id)
    sent = await send_func(
        "🔍 نام حرکت را بنویس:",
        reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton("🔙 بازگشت", callback_data="back_to_athlete_panel")]]))
    track_message(context, chat_id, sent.message_id)
    return ATH_SEARCH_EX


async def ath_search_exercise_got_query(update: Update, context: ContextTypes.DEFAULT_TYPE):
    q = update.message.text.strip()
    results = db.search_exercises(q)
    chat_id = update.effective_chat.id
    await delete_bot_messages(context, chat_id)
    context.user_data["last_search"] = q
    add_row = [InlineKeyboardButton(f"➕ افزودن «{q}» به حرکات", callback_data="ath_addex_new")]
    if not results:
        all_ex = db.get_all_exercises()
        kb = _ath_ex_kb(0, all_ex)
        kb.inline_keyboard.insert(0, add_row)
        sent = await update.message.reply_text(
            f"❌ حرکتی با «{q}» پیدا نشد. می‌تونی اضافه‌اش کنی یا از لیست انتخاب کنی:",
            reply_markup=InlineKeyboardMarkup(kb.inline_keyboard))
        track_message(context, chat_id, sent.message_id)
        s2 = await update.message.reply_text("🔍 یا جستجو کن:", reply_markup=SEARCH_EX_KB)
        track_message(context, chat_id, s2.message_id)
        return ATH_EX_PICK
    kb = paginated_exercises_kb(results, prefix="ath_ex", page=0, nav_cb="athexpg", search_callback="search_exercise", back_cb="back_to_athlete_panel")
    kb.inline_keyboard.append(add_row)
    sent = await update.message.reply_text(
        f"🔍 نتایج «{q}»:",
        reply_markup=InlineKeyboardMarkup(kb.inline_keyboard))
    track_message(context, chat_id, sent.message_id)
    s2 = await update.message.reply_text("🔍 یا جستجو کن:", reply_markup=SEARCH_EX_KB)
    track_message(context, chat_id, s2.message_id)
    return ATH_EX_PICK


async def ath_exercise_chosen(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    exercise_id = int(query.data.split("_")[-1])
    context.user_data["ath_tmp_ex"] = exercise_id
    ex = db.get_exercise(exercise_id)
    chat_id = query.message.chat_id; await delete_bot_messages(context, chat_id)
    kb = InlineKeyboardMarkup([
        [InlineKeyboardButton("🔙 بازگشت به لیست حرکات", callback_data="ath_back_to_exlist")],
    ])
    if ex.get("is_cardio"):
        # هوازی: زمان می‌پرسیم، نه ست/تکرار
        context.user_data["ath_tmp_sets"] = 0
        sent = await query.message.reply_text(
            f"🏃 *{ex['name']}* (هوازی)\n\n⏱ چند دقیقه؟",
            parse_mode="Markdown", reply_markup=kb)
        track_message(context, chat_id, sent.message_id)
        return ATH_TRAIN_REPS
    sent = await query.message.reply_text(
        f"💪 *{ex['name']}*\n\nچند ست؟",
        parse_mode="Markdown", reply_markup=kb)
    track_message(context, chat_id, sent.message_id)
    return ATH_TRAIN_SETS


async def ath_back_to_exlist(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """بازگشت به لیست حرکات بدون لغو کامل عملیات."""
    query = update.callback_query; await query.answer()
    context.user_data.pop("ath_tmp_ex", None)
    day_num = context.user_data.get("ath_day_num", 1)
    exercises = db.get_all_exercises()
    chat_id = query.message.chat_id; await delete_bot_messages(context, chat_id)
    ex_kb = _ath_ex_kb(0, exercises)
    sent = await query.message.reply_text(
        f"📅 *روز {persian_num(day_num)}*\n\n🏃 یک حرکت انتخاب کن 👇",
        reply_markup=ex_kb, parse_mode="Markdown")
    track_message(context, chat_id, sent.message_id)
    s2 = await query.message.reply_text("🔍 یا جستجو کن:", reply_markup=SEARCH_EX_KB)
    track_message(context, chat_id, s2.message_id)
    return ATH_EX_PICK


async def ath_got_sets(update: Update, context: ContextTypes.DEFAULT_TYPE):
    text = normalize_digits(update.message.text.strip())
    if not text.isdigit():
        sent = await update.message.reply_text("❗️ فقط عدد وارد کن.")
        track_message(context, update.effective_chat.id, sent.message_id)
        return ATH_TRAIN_SETS
    context.user_data["ath_tmp_sets"] = int(text)
    chat_id = update.effective_chat.id; await delete_bot_messages(context, chat_id)
    sent = await update.message.reply_text(
        "🔢 چند تکرار؟",
        reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton("🔙 بازگشت به لیست حرکات", callback_data="ath_back_to_exlist")]]))
    track_message(context, chat_id, sent.message_id)
    return ATH_TRAIN_REPS


async def ath_got_reps(update: Update, context: ContextTypes.DEFAULT_TYPE):
    reps = update.message.text.strip()
    athlete_id = context.user_data.get("selected_athlete")
    day_num    = context.user_data.get("ath_day_num")
    ex_id      = context.user_data.get("ath_tmp_ex")
    sets       = context.user_data.get("ath_tmp_sets")
    if not all([athlete_id, day_num, ex_id]) or sets is None:
        await go_main_menu(update, context)
        return ConversationHandler.END
    if sets == 0:
        reps = normalize_digits(reps)
        if not reps.isdigit():
            sent = await update.message.reply_text("❗️ فقط عدد (دقیقه) وارد کن.")
            track_message(context, update.effective_chat.id, sent.message_id)
            return ATH_TRAIN_REPS
    context.user_data["ath_last_row"] = db.add_exercise_to_athlete_day(athlete_id, day_num, ex_id, sets, reps)
    ex = db.get_exercise(ex_id)
    chat_id = update.effective_chat.id; await delete_bot_messages(context, chat_id)
    label = (f"⏱ {reps} دقیقه" if sets == 0 else f"{sets} ست × {reps} تکرار")
    sent = await update.message.reply_text(
        f"✅ *{ex['name']}* — {label} ثبت شد.\n\nبعدی؟",
        reply_markup=save_or_add_kb(), parse_mode="Markdown")
    track_message(context, chat_id, sent.message_id)
    return ATH_TRAIN_REPS


async def ath_train_save(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    day_num = context.user_data.get("ath_day_num", 1)
    await query.message.reply_text(f"✅ برنامه روز {persian_num(day_num)} ذخیره شد! 💪")
    await _return_to_athlete_panel(query, context)
    return ConversationHandler.END


async def ath_addex_new(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """افزودن حرکت جدید از روی عبارت سرچ‌شده — اول نوعش را بپرس."""
    query = update.callback_query; await query.answer()
    name = context.user_data.get("last_search")
    if not name:
        return await ath_back_to_exlist(update, context)
    kb = InlineKeyboardMarkup([
        [InlineKeyboardButton("🏋️ قدرتی", callback_data="ath_addex_t_0"),
         InlineKeyboardButton("🏃 هوازی", callback_data="ath_addex_t_1")],
        [InlineKeyboardButton("🔙 بازگشت", callback_data="ath_back_to_exlist")],
    ])
    chat_id = query.message.chat_id; await delete_bot_messages(context, chat_id)
    sent = await query.message.reply_text(
        f"➕ *{name}*\n\nاین حرکت چه نوعیه؟", parse_mode="Markdown", reply_markup=kb)
    track_message(context, chat_id, sent.message_id)
    return ATH_EX_PICK


async def ath_addex_type(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    is_cardio = int(query.data.split("_")[-1])
    name = context.user_data.pop("last_search", None)
    if not name:
        return await ath_back_to_exlist(update, context)
    ex_id = db.execute("INSERT INTO default_exercises (name, is_cardio) VALUES (?,?)",
                       (name, is_cardio))
    query.data = f"ath_ex_{ex_id}"
    return await ath_exercise_chosen(update, context)


async def ath_train_superset(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """حرکت قبلی را سوپرست علامت بزن و برو سراغ حرکت بعدی."""
    row_id = context.user_data.get("ath_last_row")
    if row_id:
        db.set_training_superset(row_id)
    return await ath_train_add_more(update, context)


async def ath_train_add_more(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    context.user_data.pop("ath_tmp_ex", None)
    day_num = context.user_data.get("ath_day_num", 1)
    exercises = db.get_all_exercises()
    chat_id = query.message.chat_id; await delete_bot_messages(context, chat_id)
    sent = await query.message.reply_text(
        f"📅 *روز {persian_num(day_num)}*\n\n🏃 حرکت بعدی را انتخاب کن 👇",
        reply_markup=_ath_ex_kb(0, exercises),
        parse_mode="Markdown")
    track_message(context, chat_id, sent.message_id)
    s2 = await query.message.reply_text("🔍 یا جستجو کن:", reply_markup=SEARCH_EX_KB)
    track_message(context, chat_id, s2.message_id)
    return ATH_EX_PICK


async def ath_del_train_menu(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    athlete_id = context.user_data.get("selected_athlete")
    days = db.get_athlete_training_days(athlete_id)
    chat_id = query.message.chat_id; await delete_bot_messages(context, chat_id)
    if not days:
        sent = await query.message.reply_text("❌ هیچ برنامه‌ای ثبت نشده.")
        track_message(context, chat_id, sent.message_id); return
    sent = await query.message.reply_text("کدام روز را حذف کنی؟",
        reply_markup=athlete_days_kb(days, athlete_id))
    track_message(context, chat_id, sent.message_id)


async def ath_del_day(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    parts = query.data.split("_")
    athlete_id = int(parts[-2]); day_num = int(parts[-1])
    db.delete_athlete_training_day(athlete_id, day_num)
    await query.message.reply_text(f"🗑 روز {persian_num(day_num)} حذف شد.")
    await _return_to_athlete_panel(query, context)


# ══ DIET ══════════════════════════════════════════════════════════════════════

async def ath_diet_menu(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    chat_id = query.message.chat_id; await delete_bot_messages(context, chat_id)
    sent = await query.message.reply_text("🥗 *برنامه غذایی*\nیکی از گزینه‌ها را انتخاب کن:",
        reply_markup=athlete_diet_menu_kb(), parse_mode="Markdown")
    track_message(context, chat_id, sent.message_id)


async def ath_diet_new_start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    chat_id = query.message.chat_id; await delete_bot_messages(context, chat_id)
    sent = await query.message.reply_text(
        "📝 متن رژیم غذایی را ارسال کن.\n"
        "وقتی تمام شد دکمه *💾 ذخیره رژیم* را بزن:",
        reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton("🔙 بازگشت", callback_data="back_to_athlete_panel")]]), parse_mode="Markdown")
    track_message(context, chat_id, sent.message_id)
    context.user_data["diet_text_buffer"] = ""
    return ATH_DIET_TEXT


async def ath_diet_got_text(update: Update, context: ContextTypes.DEFAULT_TYPE):
    # حالت ۱: کاربر دکمه‌ی «💾 ذخیره رژیم» (اینلاین) را زده است
    if update.callback_query:
        query = update.callback_query
        await query.answer()
        buf = context.user_data.get("diet_text_buffer", "").strip()
        if not buf:
            sent = await query.message.reply_text("❗️ هنوز متنی وارد نکردی.")
            track_message(context, query.message.chat_id, sent.message_id)
            return ATH_DIET_TEXT
        athlete_id = context.user_data.get("selected_athlete")
        db.set_athlete_diet(athlete_id, buf)
        chat_id = query.message.chat_id
        await delete_bot_messages(context, chat_id)
        sent = await query.message.reply_text("✅ برنامه غذایی ذخیره شد! 🥗")
        track_message(context, chat_id, sent.message_id)
        await _return_to_athlete_panel(query, context, from_message=False)
        return ConversationHandler.END

    # حالت ۲: کاربر متن رژیم را ارسال کرده - به بافر اضافه می‌شود
    txt = update.message.text.strip()
    context.user_data["diet_text_buffer"] = (context.user_data.get("diet_text_buffer", "") + "\n" + txt).strip()
    chat_id = update.effective_chat.id
    await delete_bot_messages(context, chat_id)
    sent = await update.message.reply_text(
        "📝 متن دریافت شد. می‌توانی ادامه بدهی یا ذخیره کنی:",
        reply_markup=InlineKeyboardMarkup([
            [InlineKeyboardButton("💾 ذخیره رژیم", callback_data="diet_save_now")],
            [InlineKeyboardButton("🔙 بازگشت", callback_data="back_to_athlete_panel")],
        ]))
    track_message(context, chat_id, sent.message_id)
    return ATH_DIET_TEXT


async def ath_diet_from_default(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    diets = db.get_all_default_diets()
    chat_id = query.message.chat_id; await delete_bot_messages(context, chat_id)
    if not diets:
        sent = await query.message.reply_text("❌ هیچ رژیم پیش‌فرضی ثبت نشده.")
        track_message(context, chat_id, sent.message_id); return
    sent = await query.message.reply_text("🥗 یک رژیم پیش‌فرض انتخاب کن:",
        reply_markup=default_diets_kb(diets, prefix="ath_use_diet"))
    track_message(context, chat_id, sent.message_id)


async def ath_use_default_diet(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    diet_id = int(query.data.split("_")[-1])
    diet = db.get_default_diet(diet_id)
    athlete_id = context.user_data.get("selected_athlete")
    db.set_athlete_diet(athlete_id, diet["diet_text"])
    await query.message.reply_text(f"✅ رژیم *{diet['name']}* ذخیره شد! 🥗", parse_mode="Markdown")
    await _return_to_athlete_panel(query, context)


# ══ SUPPLEMENT ════════════════════════════════════════════════════════════════

async def ath_supp_start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    chat_id = query.message.chat_id; await delete_bot_messages(context, chat_id)
    # Clear any stale state from other conversations
    context.user_data.pop("edit_field", None)
    context.user_data.pop("new_diet_name", None)
    sent = await query.message.reply_text(
"💊 متن برنامه مکمل را وارد کن:",
        reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton("🔙 بازگشت", callback_data="back_to_athlete_panel")]]))
    track_message(context, chat_id, sent.message_id)
    return ATH_SUPP_TEXT


async def ath_supp_got_text(update: Update, context: ContextTypes.DEFAULT_TYPE):
    athlete_id = context.user_data.get("selected_athlete")
    if not athlete_id:
        await go_main_menu(update, context)
        return ConversationHandler.END
    db.set_athlete_supplement(athlete_id, update.message.text.strip())
    chat_id = update.effective_chat.id
    await delete_bot_messages(context, chat_id)
    sent = await update.message.reply_text("✅ برنامه مکمل ذخیره شد! 💊")
    track_message(context, chat_id, sent.message_id)
    await _return_to_athlete_panel(update, context, from_message=True)
    return ConversationHandler.END


# ══ GALLERY (Coach view) ══════════════════════════════════════════════════════

async def ath_gallery_coach(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    athlete_id = context.user_data.get("selected_athlete")
    photos = db.get_athlete_photos(athlete_id)
    chat_id = query.message.chat_id; await delete_bot_messages(context, chat_id)
    back_kb = InlineKeyboardMarkup([[InlineKeyboardButton("🔙 بازگشت به پنل ورزشکار", callback_data="back_to_athlete_panel")]])
    athlete = db.get_athlete(athlete_id)
    gallery_kb = InlineKeyboardMarkup([
        [InlineKeyboardButton("📤 افزودن عکس", callback_data="coach_add_photo")],
        [InlineKeyboardButton("🔙 بازگشت به پنل ورزشکار", callback_data="back_to_athlete_panel")],
    ])
    if not photos:
        sent = await query.message.reply_text(
            f"📸 گالری {athlete['full_name']} - هنوز عکسی ثبت نشده.",
            reply_markup=gallery_kb, parse_mode="Markdown")
        track_message(context, chat_id, sent.message_id); return
    sent = await query.message.reply_text(
            f"📸 گالری {athlete['full_name']} - هنوز عکسی ثبت نشده.",
        reply_markup=gallery_kb, parse_mode="Markdown")
    track_message(context, chat_id, sent.message_id)
    for ph in photos[:10]:
        try:
            kb = InlineKeyboardMarkup([[InlineKeyboardButton(
                f"🗑 حذف",
                callback_data=f"del_photo_{ph['id']}")]])
            s = await query.message.reply_photo(photo=ph["file_id"],
                caption=f"📅 {format_jalali(ph['jalali_date'])}", reply_markup=kb)
            track_message(context, chat_id, s.message_id)
        except Exception:
            pass


async def del_photo(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    photo_id = int(query.data.split("_")[-1])
    db.delete_athlete_photo(photo_id)
    try:
        await query.message.delete()
    except Exception:
        pass
    back_kb = InlineKeyboardMarkup([[InlineKeyboardButton(
        "🔙 بازگشت به گالری", callback_data="ath_gallery_coach")]])
    sent = await query.message.reply_text("🗑 عکس حذف شد.", reply_markup=back_kb)
    track_message(context, query.message.chat_id, sent.message_id)


# ══ Conversations ══════════════════════════════════════════════════════════════

ath_train_new_conv = ConversationHandler(
    entry_points=[CallbackQueryHandler(ath_train_new_start, pattern="^ath_train_new$")],
    states={
        ATH_EX_PICK: [
            CallbackQueryHandler(ath_addex_new,             pattern="^ath_addex_new$"),
            CallbackQueryHandler(ath_addex_type,            pattern=r"^ath_addex_t_[01]$"),
            CallbackQueryHandler(ath_back_to_exlist,        pattern="^ath_back_to_exlist$"),
            CallbackQueryHandler(ath_ex_page,               pattern=r"^athexpg_\d+$"),
            CallbackQueryHandler(ath_exercise_chosen,       pattern=r"^ath_ex_\d+$"),
            CallbackQueryHandler(ath_search_exercise_start, pattern="^search_exercise$"),
            MessageHandler(filters.Regex("^🔍 جستجوی حرکت$"), ath_search_exercise_start),
        ],
        ATH_SEARCH_EX: [
            CallbackQueryHandler(ath_addex_new,             pattern="^ath_addex_new$"),
            CallbackQueryHandler(ath_addex_type,            pattern=r"^ath_addex_t_[01]$"),
            CallbackQueryHandler(ath_ex_page,               pattern=r"^athexpg_\d+$"),
            CallbackQueryHandler(ath_exercise_chosen,       pattern=r"^ath_ex_\d+$"),
            CallbackQueryHandler(ath_search_exercise_start, pattern="^search_exercise$"),
            MessageHandler(filters.Regex("^🔍 جستجوی حرکت$"), ath_search_exercise_start),
            MessageHandler(filters.TEXT & ~filters.COMMAND, ath_search_exercise_got_query),
        ],
        ATH_TRAIN_SETS: [
            CallbackQueryHandler(ath_back_to_exlist, pattern="^ath_back_to_exlist$"),
            MessageHandler(filters.TEXT & ~filters.COMMAND, ath_got_sets),
        ],
        ATH_TRAIN_REPS: [
            CallbackQueryHandler(ath_back_to_exlist, pattern="^ath_back_to_exlist$"),
            CallbackQueryHandler(ath_train_save,     pattern="^prog_save$"),
            CallbackQueryHandler(ath_train_add_more, pattern="^prog_add_more$"),
            CallbackQueryHandler(ath_train_superset, pattern="^prog_superset$"),
            MessageHandler(filters.TEXT & ~filters.COMMAND, ath_got_reps),
        ],
    },
    fallbacks=[
        MessageHandler(filters.Regex("^🏠 بازگشت به منوی اصلی$"), _cancel),
        CallbackQueryHandler(_cancel, pattern="^main_menu$"),
        CallbackQueryHandler(_cancel_to_athlete_panel, pattern="^back_to_athlete_panel$"),
    ],
    per_message=False,
    allow_reentry=True,
)

ath_diet_conv = ConversationHandler(
    entry_points=[CallbackQueryHandler(ath_diet_new_start, pattern="^ath_diet_new$")],
    states={ATH_DIET_TEXT: [
        MessageHandler(filters.TEXT & ~filters.COMMAND, ath_diet_got_text),
        CallbackQueryHandler(ath_diet_got_text, pattern="^diet_save_now$"),
    ]},
    fallbacks=[
        MessageHandler(filters.Regex("^🏠 بازگشت به منوی اصلی$"), _cancel),
        CallbackQueryHandler(_cancel, pattern="^main_menu$"),
        CallbackQueryHandler(_cancel_to_athlete_panel, pattern="^back_to_athlete_panel$"),
    ],
    per_message=False,
)

ath_supp_conv = ConversationHandler(
    entry_points=[CallbackQueryHandler(ath_supp_start, pattern="^ath_supplement$")],
    states={ATH_SUPP_TEXT: [MessageHandler(filters.TEXT & ~filters.COMMAND, ath_supp_got_text)]},
    fallbacks=[
        MessageHandler(filters.Regex("^🏠 بازگشت به منوی اصلی$"), _cancel),
        CallbackQueryHandler(_cancel, pattern="^main_menu$"),
        CallbackQueryHandler(_cancel_to_athlete_panel, pattern="^back_to_athlete_panel$"),
    ],
    per_message=False,
)



async def coach_add_photo_start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """Coach starts uploading photo for athlete."""
    query = update.callback_query; await query.answer()
    chat_id = query.message.chat_id
    await delete_bot_messages(context, chat_id)
    sent = await query.message.reply_text(
        "📤 عکس ورزشکار را ارسال کن:",
        reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton("🔙 بازگشت", callback_data="ath_gallery_coach")]]))
    track_message(context, chat_id, sent.message_id)
    return COACH_PHOTO_UPLOAD


async def coach_got_photo(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """Coach uploaded a photo for athlete."""
    if not update.message.photo:
        sent = await update.message.reply_text("❗️ لطفاً عکس ارسال کن.")
        track_message(context, update.effective_chat.id, sent.message_id)
        return COACH_PHOTO_UPLOAD
    athlete_id = context.user_data.get("selected_athlete")
    file_id = update.message.photo[-1].file_id
    jalali = today_jalali()
    db.add_athlete_photo(athlete_id, file_id, jalali)
    chat_id = update.effective_chat.id
    await delete_bot_messages(context, chat_id)
    kb = InlineKeyboardMarkup([[InlineKeyboardButton("📸 مشاهده گالری", callback_data="ath_gallery_coach")]])
    sent = await update.message.reply_text(
        f"✅ عکس با تاریخ *{format_jalali(jalali)}* ذخیره شد!",
        reply_markup=kb, parse_mode="Markdown")
    track_message(context, chat_id, sent.message_id)
    return ConversationHandler.END


coach_photo_conv = ConversationHandler(
    entry_points=[CallbackQueryHandler(coach_add_photo_start, pattern="^coach_add_photo$")],
    states={COACH_PHOTO_UPLOAD: [MessageHandler(filters.PHOTO, coach_got_photo)]},
    fallbacks=[
        CallbackQueryHandler(_cancel, pattern="^main_menu$"),
        CallbackQueryHandler(_cancel_to_athlete_panel, pattern="^back_to_athlete_panel$"),
        CallbackQueryHandler(ath_gallery_coach, pattern="^ath_gallery_coach$"),
    ],
    per_message=False,
)


def register(app):
    app.add_handler(CallbackQueryHandler(ath_training_menu,       pattern="^ath_training$"))
    app.add_handler(CallbackQueryHandler(ath_diet_menu,           pattern="^ath_diet$"))
    app.add_handler(CallbackQueryHandler(ath_add_train,           pattern="^ath_add_train$"))
    app.add_handler(CallbackQueryHandler(ath_train_from_default,  pattern="^ath_train_from_default$"))
    app.add_handler(CallbackQueryHandler(ath_use_default_program, pattern=r"^ath_use_def_\d+$"))
    app.add_handler(ath_train_new_conv)
    app.add_handler(CallbackQueryHandler(ath_del_train_menu,      pattern="^ath_del_train$"))
    app.add_handler(CallbackQueryHandler(ath_del_day,             pattern=r"^del_ath_day_\d+_\d+$"))
    app.add_handler(ath_diet_conv)
    app.add_handler(CallbackQueryHandler(ath_diet_from_default,   pattern="^ath_diet_from_default$"))
    app.add_handler(CallbackQueryHandler(ath_use_default_diet,    pattern=r"^ath_use_diet_\d+$"))
    app.add_handler(ath_supp_conv)
    app.add_handler(CallbackQueryHandler(ath_gallery_coach,       pattern="^ath_gallery_coach$"))
    app.add_handler(CallbackQueryHandler(del_photo,               pattern=r"^del_photo_\d+$"))
    app.add_handler(coach_photo_conv)
