from __future__ import annotations

from typing import Any, Mapping


_CONTA_OPENING = (
    "Olá! Eu sou a Especialista em Contas e vou ajudar você a entender a sua "
    "fatura. Posso explicar valores, detalhar serviços e itens eventuais, "
    "identificar cobranças que você não reconhece e, se for o caso, realizar "
    "ajustes necessários ou solicitações relacionadas à sua conta. Então vamos "
    "lá, me conte o que você gostaria de entender ou resolver na sua conta."
)


def _as_str(value: Any) -> str:
    return str(value or "").strip()


def _normalize_agent_name(value: Any) -> str:
    raw = _as_str(value).lower()
    aliases = {
        "conta": "conta",
        "contas": "conta",
        "ofert": "oferta",
        "oferta": "oferta",
        "ofertas": "oferta",
        "cobra": "cobranca",
        "cobranca": "cobranca",
        "cobranca": "cobranca",
    }
    return aliases.get(raw, raw or "conta")


def _payload_body(payload: Mapping[str, Any]) -> Mapping[str, Any]:
    body = payload.get("payload")
    if isinstance(body, Mapping):
        return body
    return payload


def _extract_agent_name(payload: Mapping[str, Any]) -> str:
    body = _payload_body(payload)
    return _normalize_agent_name(
        body.get("agent")
        or payload.get("agent")
        or payload.get("_agent")
    )


def _extract_stage(payload: Mapping[str, Any]) -> str:
    body = _payload_body(payload)
    return _as_str(
        body.get("stage")
        or payload.get("stage")
        or payload.get("_stage")
    ).upper() or "PRESENTATION"


def _extract_user_text(payload: Mapping[str, Any]) -> str:
    body = _payload_body(payload)
    for key in ("message", "text", "utterance", "transcript", "content"):
        text = _as_str(body.get(key) or payload.get(key))
        if text:
            return text
    return ""


def _is_end_request(payload: Mapping[str, Any]) -> bool:
    body = _payload_body(payload)
    if _as_str(payload.get("action")).lower() == "end":
        return True
    if _as_str(payload.get("type")).lower() == "end":
        return True
    if _as_str(body.get("type")).lower() == "end":
        return True
    return False


def _next_stage(current_stage: str, text: str, *, is_end: bool) -> str:
    lowered = _as_str(text).lower()
    if is_end or any(token in lowered for token in ("encerrar", "finalizar", "obrigado", "tchau")):
        return "DONE"

    stage = (current_stage or "PRESENTATION").upper()
    if stage in {"", "INTRO", "PRESENTATION"}:
        return "ARGUMENTATION"
    if stage == "ARGUMENTATION":
        return "FORMALIZATION"
    if stage == "FORMALIZATION":
        return "DONE"
    return stage


def _reply_text(agent_name: str, next_stage: str, user_text: str) -> str:
    transcript = _as_str(user_text)

    if next_stage == "DONE":
        if agent_name == "conta":
            return "Atendimento simulado de conta encerrado. Obrigado."
        if agent_name == "oferta":
            return "Atendimento simulado de oferta encerrado. Obrigado."
        return "Atendimento simulado de cobrança encerrado. Obrigado."

    if agent_name == "conta":
        if not transcript:
            return _CONTA_OPENING
        base = "Simulação de conta ativa. Posso seguir com os detalhes da fatura."
    elif agent_name == "oferta":
        base = "Simulação de oferta ativa. Tenho uma oferta pronta para você."
    else:
        base = "Simulação de cobrança ativa. Posso continuar com a negociação."

    if transcript:
        return f"{base} Texto transcrito no STT: {transcript}."
    return base


def build_fake_remote_agent_response(payload: Mapping[str, Any]) -> dict[str, Any]:
    agent_name = _extract_agent_name(payload)
    current_stage = _extract_stage(payload)
    user_text = _extract_user_text(payload)
    is_end = _is_end_request(payload)
    next_stage = _next_stage(current_stage, user_text, is_end=is_end)
    content = _reply_text(agent_name, next_stage, user_text)

    if agent_name == "conta":
        action = _as_str(payload.get("action")).lower() or "chat"
        result_payload = {
            "type": "final",
            "content": content,
            "tool_calls": [],
        }
        if next_stage == "DONE":
            result_payload["result"] = [{"status": "ok", "reason": "fake_done"}]
        return {
            "type": "result",
            "action": action or "chat",
            "stage": next_stage,
            "result": result_payload,
        }

    response_type = "done" if next_stage == "DONE" else "final"
    result = [{"status": "ok", "reason": "fake_done"}] if next_stage == "DONE" else []
    return {
        "type": response_type,
        "stage": next_stage,
        "text": content,
        "result": result,
    }
