from typing import List, Dict, Any, Optional

def build_replies(data: Any, add_rating: bool = False) -> List[Dict[str, Any]]:
    """
    Convierte la salida del Agente en respuestas estructuradas para WhatsApp (BackAgrota).
    """
    if not data:
        return []

    # Si es una lista, procesar cada elemento
    if isinstance(data, list):
        all_replies = []
        for item in data:
            all_replies.extend(build_replies(item, add_rating))
        return all_replies

    # Si es un string simple, agregamos botones de calificación solo si es respuesta de datos
    if isinstance(data, str):
        if add_rating:
            return [create_rating_message(data)]
        else:
            return [{"type": "text", "text": {"body": data}}]

    # Si es un diccionario, determinamos el tipo (Botones, Listas, etc.)
    if isinstance(data, dict):
        replies = []
        
        # 1. Menú de Botones (Máximo 3 por limitación de WhatsApp)
        if "buttons" in data:
            buttons = []
            for b in data["buttons"][:3]:
                buttons.append({
                    "type": "reply",
                    "reply": {"id": b["id"], "title": b["title"]}
                })
            
            replies.append({
                "type": "interactive",
                "interactive": {
                    "type": "button",
                    "body": {"text": data.get("mensaje", "Por favor elige una opción:")},
                    "action": {"buttons": buttons}
                }
            })
            return replies

        # 2. Otros (Imagen, Documento si Agrota los usara en el futuro)
        if "documento_url" in data:
            replies.append({
                "type": "document",
                "document": {
                    "link": data["documento_url"],
                    "caption": data.get("mensaje") or "Documento adjunto",
                    "filename": data.get("filename") or "archivo.pdf"
                }
            })
            return replies

        # Fallback a texto si hay un campo 'mensaje'
        if "mensaje" in data:
            if add_rating:
                replies.append(create_rating_message(data["mensaje"]))
            else:
                replies.append({"type": "text", "text": {"body": data["mensaje"]}})
            return replies

    if add_rating:
        return [create_rating_message(str(data))]
    else:
        return [{"type": "text", "text": {"body": str(data)}}]

def create_rating_message(text_body: str) -> Dict[str, Any]:
    """Helper para crear mensaje interactivo con calificación a menos que el texto sea muy corto"""
    # Whatsapp Business API manda el texto principal en body.text
    return {
        "type": "interactive",
        "interactive": {
            "type": "button",
            "body": {"text": text_body},
            "action": {
                "buttons": [
                    {
                        "type": "reply",
                        "reply": {"id": "RATE_CORRECT", "title": "👍 Correcta"}
                    },
                    {
                        "type": "reply",
                        "reply": {"id": "RATE_INCORRECT", "title": "👎 Incorrecta"}
                    }
                ]
            }
        }
    }
