# -*- coding: utf-8 -*-
"""ثبت‌نام خودکار ورزشکار جدید — یوزرنیم اتوماتیک از تلگرام، بقیه فیلدها اجباری."""
import re
from datetime import datetime
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import (
    ContextTypes, ConversationHandler, MessageHandler,
    CallbackQueryHandler, filters,
)
from config.settings import REG_NAME, REG_AGE, REG_HEIGHT, REG_WEIGHT, REG_PHONE
from utils.helpers import track_message, delete_bot_messages, normalize_digits
import database.db as db

CANCEL_KB = InlineKeyboardMarkup(
    [[InlineKeyboardButton("🔙 انصراف", callback_data="reg_cancel")]])


def _norm_phone(s):
    s = normalize_digits(s or "")
    s = re.sub(r"\D", "", s)
    if s.startswith("0098"): s = "0" + s[4:]
    elif s.startswith("98") and len(s) == 12: s = "0" + s[2:]
    elif len(s) == 10 and s.startswith("9"): s = "0" + s
    return s


async def _ask(update, context, text, state):
    chat_id = update.effective_chat.id
    await delete_bot_messages(context, chat_id)
    msg = update.message or update.callback_query.message
    sent = await msg.reply_text(text, reply_markup=CANCEL_KB, parse_mode="Markdown")
    track_message(context, chat_id, sent.message_id)
    return state


# ── شروع ─────────────────────────────────────────────────────────────────────
async def reg_start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    user = update.effective_user
    # یوزرنیم اتوماتیک از تلگرام
    context.user_data["reg"] = {
        "username": user.username or f"tg_{user.id}",
        "telegram_id": update.effective_chat.id,
    }
    return await _ask(update, context,
        "📝 *ثبت‌نام ورزشکار جدید*\n\nنام و نام خانوادگی‌ات را بنویس:", REG_NAME)


async def reg_got_name(update: Update, context: ContextTypes.DEFAULT_TYPE):
    name = update.message.text.strip()
    if len(name) < 3:
        return await _ask(update, context, "❗️ نام کامل را بنویس (حداقل ۳ حرف):", REG_NAME)
    context.user_data["reg"]["full_name"] = name
    return await _ask(update, context, "🎂 سن‌ات را به عدد بنویس:", REG_AGE)


async def reg_got_age(update: Update, context: ContextTypes.DEFAULT_TYPE):
    t = normalize_digits(update.message.text.strip())
    if not t.isdigit() or not (5 <= int(t) <= 100):
        return await _ask(update, context, "❗️ سن را فقط به عدد بنویس (مثلاً ۲۵):", REG_AGE)
    context.user_data["reg"]["age"] = int(t)
    return await _ask(update, context, "📏 قدت را به سانتی‌متر بنویس (مثلاً ۱۷۸):", REG_HEIGHT)


async def reg_got_height(update: Update, context: ContextTypes.DEFAULT_TYPE):
    t = normalize_digits(update.message.text.strip())
    if not t.isdigit() or not (100 <= int(t) <= 250):
        return await _ask(update, context, "❗️ قد را به سانتی‌متر بنویس (مثلاً ۱۷۸):", REG_HEIGHT)
    context.user_data["reg"]["height"] = int(t)
    return await _ask(update, context, "⚖️ وزنت را به کیلوگرم بنویس (مثلاً ۸۲):", REG_WEIGHT)


async def reg_got_weight(update: Update, context: ContextTypes.DEFAULT_TYPE):
    t = normalize_digits(update.message.text.strip()).replace("/", ".")
    if not re.fullmatch(r"\d+(\.\d+)?", t) or not (30 <= float(t) <= 250):
        return await _ask(update, context, "❗️ وزن را به کیلوگرم بنویس (مثلاً ۸۲):", REG_WEIGHT)
    context.user_data["reg"]["weight"] = float(t)
    return await _ask(update, context, "📱 شماره موبایلت را بنویس (مثلاً ۰۹۱۲۳۴۵۶۷۸۹):", REG_PHONE)


async def reg_got_phone(update: Update, context: ContextTypes.DEFAULT_TYPE):
    phone = _norm_phone(update.message.text)
    if not re.fullmatch(r"09\d{9}", phone):
        return await _ask(update, context,
            "❗️ شماره معتبر نیست. مثال: ۰۹۱۲۳۴۵۶۷۸۹", REG_PHONE)
    reg = context.user_data.pop("reg")
    chat_id = update.effective_chat.id

    # اگر این شماره قبلاً توسط مربی ثبت شده → همان پرونده به تلگرامش وصل شود
    existing = None
    for a in db.fetch_all("SELECT id, phone FROM athletes WHERE phone IS NOT NULL"):
        if _norm_phone(a["phone"]) == phone:
            existing = a; break
    if existing:
        db.execute("UPDATE athletes SET telegram_id=?, username=? WHERE id=?",
                   (reg["telegram_id"], reg["username"], existing["id"]))
        athlete_id = existing["id"]
    else:
        athlete_id = db.execute(
            """INSERT INTO athletes
               (telegram_id, username, full_name, age, height, weight, phone,
                subscription_days, created_at)
               VALUES (?,?,?,?,?,?,?,NULL,?)""",
            (reg["telegram_id"], reg["username"], reg["full_name"], reg["age"],
             reg["height"], reg["weight"], phone, datetime.now().isoformat()))

    context.user_data["athlete_user_id"] = athlete_id
    await delete_bot_messages(context, chat_id)
    athlete = db.get_athlete(athlete_id)
    from handlers.start import _athlete_main_kb
    sent = await update.message.reply_text(
        f"✅ ثبت‌نامت کامل شد!\n\n👋 خوش اومدی *{athlete['full_name']}* عزیز! 🏋️\n\nچی می‌خوای؟",
        reply_markup=_athlete_main_kb(), parse_mode="Markdown")
    track_message(context, chat_id, sent.message_id)
    return ConversationHandler.END


async def reg_cancel(update: Update, context: ContextTypes.DEFAULT_TYPE):
    query = update.callback_query; await query.answer()
    context.user_data.pop("reg", None)
    chat_id = query.message.chat_id
    await delete_bot_messages(context, chat_id)
    from handlers.shop import athlete_shop_menu
    await athlete_shop_menu(update, context)
    return ConversationHandler.END


self_register_conv = ConversationHandler(
    entry_points=[CallbackQueryHandler(reg_start, pattern="^self_register$")],
    states={
        REG_NAME:   [MessageHandler(filters.TEXT & ~filters.COMMAND, reg_got_name)],
        REG_AGE:    [MessageHandler(filters.TEXT & ~filters.COMMAND, reg_got_age)],
        REG_HEIGHT: [MessageHandler(filters.TEXT & ~filters.COMMAND, reg_got_height)],
        REG_WEIGHT: [MessageHandler(filters.TEXT & ~filters.COMMAND, reg_got_weight)],
        REG_PHONE:  [MessageHandler(filters.TEXT & ~filters.COMMAND, reg_got_phone)],
    },
    fallbacks=[CallbackQueryHandler(reg_cancel, pattern="^reg_cancel$")],
    per_message=False,
    allow_reentry=True,
)


def register(app):
    app.add_handler(self_register_conv)
