from __future__ import annotations

from enum import StrEnum
from typing import Final


class _BaseTag(StrEnum):
    """Base para tags IC: armazena código (value) e descrição."""

    description: str

    def __new__(cls, code: str, description: str) -> _BaseTag:
        obj = str.__new__(cls, code)
        obj._value_ = code
        obj.description = description
        return obj

    @property
    def code(self) -> str:
        return self.value

    def __repr__(self) -> str:
        return (
            f"{self.__class__.__name__}("
            f"code={self.code!r}, "
            f"description={self.description!r}"
            f")"
        )


class MPITag(_BaseTag):
    """
    Tags MPI (Main Program Interface).

    Emitidos para identificar resultado de explicação e entrada em fluxos
    específicos de tool. Os ICs de entrada por canal MPI.001–004 foram
    removidos da jornada.
    """

    # ------------------------------------------------------------------
    # MPI.005–006 — Resultado da explicação de fatura
    # ------------------------------------------------------------------

    EXPLICACAO_NAO: Final = (
        "MPI.005",
        "Cliente de acordo com a explicação? NÃO",
    )

    EXPLICACAO_SIM: Final = (
        "MPI.006",
        "Cliente de acordo com a explicação? SIM",
    )

    # ------------------------------------------------------------------
    # MPI.007–011 — Entrada em fluxo de tool
    # ------------------------------------------------------------------

    VAS_ESTRATEGICO: Final = (
        "MPI.007",
        "Seguiu para o fluxo de VAS Estratégico",
    )

    TERMINO_DESCONTO: Final = (
        "MPI.008",
        "Seguiu para o fluxo de Término de Desconto",
    )

    VALOR_DIVERGENTE: Final = (
        "MPI.009",
        "Seguiu para o fluxo de Valor Divergente",
    )

    PRO_RATA: Final = (
        "MPI.010",
        "Seguiu para o fluxo de Pró-Rata",
    )

    CANCELAR_VAS_AVULSO: Final = (
        "MPI.011",
        "Seguiu para o fluxo de VAS Avulso",
    )


class VEBTag(_BaseTag):
    """
    Tags VEB (Verbal Exchange Bridge) — eventos de progresso conversacional.

    Emitidos durante o fluxo de conversa para marcar transições de estado
    relevantes para analytics e observabilidade.
    """

    # ------------------------------------------------------------------
    # VEB.001–006 — Eventos do fluxo conversacional
    # ------------------------------------------------------------------

    VAS_ESTRATEGICO_INICIO: Final = (
        "VEB.001",
        "Chegada no fluxo VAS Estratégico",
    )

    PROCESSO_CONCLUIDO: Final = (
        "VEB.002",
        "Passou pelo processo conversacional",
    )

    EXPLICACAO_ACEITA: Final = (
        "VEB.003",
        "Aceitou a explicação? SIM",
    )

    EXPLICACAO_REJEITADA: Final = (
        "VEB.004",
        "Aceitou a explicação? NÃO",
    )

    INFO_CANCELAMENTO: Final = (
        "VEB.005",
        "Recebe explicação do procedimento para cancelamento",
    )

    DEVOLUCAO_URA: Final = (
        "VEB.006",
        "Retorna para a URA na finalização do atendimento",
    )

    REGISTRA_ATENDIMENTO_OK: Final = (
        "VEB.007",
        "Sucesso no Serviço Registra Atendimento? SIM",
    )

    REGISTRA_ATENDIMENTO_FAIL: Final = (
        "VEB.008",
        "Sucesso no Serviço Registra Atendimento? NÃO",
    )


class MSGTag(_BaseTag):
    """Tags MSG - registro do par de conversa cliente/agente por turno."""

    TURNO_CONVERSA: Final = (
        "MSG.001",
        "Registro do turno de conversa entre cliente e agente",
    )


class OUTTag(_BaseTag):
    """
    Tags OUT — eventos de saída/finalização do atendimento.
    """

    FINALIZACAO_NAO_RESOLVIDA_OU_FALHA: Final = (
        "OUT.008",
        "Finalização com Não Resolvido ou Falha Agente",
    )


class RCTTag(_BaseTag):
    """
    Tags RCT (Registered Call Tracking) — eventos de chamadas a serviços externos.

    Emitidos em cada tentativa de chamada a APIs externas, cobrindo sucesso,
    falha e reprocessamentos (2ª e 3ª tentativas).
    """

    # ------------------------------------------------------------------
    # RCT.001–006 — Cancela e Bloqueia VAS (cancelar_vas_avulso)
    # ------------------------------------------------------------------

    CANCELA_VAS_OK: Final = (
        "RCT.001",
        "Sucesso no Serviço Cancela e Bloqueia VAS? SIM",
    )

    CANCELA_VAS_FAIL: Final = (
        "RCT.002",
        "Sucesso no Serviço Cancela e Bloqueia VAS? NÃO",
    )

    CANCELA_VAS_2X_OK: Final = (
        "RCT.003",
        "Tentativa = 2x? SIM",
    )

    CANCELA_VAS_2X_FAIL: Final = (
        "RCT.004",
        "Tentativa = 2x? NÃO",
    )

    CANCELA_VAS_3X_OK: Final = (
        "RCT.005",
        "Tentativa = 3x? SIM",
    )

    CANCELA_VAS_3X_FAIL: Final = (
        "RCT.006",
        "Tentativa = 3x? NÃO",
    )

    # ------------------------------------------------------------------
    # RCT.007–012 — Executa Contestação (fluxo pré-pago/pós-pago)
    # ------------------------------------------------------------------

    CONTESTACAO_OK: Final = (
        "RCT.007",
        "Sucesso no Serviço Executa Contestação? SIM",
    )

    CONTESTACAO_FAIL: Final = (
        "RCT.008",
        "Sucesso no Serviço Executa Contestação? NÃO",
    )

    CONTESTACAO_2X_OK: Final = (
        "RCT.009",
        "Tentativa = 2x? SIM",
    )

    CONTESTACAO_2X_FAIL: Final = (
        "RCT.010",
        "Tentativa = 2x? NÃO",
    )

    CONTESTACAO_3X_OK: Final = (
        "RCT.011",
        "Tentativa = 3x? SIM",
    )

    CONTESTACAO_3X_FAIL: Final = (
        "RCT.012",
        "Tentativa = 3x? NÃO",
    )

    # ------------------------------------------------------------------
    # RCT.013–018 — Envio SGR CodBar (sms_command)
    # ------------------------------------------------------------------

    SGR_CODBAR_OK: Final = (
        "RCT.013",
        "Sucesso no Serviço Envio SGR CodBar? SIM",
    )

    SGR_CODBAR_FAIL: Final = (
        "RCT.014",
        "Sucesso no Serviço Envio SGR CodBar? NÃO",
    )

    SGR_CODBAR_2X_OK: Final = (
        "RCT.015",
        "Tentativa = 2x? SIM",
    )

    SGR_CODBAR_2X_FAIL: Final = (
        "RCT.016",
        "Tentativa = 2x? NÃO",
    )

    SGR_CODBAR_3X_OK: Final = (
        "RCT.017",
        "Tentativa = 3x? SIM",
    )

    SGR_CODBAR_3X_FAIL: Final = (
        "RCT.018",
        "Tentativa = 3x? NÃO",
    )

    # ------------------------------------------------------------------
    # RCT.019–024 — Registra Atendimento (cancelar_vas_avulso)
    # ------------------------------------------------------------------

    REG_ATEND_VAS_AVULSO_OK: Final = (
        "RCT.019",
        "Sucesso no Serviço Registra Atendimento? SIM",
    )

    REG_ATEND_VAS_AVULSO_FAIL: Final = (
        "RCT.020",
        "Sucesso no Serviço Registra Atendimento? NÃO",
    )

    REG_ATEND_VAS_AVULSO_2X_OK: Final = (
        "RCT.021",
        "Tentativa = 2x? SIM",
    )

    REG_ATEND_VAS_AVULSO_2X_FAIL: Final = (
        "RCT.022",
        "Tentativa = 2x? NÃO",
    )

    REG_ATEND_VAS_AVULSO_3X_OK: Final = (
        "RCT.023",
        "Tentativa = 3x? SIM",
    )

    REG_ATEND_VAS_AVULSO_3X_FAIL: Final = (
        "RCT.024",
        "Tentativa = 3x? NÃO",
    )

    # ------------------------------------------------------------------
    # RCT.025–030 — Registra Atendimento (vas_estrategico)
    # ------------------------------------------------------------------

    REG_ATEND_VAS_ESTRAT_OK: Final = (
        "RCT.025",
        "Sucesso no Serviço Registra Atendimento? SIM",
    )

    REG_ATEND_VAS_ESTRAT_FAIL: Final = (
        "RCT.026",
        "Sucesso no Serviço Registra Atendimento? NÃO",
    )

    REG_ATEND_VAS_ESTRAT_2X_OK: Final = (
        "RCT.027",
        "Tentativa = 2x? SIM",
    )

    REG_ATEND_VAS_ESTRAT_2X_FAIL: Final = (
        "RCT.028",
        "Tentativa = 2x? NÃO",
    )

    REG_ATEND_VAS_ESTRAT_3X_OK: Final = (
        "RCT.029",
        "Tentativa = 3x? SIM",
    )

    REG_ATEND_VAS_ESTRAT_3X_FAIL: Final = (
        "RCT.030",
        "Tentativa = 3x? NÃO",
    )

    # ------------------------------------------------------------------
    # RCT.031-036 — Executa Contestacao Controle (RT-06/pro-rata reservado)
    # ------------------------------------------------------------------

    # CONTESTACAO_CTRL_OK: Final = (
        # "RCT.031",
        # "Sucesso no Serviço Executa Contestação Controle? SIM",
    # )

    # CONTESTACAO_CTRL_FAIL: Final = (
        # "RCT.032",
        # "Sucesso no Serviço Executa Contestação Controle? NÃO",
    # )

    # CONTESTACAO_CTRL_2X_OK: Final = (
        # "RCT.033",
        # "Tentativa = 2x? SIM",
    # )

    # CONTESTACAO_CTRL_2X_FAIL: Final = (
        # "RCT.034",
        # "Tentativa = 2x? NÃO",
    # )

    # CONTESTACAO_CTRL_3X_OK: Final = (
        # "RCT.035",
        # "Tentativa = 3x? SIM",
    # )

    # CONTESTACAO_CTRL_3X_FAIL: Final = (
        # "RCT.036",
        # "Tentativa = 3x? NÃO",
    # )

    # ------------------------------------------------------------------
    # RCT.037–042 — Definição Valor de Ajuste
    # ------------------------------------------------------------------

    DEF_VALOR_AJUSTE_OK: Final = (
        "RCT.037",
        "Sucesso no Serviço Definição Valor ajuste? SIM",
    )

    DEF_VALOR_AJUSTE_FAIL: Final = (
        "RCT.038",
        "Sucesso no Serviço Definição Valor ajuste? NÃO",
    )

    DEF_VALOR_AJUSTE_2X_OK: Final = (
        "RCT.039",
        "Tentativa = 2x? SIM",
    )

    DEF_VALOR_AJUSTE_2X_FAIL: Final = (
        "RCT.040",
        "Tentativa = 2x? NÃO",
    )

    DEF_VALOR_AJUSTE_3X_OK: Final = (
        "RCT.041",
        "Tentativa = 3x? SIM",
    )

    DEF_VALOR_AJUSTE_3X_FAIL: Final = (
        "RCT.042",
        "Tentativa = 3x? NÃO",
    )

    # ------------------------------------------------------------------
    # RCT.043-048 — Registra Atendimento (RT-08/pro-rata reservado)
    # ------------------------------------------------------------------

    # REG_ATEND_CONTEST_OK: Final = (
        # "RCT.043",
        # "Sucesso no Serviço Registra Atendimento? SIM",
    # )

    # REG_ATEND_CONTEST_FAIL: Final = (
        # "RCT.044",
        # "Sucesso no Serviço Registra Atendimento? NÃO",
    # )

    # REG_ATEND_CONTEST_2X_OK: Final = (
        # "RCT.045",
        # "Tentativa = 2x? SIM",
    # )

    # REG_ATEND_CONTEST_2X_FAIL: Final = (
        # "RCT.046",
        # "Tentativa = 2x? NÃO",
    # )

    # REG_ATEND_CONTEST_3X_OK: Final = (
        # "RCT.047",
        # "Tentativa = 3x? SIM",
    # )

    # REG_ATEND_CONTEST_3X_FAIL: Final = (
        # "RCT.048",
        # "Tentativa = 3x? NÃO",
    # )

    # ------------------------------------------------------------------
    # RCT.049-054 — Avaliacao Termino Desconto (RT-09 reservado)
    # ------------------------------------------------------------------

    # AVAL_TERMINO_DESC_OK: Final = (
        # "RCT.049",
        # "Sucesso no Serviço Avaliação Término Desconto? SIM",
    # )

    # AVAL_TERMINO_DESC_FAIL: Final = (
        # "RCT.050",
        # "Sucesso no Serviço Avaliação Término Desconto? NÃO",
    # )

    # AVAL_TERMINO_DESC_2X_OK: Final = (
        # "RCT.051",
        # "Tentativa = 2x? SIM",
    # )

    # AVAL_TERMINO_DESC_2X_FAIL: Final = (
        # "RCT.052",
        # "Tentativa = 2x? NÃO",
    # )

    # AVAL_TERMINO_DESC_3X_OK: Final = (
        # "RCT.053",
        # "Tentativa = 3x? SIM",
    # )

    # AVAL_TERMINO_DESC_3X_FAIL: Final = (
        # "RCT.054",
        # "Tentativa = 3x? NÃO",
    # )

    # ------------------------------------------------------------------
    # RCT.055-060 — Executa Contestacao (RT-10 reservado)
    # ------------------------------------------------------------------

    # CONTESTACAO_VAL_DIV_OK: Final = (
        # "RCT.055",
        # "Sucesso no Serviço Executa Contestação? SIM",
    # )

    # CONTESTACAO_VAL_DIV_FAIL: Final = (
        # "RCT.056",
        # "Sucesso no Serviço Executa Contestação? NÃO",
    # )

    # CONTESTACAO_VAL_DIV_2X_OK: Final = (
        # "RCT.057",
        # "Tentativa = 2x? SIM",
    # )

    # CONTESTACAO_VAL_DIV_2X_FAIL: Final = (
        # "RCT.058",
        # "Tentativa = 2x? NÃO",
    # )

    # CONTESTACAO_VAL_DIV_3X_OK: Final = (
        # "RCT.059",
        # "Tentativa = 3x? SIM",
    # )

    # CONTESTACAO_VAL_DIV_3X_FAIL: Final = (
        # "RCT.060",
        # "Tentativa = 3x? NÃO",
    # )

    # ------------------------------------------------------------------
    # RCT.061-066 — Registra Chamado BO (RT-11 reservado)
    # ------------------------------------------------------------------

    # REG_CHAMADO_BO_OK: Final = (
        # "RCT.061",
        # "Sucesso no Serviço Registra Chamado BO? SIM",
    # )

    # REG_CHAMADO_BO_FAIL: Final = (
        # "RCT.062",
        # "Sucesso no Serviço Registra Chamado BO? NÃO",
    # )

    # REG_CHAMADO_BO_2X_OK: Final = (
        # "RCT.063",
        # "Tentativa = 2x? SIM",
    # )

    # REG_CHAMADO_BO_2X_FAIL: Final = (
        # "RCT.064",
        # "Tentativa = 2x? NÃO",
    # )

    # REG_CHAMADO_BO_3X_OK: Final = (
        # "RCT.065",
        # "Tentativa = 3x? SIM",
    # )

    # REG_CHAMADO_BO_3X_FAIL: Final = (
        # "RCT.066",
        # "Tentativa = 3x? NÃO",
    # )

    # ------------------------------------------------------------------
    # RCT.067-072 — Registra Atendimento (RT-12 reservado)
    # ------------------------------------------------------------------

    # REG_ATEND_STATUS_SR_OK: Final = (
        # "RCT.067",
        # "Sucesso no Serviço Registra Atendimento? SIM",
    # )

    # REG_ATEND_STATUS_SR_FAIL: Final = (
        # "RCT.068",
        # "Sucesso no Serviço Registra Atendimento? NÃO",
    # )

    # REG_ATEND_STATUS_SR_2X_OK: Final = (
        # "RCT.069",
        # "Tentativa = 2x? SIM",
    # )

    # REG_ATEND_STATUS_SR_2X_FAIL: Final = (
        # "RCT.070",
        # "Tentativa = 2x? NÃO",
    # )

    # REG_ATEND_STATUS_SR_3X_OK: Final = (
        # "RCT.071",
        # "Tentativa = 3x? SIM",
    # )

    # REG_ATEND_STATUS_SR_3X_FAIL: Final = (
        # "RCT.072",
        # "Tentativa = 3x? NÃO",
    # )

    # ------------------------------------------------------------------
    # RCT.073–078 — PDF Fatura (buscar_fatura)
    # ------------------------------------------------------------------

    PDF_FATURA_OK: Final = (
        "RCT.073",
        "Sucesso no Serviço PDF FATURA? SIM",
    )

    PDF_FATURA_FAIL: Final = (
        "RCT.074",
        "Sucesso no Serviço PDF FATURA? NÃO",
    )

    PDF_FATURA_2X_OK: Final = (
        "RCT.075",
        "Tentativa = 2x? SIM",
    )

    PDF_FATURA_2X_FAIL: Final = (
        "RCT.076",
        "Tentativa = 2x? NÃO",
    )

    PDF_FATURA_3X_OK: Final = (
        "RCT.077",
        "Tentativa = 3x? SIM",
    )

    PDF_FATURA_3X_FAIL: Final = (
        "RCT.078",
        "Tentativa = 3x? NÃO",
    )

    # ------------------------------------------------------------------
    # RCT.079–084 — Base de Conhecimento (invoice_explanation RAG)
    # ------------------------------------------------------------------

    BASE_CONHECIMENTO_OK: Final = (
        "RCT.079",
        "Sucesso no Serviço Base de Conhecimento? SIM",
    )

    BASE_CONHECIMENTO_FAIL: Final = (
        "RCT.080",
        "Sucesso no Serviço Base de Conhecimento? NÃO",
    )

    BASE_CONHECIMENTO_2X_OK: Final = (
        "RCT.081",
        "Tentativa = 2x? SIM",
    )

    BASE_CONHECIMENTO_2X_FAIL: Final = (
        "RCT.082",
        "Tentativa = 2x? NÃO",
    )

    BASE_CONHECIMENTO_3X_OK: Final = (
        "RCT.083",
        "Tentativa = 3x? SIM",
    )

    BASE_CONHECIMENTO_3X_FAIL: Final = (
        "RCT.084",
        "Tentativa = 3x? NÃO",
    )



    # ------------------------------------------------------------------
    # RCT.085-090 - Registra Chamado BO (RT-15)
    # ------------------------------------------------------------------

    REG_CHAMADO_BO_RT15_OK: Final = (
        "RCT.085",
        "Sucesso no Servico Registra Chamado BO? SIM",
    )

    REG_CHAMADO_BO_RT15_FAIL: Final = (
        "RCT.086",
        "Sucesso no Servico Registra Chamado BO? NAO",
    )

    REG_CHAMADO_BO_RT15_2X_OK: Final = (
        "RCT.087",
        "Tentativa = 2x? SIM",
    )

    REG_CHAMADO_BO_RT15_2X_FAIL: Final = (
        "RCT.088",
        "Tentativa = 2x? NAO",
    )

    REG_CHAMADO_BO_RT15_3X_OK: Final = (
        "RCT.089",
        "Tentativa = 3x? SIM",
    )

    REG_CHAMADO_BO_RT15_3X_FAIL: Final = (
        "RCT.090",
        "Tentativa = 3x? NAO",
    )


class VAATag(_BaseTag):
    """
    Tags VAA (VAS Avulso Actions) — eventos do fluxo de cancelamento de VAS avulso.

    Emitidos durante a execução da tool `cancelar_vas_avulso`, cobrindo
    cada etapa do ciclo de bloqueio, cancelamento, protocolo e envio de SMS.
    """

    # ------------------------------------------------------------------
    # VAA.001–006 — Ciclo de cancelamento por item
    # ------------------------------------------------------------------

    INICIO_FLUXO: Final = (
        "VAA.001",
        "Chegada no fluxo VAS Avulso",
    )

    BLOQUEIO_INICIO: Final = (
        "VAA.002",
        "Passou pelo processo Cancela e Bloqueia VAS Avulso",
    )

    ITEM_CANCELADO_OK: Final = (
        "VAA.003",
        "Sucesso no Serviço Cancela e Bloqueia VAS? SIM",
    )

    ITEM_CANCELADO_FAIL: Final = (
        "VAA.004",
        "Sucesso no Serviço Cancela e Bloqueia VAS? NÃO",
    )

    PROTOCOLO_INICIO: Final = (
        "VAA.005",
        "Passou pelo processo Contesta VAS Avulso",
    )

    PROTOCOLO_OK: Final = (
        "VAA.006",
        "Sucesso no Serviço Contesta VAS Avulso? SIM",
    )

    CONTESTA_VAS_AVULSO_FAIL: Final = (
        "VAA.007",
        "Sucesso no Serviço Contesta VAS Avulso? NÃO",
    )

    CODIGO_BARRAS_ELEGIVEL: Final = (
        "VAA.008",
        "Elegível código de barras? SIM",
    )

    CODIGO_BARRAS_NAO_ELEGIVEL: Final = (
        "VAA.009",
        "Elegível código de barras? NÃO",
    )

    # ------------------------------------------------------------------
    # VAA.010–011 — Consulta contrato/corte (contestação de valor)
    # ------------------------------------------------------------------

    CONTESTACAO_OK: Final = (
        "VAA.010",
        "Elegível Conta Certa Manual? SIM",
    )

    CONTESTACAO_FAIL: Final = (
        "VAA.011",
        "Elegível Conta Certa Manual? NÃO",
    )

    # ------------------------------------------------------------------
    # VAA.012 — Envio de SMS
    # ------------------------------------------------------------------

    SMS_OK: Final = (
        "VAA.012",
        "Sucesso no Serviço Envio COD BAR? SIM",
    )

    SMS_FAIL: Final = (
        "VAA.013",
        "Sucesso no Serviço Envio COD BAR? NÃO",
    )

    # ------------------------------------------------------------------
    # VAA.014–017 — Atualização de status da SR
    # ------------------------------------------------------------------

    STATUS_SR_COM_SMS: Final = (
        "VAA.014",
        "Recebe informação de envio código de barras por SMS sucesso? SIM",
    )

    STATUS_SR_SEM_SMS: Final = (
        "VAA.015",
        "Recebe informação de envio código de barras por SMS sucesso? NÃO",
    )

    STATUS_SR_OK: Final = (
        "VAA.016",
        "Sucesso no Serviço Registra Atendimento? SIM",
    )

    STATUS_SR_FAIL: Final = (
        "VAA.017",
        "Sucesso no Serviço Registra Atendimento? NÃO",
    )


class CVNTag(_BaseTag):
    """
    Tags CVN (Conversa) — eventos do fluxo de explicação de fatura.

    Emitidos pela action `buscar_invoice_explanation` e auxiliares,
    rastreando pré-validação, chamadas ao serviço, retentativas e
    resposta final do cliente.
    """

    # ------------------------------------------------------------------
    # CVN.001–003 — Entrada e pré-validação
    # ------------------------------------------------------------------

    INICIO_FLUXO: Final = (
        "CVN.001",
        "Chegada no fluxo Conversacional",
    )

    PRE_VALIDACAO_OK: Final = (
        "CVN.002",
        "Intenção Validada? SIM",
    )

    PRE_VALIDACAO_FAIL: Final = (
        "CVN.003",
        "Intenção Validada? NÃO",
    )

    # ------------------------------------------------------------------
    # CVN.004–005 — Controle de retentativas
    # ------------------------------------------------------------------

    LIMITE_TENTATIVAS: Final = (
        "CVN.004",
        "Tentativa >2x? SIM",
    )

    DENTRO_LIMITE: Final = (
        "CVN.005",
        "Tentativa >2x? NÃO",
    )

    # ------------------------------------------------------------------
    # CVN.006–007 — Resultado da chamada ao serviço
    # ------------------------------------------------------------------

    SERVICO_OK: Final = (
        "CVN.006",
        "Sucesso no Serviço PDF Fatura/Base Conhecimento? SIM",
    )

    SERVICO_FAIL: Final = (
        "CVN.007",
        "Sucesso no Serviço PDF Fatura/Base Conhecimento? NÃO",
    )

    # ------------------------------------------------------------------
    # CVN.008–009 — Resposta do cliente
    # ------------------------------------------------------------------

    CLIENTE_CONCORDOU: Final = (
        "CVN.008",
        "Explicação Resolveu? SIM",
    )

    CLIENTE_NAO_CONCORDOU: Final = (
        "CVN.009",
        "Explicação Resolveu? NÃO",
    )

    REGISTRA_ATENDIMENTO_OK: Final = (
        "CVN.010",
        "Sucesso no Serviço Registra Atendimento? SIM",
    )

    REGISTRA_ATENDIMENTO_FAIL: Final = (
        "CVN.011",
        "Sucesso no Serviço Registra Atendimento? NÃO",
    )

    PEDIU_ATH_COM_AJUSTE: Final = (
        "CVN.012",
        "Pediu Atendimento Humano 1x e ajuste na conta? SIM",
    )

    PEDIU_ATH_SEM_AJUSTE: Final = (
        "CVN.013",
        "Pediu Atendimento Humano 1x e ajuste na conta? NÃO",
    )

    ACEITOU_INSISTENCIA_1X: Final = (
        "CVN.014",
        "Aceitou insistência 1x? SIM",
    )

    RECUSOU_INSISTENCIA_1X: Final = (
        "CVN.015",
        "Aceitou insistência 1x? NÃO",
    )

    ITENS_EVENTUAIS_AJUSTE: Final = (
        "CVN.016",
        "Insistência ATH 2x com VAS avulso passível de ajuste",
    )

    SAUDACAO_ESPECIALISTA_CONTAS: Final = (
        "CVN.017",
        "Saudação da Especialista em Contas",
    )

    ACEITOU_INSISTENCIA_2X: Final = (
        "CVN.018",
        "Aceitou insistência 2x? SIM",
    )

    RECUSOU_INSISTENCIA_2X: Final = (
        "CVN.019",
        "Aceitou insistência 2x? NÃO",
    )


class TMDTag(_BaseTag):
    """
    Tags TMD (Término de Desconto) — eventos do fluxo de término de desconto.

    Emitidos pelo workflow `termino_desconto` para rastrear entrada e saída
    do fluxo. Demais tags TMD dependem de etapas de negócio ainda não
    implementadas no workflow.
    """

    # ------------------------------------------------------------------
    # TMD.001 — Entrada no fluxo
    # ------------------------------------------------------------------

    # CHEGADA_FLUXO: Final = (
        # "TMD.001",
        # "Chegada no fluxo Término de Desconto",
    # )

    # ------------------------------------------------------------------
    # TMD.021 — Saída do fluxo
    # ------------------------------------------------------------------

    # FIM_FLUXO: Final = (
        # "TMD.021",
        # "Direciona para o fim do fluxo Término de desconto",
    # )


class NOCTag(_BaseTag):
    """
    Tags NOC (Network Operations Center) — eventos de observabilidade técnica.

    Emitidos em pontos críticos do ciclo de vida do atendimento para
    monitoramento de latência, erros e finalização.
    """

    # ------------------------------------------------------------------
    # NOC.001 — Início do fluxo HTTP
    # ------------------------------------------------------------------

    FLOW_START: Final = (
        "NOC.001",
        "Início do fluxo de atendimento (recepção do request HTTP)",
    )

    # ------------------------------------------------------------------
    # NOC.002–005 — Erros de integração e aplicação
    # ------------------------------------------------------------------

    API_CONTENT_MISMATCH: Final = (
        "NOC.002",
        "Resposta de API tecnicamente bem-sucedida sem conteúdo útil",
    )

    DATABASE_LATENCY: Final = (
        "NOC.003",
        "Latência de chamada a banco de dados",
    )

    LLM_INCONSISTENT_RETURN: Final = (
        "NOC.004",
        "Retorno inconsistente da LLM que impede a continuidade",
    )

    APPLICATION_ABORT: Final = (
        "NOC.005",
        "Exceção que aborta o processamento da aplicação",
    )

    # ------------------------------------------------------------------
    # NOC.006 — Latência crítica local
    # ------------------------------------------------------------------

    CRITICAL_LATENCY: Final = (
        "NOC.006",
        "Latência de ponto crítico local (CPU, memória, disco ou parser de PDF)",
    )

    # ------------------------------------------------------------------
    # NOC.007–009 — LLM e finalização
    # ------------------------------------------------------------------

    LLM_CALL_START: Final = (
        "NOC.007",
        "Início de chamada ao LLM, antes do invoke LangChain",
    )

    FINALIZATION_SUCCESS: Final = (
        "NOC.008",
        "Finalização controlada pelo agente (qualquer status exceto falha_sistema)",
    )

    FINALIZATION_ERROR: Final = (
        "NOC.009",
        "Finalização por falha de sistema",
    )

    # ------------------------------------------------------------------
    # NOC.010 — Latência total do fluxo
    # ------------------------------------------------------------------

    FLOW_TOTAL_LATENCY: Final = (
        "NOC.010",
        "Latência total do fluxo de atendimento",
    )


class SADTag(_BaseTag):
    """
    Tags SAD (Saída do Atendimento Digital) — eventos de encerramento do atendimento.

    Emitidos na finalização da sessão do agente.
    """

    # ------------------------------------------------------------------
    # SAD.001 — Finalização do atendimento
    # ------------------------------------------------------------------

    FINALIZACAO: Final = (
        "SAD.001",
        "Chegada no fluxo Saída, recebe a informação de finalização Agente",
    )

    ERRO_TECNICO_SIM: Final = (
        "SAD.002",
        "Erro Técnico? SIM",
    )

    ERRO_TECNICO_NAO: Final = (
        "SAD.003",
        "Erro Técnico? NÃO",
    )

    INTENCAO_ATH_SIM: Final = (
        "SAD.004",
        "Intenção validada ATH? SIM",
    )

    INTENCAO_ATH_NAO: Final = (
        "SAD.005",
        "Intenção validada ATH? NÃO",
    )

    ATH_1X_NAO: Final = (
        "SAD.006",
        "ATH 1x? NÃO",
    )

    ATH_1X_SIM: Final = (
        "SAD.007",
        "ATH 1x? SIM",
    )
