"""
Endpoints de gestión de sesiones e historial.
"""
import logging

from fastapi import APIRouter, status
from langchain_core.messages import HumanMessage, AIMessage

from core.session_manager import session_manager

logger = logging.getLogger(__name__)

router = APIRouter(tags=["sessions"])


@router.delete("/session/{uuid_conversation}", status_code=status.HTTP_204_NO_CONTENT)
async def delete_session(uuid_conversation: str):
    """
    Elimina la sesión de un cliente específico.
    """
    await session_manager.remove_session(uuid_conversation)
    logger.info(f"🗑️  Sesión eliminada manualmente: {uuid_conversation}")


@router.get("/sessions/stats")
async def get_sessions_stats():
    """
    Obtiene estadísticas de las sesiones activas.
    """
    active_count = await session_manager.get_active_sessions_count()

    return {
        "active_sessions": active_count,
        "backend": "redis",
        "ttl_seconds": session_manager.ttl
    }


@router.delete("/redis/flush", status_code=status.HTTP_200_OK)
async def flush_redis():
    """
    Limpia TODA la base de datos Redis actual (FLUSHDB).
    Elimina sesiones, contextos de flujo (redirect, balance) y cualquier otra clave.
    ⚠️ Operación destructiva e irreversible.
    """
    keys_before = await session_manager.client.dbsize()
    await session_manager.client.flushdb()
    logger.warning(f"🔥 Redis FLUSHDB ejecutado — se eliminaron {keys_before} claves")
    return {
        "status": "ok",
        "message": "Redis limpiado correctamente",
        "keys_deleted": keys_before,
    }


@router.get("/history/{uuid_conversation}")
async def get_history(uuid_conversation: str):
    """
    Obtiene el historial de chat de un cliente.
    """
    session = await session_manager.get_session(uuid_conversation)
    messages = session.state.get("messages", [])

    formatted_history = []
    for msg in messages:
        role = "unknown"
        if isinstance(msg, HumanMessage):
            role = "user"
        elif isinstance(msg, AIMessage):
            role = "assistant"

        # Limpiar etiqueta interna pero conservar los productos
        content = msg.content
        content = content.replace(
            "[CONTEXTO DEL SISTEMA - PRODUCTOS MOSTRADOS AL USUARIO]:",
            "Productos mostrados:"
        )

        formatted_history.append({
            "role": role,
            "content": content
        })

    return {
        "uuid_conversation": uuid_conversation,
        "history_count": len(formatted_history),
        "messages": formatted_history
    }
