"""
Acá vive la lógica de qué responder según el mensaje del usuario.
Cada función maneja un comando, un tap de botón, o un tipo de mensaje.
"""
import database as db
import telegram_client as tg
from config import MINI_APP_URL, TELEGRAM_CANAL_ID

PAGINA = 5
PROMPT_BUSCAR = "🔍 Escribe qué producto buscas 👇"

def mensaje_bienvenida(nombre=None):
    saludo = f"👋 <b>¡Hola{f', {nombre}' if nombre else ''}! Soy MundoWAO</b>\n\n"
    return (
        saludo +
        "Te muestro ofertas de Mercado Libre\n"
        "Elige una opción o busca en nuestro catalogo 👇"
    )


def _boton_url(texto, url):
    return {"text": texto, "url": url}


def _boton_callback(texto, data):
    return {"text": texto, "callback_data": data}


def _boton_webapp(texto, url):
    return {"text": texto, "web_app": {"url": url}}


def _teclado(filas):
    return {"inline_keyboard": filas}


_filas_menu = []
if MINI_APP_URL:
    _filas_menu.append([_boton_webapp("✨ Abrir catálogo", MINI_APP_URL)])
_filas_menu.append([_boton_callback("🛍️ Ver ofertas", "ofertas:0")])
_filas_menu.append([_boton_callback("📂 Categorías", "categorias")])
_filas_menu.append([_boton_callback("🔍 Buscar", "buscar")])
if TELEGRAM_CANAL_ID:
    _url_canal = f"https://t.me/{TELEGRAM_CANAL_ID.lstrip('@')}"
    _filas_menu.append([_boton_url("📢 Unirte al canal de ofertas", _url_canal)])
MENU_PRINCIPAL = _teclado(_filas_menu)


def formatear_producto(p):
    precio_formateado = f"{p['precio']:,.0f}".replace(",", ".")
    texto = f"🛍️ <b>{p['titulo']}</b>\n💰 ${precio_formateado}"
    teclado = _teclado([[_boton_url("👉 Ver oferta", p["link_afiliado"])]])
    return texto, teclado


def enviar_producto(chat_id, p):
    texto, teclado = formatear_producto(p)
    if p.get("imagen_url"):
        tg.enviar_foto(chat_id, p["imagen_url"], texto, teclado=teclado)
    else:
        tg.enviar_mensaje(chat_id, texto, teclado=teclado)


def manejar_start(chat_id, nombre=None, username=None, idioma=None):
    db.registrar_usuario(chat_id, nombre=nombre, username=username, idioma=idioma)
    tg.enviar_mensaje(chat_id, mensaje_bienvenida(nombre), teclado=MENU_PRINCIPAL)


def manejar_ofertas(chat_id, offset=0):
    productos = db.listar_productos(limite=PAGINA + 1, offset=offset)
    if not productos:
        if offset == 0:
            tg.enviar_mensaje(chat_id, "Todavía no hay ofertas cargadas. ¡Volvé pronto! 🙂", teclado=MENU_PRINCIPAL)
        else:
            tg.enviar_mensaje(chat_id, "No hay más ofertas por ahora.", teclado=MENU_PRINCIPAL)
        return

    hay_mas = len(productos) > PAGINA
    for p in productos[:PAGINA]:
        enviar_producto(chat_id, p)

    botones = []
    if hay_mas:
        botones.append([_boton_callback("➡️ Ver más ofertas", f"ofertas:{offset + PAGINA}")])
    botones.append([_boton_callback("🏠 Menú principal", "inicio")])
    tg.enviar_mensaje(chat_id, "¿Qué quieres hacer?", teclado=_teclado(botones))


def manejar_categorias(chat_id):
    categorias = db.listar_categorias()
    if not categorias:
        tg.enviar_mensaje(chat_id, "Todavía no hay categorías cargadas.", teclado=MENU_PRINCIPAL)
        return
    filas = [[_boton_callback(f"📁 {c.capitalize()}", f"cat:{c}")] for c in categorias]
    filas.append([_boton_callback("🏠 Menú principal", "inicio")])
    tg.enviar_mensaje(chat_id, "📂 <b>Elige una categoría:</b>", teclado=_teclado(filas))


def manejar_categoria(chat_id, nombre_categoria):
    productos = db.listar_productos(categoria=nombre_categoria, limite=PAGINA)
    if not productos:
        tg.enviar_mensaje(chat_id, f"No encontré ofertas en '{nombre_categoria}'.", teclado=MENU_PRINCIPAL)
        return
    for p in productos:
        enviar_producto(chat_id, p)
    tg.enviar_mensaje(chat_id, "¿Qué buscas?", teclado=_teclado([
        [_boton_callback("📂 Otras categorías", "categorias")],
        [_boton_callback("🏠 Menú principal", "inicio")],
    ]))


def manejar_buscar(chat_id, palabra_clave):
    if not palabra_clave:
        tg.enviar_mensaje(chat_id, PROMPT_BUSCAR, teclado={"force_reply": True})
        return
    productos = db.buscar_productos(palabra_clave, limite=PAGINA)
    if not productos:
        tg.enviar_mensaje(chat_id, f"No encontré nada con '{palabra_clave}'.", teclado=MENU_PRINCIPAL)
        return
    for p in productos:
        enviar_producto(chat_id, p)
    tg.enviar_mensaje(chat_id, "¿Qué quieres hacer?", teclado=MENU_PRINCIPAL)


def manejar_callback(callback_query):
    chat_id = callback_query["message"]["chat"]["id"]
    data = callback_query.get("data", "")
    remitente = callback_query.get("from", {})
    tg.responder_callback(callback_query["id"])

    if data == "inicio":
        tg.enviar_mensaje(chat_id, mensaje_bienvenida(remitente.get("first_name")), teclado=MENU_PRINCIPAL)
    elif data == "categorias":
        manejar_categorias(chat_id)
    elif data == "buscar":
        tg.enviar_mensaje(chat_id, PROMPT_BUSCAR, teclado={"force_reply": True})
    elif data.startswith("ofertas:"):
        offset = int(data.split(":", 1)[1])
        manejar_ofertas(chat_id, offset=offset)
    elif data.startswith("cat:"):
        categoria = data.split(":", 1)[1]
        manejar_categoria(chat_id, categoria)


def manejar_mensaje(update):
    """Punto de entrada: recibe el update crudo de Telegram y decide qué hacer."""
    callback_query = update.get("callback_query")
    if callback_query:
        manejar_callback(callback_query)
        return

    mensaje = update.get("message")
    if not mensaje:
        return

    chat_id = mensaje["chat"]["id"]
    texto = mensaje.get("text", "").strip()
    remitente = mensaje.get("from", {})

    # Si el usuario responde al prompt de búsqueda (force reply), lo tratamos
    # como palabra de búsqueda en vez de buscar un comando.
    reply_to = mensaje.get("reply_to_message")
    if reply_to and reply_to.get("text") == PROMPT_BUSCAR and not texto.startswith("/"):
        manejar_buscar(chat_id, texto)
        return

    if texto.startswith("/start"):
        manejar_start(
            chat_id,
            nombre=remitente.get("first_name"),
            username=remitente.get("username"),
            idioma=remitente.get("language_code"),
        )
    elif texto.startswith("/ayuda"):
        tg.enviar_mensaje(chat_id, mensaje_bienvenida(remitente.get("first_name")), teclado=MENU_PRINCIPAL)
    elif texto.startswith("/ofertas"):
        manejar_ofertas(chat_id)
    elif texto.startswith("/categorias"):
        manejar_categorias(chat_id)
    elif texto.startswith("/categoria"):
        partes = texto.split(maxsplit=1)
        nombre = partes[1] if len(partes) > 1 else ""
        manejar_categoria(chat_id, nombre)
    elif texto.startswith("/buscar"):
        partes = texto.split(maxsplit=1)
        palabra = partes[1] if len(partes) > 1 else ""
        manejar_buscar(chat_id, palabra)
    else:
        tg.enviar_mensaje(chat_id, "No entendí ese mensaje. Elige una opción 👇", teclado=MENU_PRINCIPAL)
