from telegram import Update, InlineKeyboardMarkup, InlineKeyboardButton
from telegram.ext import (
    ContextTypes, ConversationHandler, CommandHandler,
    MessageHandler, CallbackQueryHandler, filters,
)
import database.db as db
from config.settings import (
    ADD_USERNAME, ADD_NAME, ADD_AGE, ADD_HEIGHT, ADD_WEIGHT, ADD_PHONE, ADD_SUB,
    CHOOSE_EDIT_FIELD, EDIT_VALUE, SEARCH_QUERY, EDIT_FIELDS, EDIT_PROMPTS,
)
from utils.keyboards import (
    MAIN_COACH_KB, BACK_KB, athletes_kb, athlete_panel_kb,
    edit_fields_kb, confirm_delete_kb, athlete_selected_kb, skip_back_kb,
)
from utils.helpers import go_main_menu, track_message, delete_bot_messages, edit_or_delete_last_inline, normalize_digits


async def _cancel(update, context):
    context.user_data["registration_active"] = False
    await go_main_menu(update, context)
    return ConversationHandler.END


async def _send(update_or_msg, context, text, markup=None, parse_mode=None):
    """Send and track a message."""
    obj = update_or_msg
    if hasattr(obj, 'effective_chat'):
        chat_id = obj.effective_chat.id
        msg = obj.effective_message
    else:
        chat_id = obj.chat_id
        msg = obj
    kw = {"reply_markup": markup} if markup else {}
    if parse_mode:
        kw["parse_mode"] = parse_mode
    sent = await msg.reply_text(text, **kw)
    track_message(context, chat_id, sent.message_id)
    return sent


async def _show_athlete_panel(context, message, athlete_id):
    """Show the athlete panel inline menu — delete previous inline messages first."""
    athlete = db.get_athlete(athlete_id)
    chat_id = message.chat_id
    await delete_bot_messages(context, chat_id)
    sent = await 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)


# ─── Add Athlete ──────────────────────────────────────────────────────────────

async def add_athlete_start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    context.user_data.clear()
    context.user_data["registration_active"] = True
    sent = await update.message.reply_text("📱 یوزرنیم تلگرام ورزشکار را وارد کن:\n\n_(مثال: @ali123)_",
                                           reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton("🔙 بازگشت", callback_data="main_menu")]]), parse_mode="Markdown")
    track_message(context, update.effective_chat.id, sent.message_id)
    return ADD_USERNAME


async def got_username(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if not context.user_data.get("registration_active"):
        return ConversationHandler.END
    context.user_data["new_username"] = update.message.text.strip().lstrip("@")
    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 ADD_NAME


async def got_name(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if not context.user_data.get("registration_active"):
        return ConversationHandler.END
    context.user_data["new_name"] = update.message.text.strip()
    sent = await update.message.reply_text(
        "🎂 سن ورزشکار را وارد کن: _(اختیاری)_",
        reply_markup=skip_back_kb("skip_age"), parse_mode="Markdown")
    track_message(context, update.effective_chat.id, sent.message_id)
    return ADD_AGE


async def skip_age(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    context.user_data["new_age"] = None
    sent = await query.message.reply_text(
        "📏 قد ورزشکار را وارد کن (سانتی‌متر): _(اختیاری)_",
        reply_markup=skip_back_kb("skip_height"), parse_mode="Markdown")
    track_message(context, query.message.chat_id, sent.message_id)
    return ADD_HEIGHT


async def got_age(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if not context.user_data.get("registration_active"): return ConversationHandler.END
    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 ADD_AGE
    context.user_data["new_age"] = int(text)
    sent = await update.message.reply_text(
        "📏 قد ورزشکار را وارد کن (سانتی‌متر): _(اختیاری)_",
        reply_markup=skip_back_kb("skip_height"), parse_mode="Markdown")
    track_message(context, update.effective_chat.id, sent.message_id)
    return ADD_HEIGHT


async def skip_height(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    context.user_data["new_height"] = None
    sent = await query.message.reply_text(
        "⚖️ وزن ورزشکار را وارد کن (کیلوگرم): _(اختیاری)_",
        reply_markup=skip_back_kb("skip_weight"), parse_mode="Markdown")
    track_message(context, query.message.chat_id, sent.message_id)
    return ADD_WEIGHT


async def got_height(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if not context.user_data.get("registration_active"): return ConversationHandler.END
    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 ADD_HEIGHT
    context.user_data["new_height"] = int(text)
    sent = await update.message.reply_text(
        "⚖️ وزن ورزشکار را وارد کن (کیلوگرم): _(اختیاری)_",
        reply_markup=skip_back_kb("skip_weight"), parse_mode="Markdown")
    track_message(context, update.effective_chat.id, sent.message_id)
    return ADD_WEIGHT


async def skip_weight(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    context.user_data["new_weight"] = None
    sent = await query.message.reply_text(
        "📞 شماره موبایل ورزشکار را وارد کن: _(اختیاری)_",
        reply_markup=skip_back_kb("skip_phone"), parse_mode="Markdown")
    track_message(context, query.message.chat_id, sent.message_id)
    return ADD_PHONE


async def got_weight(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if not context.user_data.get("registration_active"): return ConversationHandler.END
    text = normalize_digits(update.message.text.strip().replace(",", "."))
    try:
        weight = float(text)
    except ValueError:
        sent = await update.message.reply_text("❗️ وزن را به صورت عدد وارد کن. مثال: 78.5")
        track_message(context, update.effective_chat.id, sent.message_id)
        return ADD_WEIGHT
    context.user_data["new_weight"] = weight
    sent = await update.message.reply_text(
        "📞 شماره موبایل ورزشکار را وارد کن: _(اختیاری)_",
        reply_markup=skip_back_kb("skip_phone"), parse_mode="Markdown")
    track_message(context, update.effective_chat.id, sent.message_id)
    return ADD_PHONE


async def skip_phone(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    context.user_data["new_phone"] = None
    sent = await query.message.reply_text(
        "📅 تعداد روز اشتراک را وارد کن: _(مثال: 30)_",
        reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton("🔙 بازگشت", callback_data="main_menu")]]),
        parse_mode="Markdown")
    track_message(context, query.message.chat_id, sent.message_id)
    return ADD_SUB


async def got_phone(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if not context.user_data.get("registration_active"): return ConversationHandler.END
    text = normalize_digits(update.message.text.strip())
    if not (text.isdigit() and 8 <= len(text) <= 15):
        sent = await update.message.reply_text("❗️ شماره موبایل معتبر نیست.")
        track_message(context, update.effective_chat.id, sent.message_id)
        return ADD_PHONE
    context.user_data["new_phone"] = text
    sent = await update.message.reply_text(
        "📅 تعداد روز اشتراک را وارد کن: _(مثال: 30)_",
        reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton("🔙 بازگشت", callback_data="main_menu")]]),
        parse_mode="Markdown")
    track_message(context, update.effective_chat.id, sent.message_id)
    return ADD_SUB


async def got_sub(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if not context.user_data.get("registration_active"):
        return ConversationHandler.END
    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 ADD_SUB
    ud = context.user_data
    # Save name BEFORE clearing user_data
    saved_name = ud.get("new_name", "ورزشکار")
    db.create_athlete(
        ud.get("new_username", ""), saved_name, ud.get("new_age"),
        ud.get("new_height"), ud.get("new_weight"), ud.get("new_phone"), int(text)
    )
    chat_id = update.effective_chat.id
    context.user_data.clear()
    await delete_bot_messages(context, chat_id)
    sent = await update.message.reply_text(
        f"✅ ورزشکار *{saved_name}* با موفقیت ثبت شد! 🎉\n\nبه منوی اصلی برگشتی 🏠",
        reply_markup=MAIN_COACH_KB, parse_mode="Markdown")
    track_message(context, chat_id, sent.message_id)
    return ConversationHandler.END


# ─── List & Panel ─────────────────────────────────────────────────────────────

async def list_athletes(update: Update, context: ContextTypes.DEFAULT_TYPE):
    athletes = db.get_all_athletes()
    if not athletes:
        sent = await update.message.reply_text("❌ هنوز هیچ ورزشکاری ثبت نشده.", reply_markup=MAIN_COACH_KB)
        track_message(context, update.effective_chat.id, sent.message_id)
        return
    await delete_bot_messages(context, update.effective_chat.id)
    sent = await update.message.reply_text("📋 *لیست ورزشکاران:*\n\nیکی را انتخاب کن 👇",
                                           reply_markup=athletes_kb(athletes), parse_mode="Markdown")
    track_message(context, update.effective_chat.id, sent.message_id)


async def athlete_panel(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    athlete_id = int(query.data.split("_")[1])
    context.user_data["selected_athlete"] = athlete_id
    athlete = db.get_athlete(athlete_id)
    # Change reply keyboard
    from telegram import ReplyKeyboardMarkup
    name_kb = athlete_selected_kb(athlete["full_name"])
    await query.message.reply_text(f"✅ *{athlete['full_name']}* انتخاب شد.", reply_markup=name_kb, parse_mode="Markdown")
    # Show inline panel (delete old tracked messages first)
    await _show_athlete_panel(context, query.message, athlete_id)


# ─── Search ───────────────────────────────────────────────────────────────────

async def search_start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    sent = await update.message.reply_text(
        "🔎 *جستجوی ورزشکار*\n\nنام یا یوزرنیم ورزشکار را بنویس:",
        reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton("🔙 بازگشت", callback_data="main_menu")]]), parse_mode="Markdown")
    track_message(context, update.effective_chat.id, sent.message_id)
    return SEARCH_QUERY


async def search_query(update: Update, context: ContextTypes.DEFAULT_TYPE):
    q = update.message.text.strip()
    results = db.search_athletes(q)
    if not results:
        sent = await update.message.reply_text(f"❌ هیچ ورزشکاری با «{q}» پیدا نشد.")
        track_message(context, update.effective_chat.id, sent.message_id)
        return SEARCH_QUERY
    await delete_bot_messages(context, update.effective_chat.id)
    sent = await update.message.reply_text(
        f"🔎 نتایج جستجو برای «{q}»:",
        reply_markup=athletes_kb(results))
    track_message(context, update.effective_chat.id, sent.message_id)
    return ConversationHandler.END


# ─── Show Full Profile ────────────────────────────────────────────────────────

async def show_athlete(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    athlete_id = context.user_data.get("selected_athlete")
    a = db.get_athlete(athlete_id)
    if not a:
        await query.message.reply_text("❌ ورزشکار پیدا نشد.")
        return

    days = db.get_athlete_training_days(athlete_id)
    training_lines = []
    for d in days:
        exs = db.get_athlete_day_exercises(athlete_id, d)
        from utils.helpers import persian_num
        training_lines.append(f"\n📅 *روز {persian_num(d)}:*")
        for i, ex in enumerate(exs, 1):
            training_lines.append(f"  {i}\\. {ex['exercise_name']} — {ex['sets']} ست × {ex['reps']} تکرار")

    diet_row = db.get_athlete_diet(athlete_id)
    supp_row = db.get_athlete_supplement(athlete_id)

    lines = [
        f"👤 *نام:* {a.get('full_name','---')}",
        f"🎂 *سن:* {a.get('age') or '---'}",
        f"⚖️ *وزن:* {a.get('weight') or '---'} کیلوگرم",
        f"📏 *قد:* {a.get('height') or '---'} سانتی‌متر",
        f"📞 *موبایل:* {a.get('phone') or '---'}",
        f"📅 *اشتراک:* {a.get('subscription_days','---')} روز",
    ]
    if training_lines:
        lines.append("\n🏋️ *برنامه تمرینی:*" + "\n".join(training_lines))
    if diet_row:
        lines.append(f"\n🥗 *برنامه غذایی:*\n{diet_row['diet_text']}")
    if supp_row:
        lines.append(f"\n💊 *برنامه مکمل:*\n{supp_row['supplement_text']}")

    text = "\n".join(lines)
    sent = await query.message.reply_text(text, parse_mode="Markdown")
    track_message(context, query.message.chat_id, sent.message_id)


# ─── Delete Athlete ───────────────────────────────────────────────────────────

async def delete_athlete_prompt(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    athlete_id = context.user_data.get("selected_athlete")
    a = db.get_athlete(athlete_id)
    sent = await query.message.reply_text(
        f"⚠️ آیا از حذف *{a['full_name']}* مطمئنی؟\nاین عمل برگشت‌پذیر نیست!",
        reply_markup=confirm_delete_kb(athlete_id), parse_mode="Markdown")
    track_message(context, query.message.chat_id, sent.message_id)


async def confirm_delete(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    athlete_id = int(query.data.split("_")[-1])
    a = db.get_athlete(athlete_id)
    db.delete_athlete(athlete_id)
    context.user_data.clear()
    await delete_bot_messages(context, query.message.chat_id)
    sent = await query.message.reply_text(f"✅ ورزشکار *{a['full_name']}* حذف شد.", reply_markup=MAIN_COACH_KB, parse_mode="Markdown")
    track_message(context, query.message.chat_id, sent.message_id)


async def cancel_delete(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    athlete_id = context.user_data.get("selected_athlete")
    await _show_athlete_panel(context, query.message, athlete_id)


# ─── Edit Athlete ─────────────────────────────────────────────────────────────

async def edit_start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    sent = await query.message.reply_text("✏️ کدام اطلاعات را می‌خواهی تغییر دهی؟", reply_markup=edit_fields_kb())
    track_message(context, query.message.chat_id, sent.message_id)
    return CHOOSE_EDIT_FIELD


async def edit_field_chosen(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    field_key = query.data
    context.user_data["edit_field"] = EDIT_FIELDS[field_key]
    sent = await query.message.reply_text(EDIT_PROMPTS[field_key], reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton("🔙 بازگشت", callback_data="main_menu")]]))
    track_message(context, query.message.chat_id, sent.message_id)
    return EDIT_VALUE


async def edit_value_received(update: Update, context: ContextTypes.DEFAULT_TYPE):
    text = update.message.text.strip()
    field = context.user_data["edit_field"]
    athlete_id = context.user_data["selected_athlete"]
    n = normalize_digits(text)
    if field in ("age", "height", "subscription_days"):
        if not n.isdigit():
            sent = await update.message.reply_text("❗️ فقط عدد وارد کن.")
            track_message(context, update.effective_chat.id, sent.message_id)
            return EDIT_VALUE
        value = int(n)
    elif field == "weight":
        try:
            value = float(normalize_digits(text).replace(",", "."))
        except ValueError:
            sent = await update.message.reply_text("❗️ وزن معتبر نیست.")
            track_message(context, update.effective_chat.id, sent.message_id)
            return EDIT_VALUE
    elif field == "phone":
        if not (n.isdigit() and 8 <= len(n) <= 15):
            sent = await update.message.reply_text("❗️ شماره موبایل معتبر نیست.")
            track_message(context, update.effective_chat.id, sent.message_id)
            return EDIT_VALUE
        value = n
    else:
        value = text
    db.update_athlete_field(athlete_id, field, value)
    context.user_data.pop("edit_field", None)
    await delete_bot_messages(context, update.effective_chat.id)
    sent = await update.message.reply_text("✅ اطلاعات با موفقیت ذخیره شد.", reply_markup=MAIN_COACH_KB)
    track_message(context, update.effective_chat.id, sent.message_id)
    return ConversationHandler.END


# ─── PDF ──────────────────────────────────────────────────────────────────────

async def send_pdf(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query
    await query.answer()
    athlete_id = context.user_data.get("selected_athlete")
    if not athlete_id:
        sent = await query.message.reply_text("❌ ورزشکاری انتخاب نشده.")
        track_message(context, query.message.chat_id, sent.message_id)
        return

    # Send loading message
    loading = await query.message.reply_text("⏳ در حال ساخت PDF...")
    track_message(context, query.message.chat_id, loading.message_id)

    try:
        from utils.pdf import generate_athlete_pdf
        import io as _io

        athlete = db.get_athlete(athlete_id)
        days = db.get_athlete_training_days(athlete_id)
        training_days = {d: db.get_athlete_day_exercises(athlete_id, d) for d in days}
        diet_row = db.get_athlete_diet(athlete_id)
        supp_row = db.get_athlete_supplement(athlete_id)

        pdf_bytes = generate_athlete_pdf(
            athlete, training_days,
            diet_row["diet_text"] if diet_row else None,
            supp_row["supplement_text"] if supp_row else None
        )

        if not pdf_bytes:
            raise ValueError("PDF empty - install: pip install matplotlib Pillow numpy")

        bio = _io.BytesIO(pdf_bytes)
        bio.name = f"{athlete['full_name']}.pdf"

        # Delete loading message
        try:
            await context.bot.delete_message(
                chat_id=query.message.chat_id, message_id=loading.message_id)
        except Exception:
            pass

        await query.message.reply_document(
            document=bio,
            filename=bio.name,
            caption=f"📄 پروفایل *{athlete['full_name']}*",
            parse_mode="Markdown"
        )

    except Exception as e:
        try:
            await context.bot.delete_message(
                chat_id=query.message.chat_id, message_id=loading.message_id)
        except Exception:
            pass
        err_sent = await query.message.reply_text(
            f"❌ خطا در ساخت PDF:\n`{str(e)[:300]}`\n\n"
            "لطفاً مطمئن شوید پکیج‌های زیر نصب هستند:\n"
            "`pip install matplotlib Pillow numpy`",
            parse_mode="Markdown"
        )
        track_message(context, query.message.chat_id, err_sent.message_id)


# ─── Register ─────────────────────────────────────────────────────────────────

add_athlete_conv = ConversationHandler(
    entry_points=[MessageHandler(filters.Regex("^➕ افزودن ورزشکار$"), add_athlete_start)],
    states={
        ADD_USERNAME: [MessageHandler(filters.TEXT & ~filters.COMMAND, got_username)],
        ADD_NAME:     [MessageHandler(filters.TEXT & ~filters.COMMAND, got_name)],
        ADD_AGE:      [CallbackQueryHandler(skip_age, pattern="^skip_age$"),
                       MessageHandler(filters.TEXT & ~filters.COMMAND, got_age)],
        ADD_HEIGHT:   [CallbackQueryHandler(skip_height, pattern="^skip_height$"),
                       MessageHandler(filters.TEXT & ~filters.COMMAND, got_height)],
        ADD_WEIGHT:   [CallbackQueryHandler(skip_weight, pattern="^skip_weight$"),
                       MessageHandler(filters.TEXT & ~filters.COMMAND, got_weight)],
        ADD_PHONE:    [CallbackQueryHandler(skip_phone, pattern="^skip_phone$"),
                       MessageHandler(filters.TEXT & ~filters.COMMAND, got_phone)],
        ADD_SUB:      [MessageHandler(filters.TEXT & ~filters.COMMAND, got_sub)],
    },
    fallbacks=[
        MessageHandler(filters.Regex("^🏠 بازگشت به منوی اصلی$"), _cancel),
        CallbackQueryHandler(_cancel, pattern="^main_menu$"),
    ],
    per_message=False, allow_reentry=True,
)

search_conv = ConversationHandler(
    entry_points=[MessageHandler(filters.Regex("^🔎 جستجوی ورزشکار$"), search_start)],
    states={
        SEARCH_QUERY: [MessageHandler(filters.TEXT & ~filters.COMMAND, search_query)],
    },
    fallbacks=[
        CallbackQueryHandler(_cancel, pattern="^main_menu$"),
        MessageHandler(filters.Regex("^🔎 جستجوی ورزشکار$"), search_start),
        MessageHandler(filters.Regex("^📋 لیست ورزشکاران$"), _cancel),
    ],
    per_message=False, allow_reentry=True,
)

edit_athlete_conv = ConversationHandler(
    entry_points=[CallbackQueryHandler(edit_start, pattern="^edit$")],
    states={
        CHOOSE_EDIT_FIELD: [CallbackQueryHandler(edit_field_chosen, pattern="^edit_(name|username|age|height|weight|phone|sub)$")],
        EDIT_VALUE: [MessageHandler(filters.TEXT & ~filters.COMMAND, edit_value_received)],
    },
    fallbacks=[
        MessageHandler(filters.Regex("^🏠 بازگشت به منوی اصلی$"), _cancel),
        CallbackQueryHandler(_cancel, pattern="^main_menu$"),
    ],
    per_message=False,
)


def register(app):
    app.add_handler(add_athlete_conv)
    app.add_handler(search_conv)
    app.add_handler(edit_athlete_conv)
    app.add_handler(MessageHandler(filters.Regex("^📋 لیست ورزشکاران$"), list_athletes))
    app.add_handler(CallbackQueryHandler(athlete_panel,         pattern=r"^athlete_\d+$"))
    app.add_handler(CallbackQueryHandler(show_athlete,          pattern="^show$"))
    app.add_handler(CallbackQueryHandler(delete_athlete_prompt, pattern="^delete$"))
    app.add_handler(CallbackQueryHandler(confirm_delete,        pattern=r"^confirm_delete_\d+$"))
    app.add_handler(CallbackQueryHandler(cancel_delete,         pattern="^cancel_delete$"))
    app.add_handler(CallbackQueryHandler(send_pdf,              pattern="^get_pdf$"))
    # Back to athlete panel from any sub-section
    # در group=1 ثبت می‌شود تا فقط زمانی اجرا شود که مکالمه فعالی
    # (در group=0) این callback را در fallbacks خودش نگرفته باشد.
    async def _back_to_ath(update, context):
        query = update.callback_query; await query.answer()
        athlete_id = context.user_data.get("selected_athlete")
        if athlete_id:
            await _show_athlete_panel(context, query.message, athlete_id)
    app.add_handler(CallbackQueryHandler(_back_to_ath, pattern="^back_to_athlete_panel$"), group=1)
