import unicodedata
from typing import Any


WELCOME_TEXT = (
    "Hola, soy MBBot y estoy para servirte. Por favor escoge una de las "
    "siguientes opciones para poder comunicarte al area que necesitas."
)
MAIN_MENU_BUTTONS = ["Soporte", "Emergencia de Cobro", "Mas opciones"]
MORE_MENU_TEXT = "Estas son las demas areas disponibles:"
MORE_MENU_BUTTONS = ["Implementacion", "Ventas", "Administracion"]
HELP_TEXT = "Selecciona una opcion"
MAIN_MENU_FALLBACK = (
    "Hola, soy MBBot y estoy para servirte. Por favor responde con el numero "
    "o nombre de la opcion:\n\n"
    "1. Soporte\n"
    "2. Emergencia de Cobro\n"
    "3. Implementacion\n"
    "4. Ventas\n"
    "5. Administracion"
)
MORE_MENU_FALLBACK = (
    "Estas son las demas areas disponibles. Por favor responde con el numero o "
    "nombre de la opcion:\n\n"
    "3. Implementacion\n"
    "4. Ventas\n"
    "5. Administracion"
)
UNKNOWN_MENU_TEXT = (
    "No logre identificar la opcion que necesitas. Por favor escoge una de las "
    "siguientes opciones:"
)
UNKNOWN_MENU_FALLBACK = (
    "No logre identificar la opcion que necesitas. Por favor responde con el "
    "numero o nombre de la opcion:\n\n"
    "1. Soporte\n"
    "2. Emergencia de Cobro\n"
    "3. Implementacion\n"
    "4. Ventas\n"
    "5. Administracion"
)


def build_reply_payload(message_text: str) -> dict[str, Any]:
    normalized = _normalize(message_text)

    if normalized in {"hola", "buenos dias", "buenas", "menu", "menu principal"}:
        return _main_menu_payload()

    if normalized in {"mas", "mas opciones", "mas opcion", "opciones"}:
        return _more_menu_payload()

    if normalized == "2" or "emergencia" in normalized:
        return {
            "type": "text",
            "text": (
                "Para poder apoyarte con Emergencia de Cobro, vamos a recopilar "
                "los datos necesarios uno por uno."
            ),
        }

    if normalized == "1" or "soporte" in normalized:
        return {
            "type": "text",
            "text": (
                "Para poder apoyarte con Soporte, vamos a recopilar los datos "
                "necesarios uno por uno."
            ),
        }

    if normalized == "3" or "implementacion" in normalized:
        return {
            "type": "text",
            "text": (
                "Para poder apoyarte con Implementacion, vamos a recopilar los "
                "datos necesarios uno por uno."
            ),
        }

    if normalized == "4" or "ventas" in normalized:
        return {
            "type": "text",
            "text": (
                "Gracias por comunicarte a Ventas. Vamos a recopilar los datos "
                "necesarios para que un asesor pueda atenderte."
            ),
        }

    if normalized == "5" or "administracion" in normalized:
        return {
            "type": "text",
            "text": (
                "Te has comunicado a Administracion. Vamos a recopilar los datos "
                "necesarios para atender tu consulta."
            ),
        }

    if normalized == "6" or "mbia" in normalized:
        return {
            "type": "text",
            "text": (
                "Hola. Estoy aqui para ayudarte con MBIA. Por favor escribe tu "
                "consulta de la forma mas detallada posible."
            ),
        }

    return _main_menu_unknown_payload()


def build_reply(message_text: str) -> str:
    reply_payload = build_reply_payload(message_text)
    if reply_payload["type"] == "quick_replies":
        return str(reply_payload.get("fallback_text") or reply_payload["text"])
    return str(reply_payload["text"])


def _main_menu_payload() -> dict[str, Any]:
    return {
        "type": "quick_replies",
        "text": WELCOME_TEXT,
        "help_text": HELP_TEXT,
        "buttons": MAIN_MENU_BUTTONS,
        "fallback_text": MAIN_MENU_FALLBACK,
    }


def _more_menu_payload() -> dict[str, Any]:
    return {
        "type": "quick_replies",
        "text": MORE_MENU_TEXT,
        "help_text": HELP_TEXT,
        "buttons": MORE_MENU_BUTTONS,
        "fallback_text": MORE_MENU_FALLBACK,
    }


def _main_menu_unknown_payload() -> dict[str, Any]:
    return {
        "type": "quick_replies",
        "text": UNKNOWN_MENU_TEXT,
        "help_text": HELP_TEXT,
        "buttons": MAIN_MENU_BUTTONS,
        "fallback_text": UNKNOWN_MENU_FALLBACK,
    }


def _normalize(value: str) -> str:
    normalized = unicodedata.normalize("NFKD", value or "")
    normalized = "".join(char for char in normalized if not unicodedata.combining(char))
    return " ".join(normalized.lower().strip().split())
