"""Shared helpers."""
import asyncio
from telegram import Update, InlineKeyboardMarkup
from telegram.ext import ContextTypes
from utils.keyboards import MAIN_COACH_KB


async def delete_bot_messages(context, chat_id: int):
    """Delete all tracked bot messages."""
    msg_ids = context.bot_data.get(f"bot_msgs_{chat_id}", [])
    for msg_id in msg_ids:
        try:
            await context.bot.delete_message(chat_id=chat_id, message_id=msg_id)
        except Exception:
            pass
    context.bot_data[f"bot_msgs_{chat_id}"] = []


def track_message(context, chat_id: int, message_id: int):
    key = f"bot_msgs_{chat_id}"
    if key not in context.bot_data:
        context.bot_data[key] = []
    context.bot_data[key].append(message_id)


async def edit_or_delete_last_inline(context, chat_id: int, new_text: str, new_markup: InlineKeyboardMarkup = None):
    """
    Delete all tracked messages except the last one (latest inline),
    then edit that last message. Used so new inline menus replace old ones.
    """
    msg_ids = context.bot_data.get(f"bot_msgs_{chat_id}", [])
    if not msg_ids:
        return False
    # Delete all but last
    for msg_id in msg_ids[:-1]:
        try:
            await context.bot.delete_message(chat_id=chat_id, message_id=msg_id)
        except Exception:
            pass
    # Try to edit last
    last_id = msg_ids[-1]
    try:
        kwargs = {"chat_id": chat_id, "message_id": last_id, "text": new_text, "parse_mode": "Markdown"}
        if new_markup:
            kwargs["reply_markup"] = new_markup
        await context.bot.edit_message_text(**kwargs)
        context.bot_data[f"bot_msgs_{chat_id}"] = [last_id]
        return True
    except Exception:
        # If edit fails, delete and return False so caller sends new
        try:
            await context.bot.delete_message(chat_id=chat_id, message_id=last_id)
        except Exception:
            pass
        context.bot_data[f"bot_msgs_{chat_id}"] = []
        return False


async def go_main_menu(update: Update, context, text: str = "🏠 به منوی اصلی خوش اومدی!"):
    context.user_data.clear()
    if update.callback_query:
        chat_id = update.callback_query.message.chat_id
        await update.callback_query.answer()
        await delete_bot_messages(context, chat_id)
        sent = await update.callback_query.message.reply_text(text, reply_markup=MAIN_COACH_KB)
    else:
        chat_id = update.message.chat_id
        await delete_bot_messages(context, chat_id)
        sent = await update.message.reply_text(text, reply_markup=MAIN_COACH_KB)
    track_message(context, chat_id, sent.message_id)


def persian_num(n: int) -> str:
    mapping = str.maketrans("0123456789", "۰۱۲۳۴۵۶۷۸۹")
    return str(n).translate(mapping)


def normalize_digits(text: str) -> str:
    """Convert Persian/Arabic digits to Latin."""
    return text.translate(str.maketrans("۰۱۲۳۴۵۶۷۸۹٠١٢٣٤٥٦٧٨٩", "01234567890123456789"))
