name: invoice_explanation
version: 2
start: preparar

nodes:
  - id: preparar
    action: preparar_invoice_explanation
    input:
      msisdn: $.input.msisdn
      customer_id: $.input.customer_id
      current_invoice_number: $.input.current_invoice_number
      past_invoice_number: $.input.past_invoice_number
      current_invoice_due_date: $.input.current_invoice_due_date
      past_invoice_due_date: $.input.past_invoice_due_date
      channel: $.input.channel
      tentativa_anterior: $.vars.preparar.tentativa
      invoice_explanation_base: $.input.invoice_explanation_base

  - id: formatar
    action: formatar_invoice_explanation
    input:
      explicacao_base: $.vars.preparar.explicacao_base
      invoice_detail: $.input.invoice_detail
    pause:
      enabled: true
      when:
        eq: [$.output.await_user_input, true]
      return_from: $.output.mensagem
      expected_input:
        key: resposta_usuario
        allowed_values: ["SIM", "NAO"]
        normalize: upper_strip
      resume_from: decisao

  - id: checar_tentativa
    action: checar_tentativa_cvn
    input:
      tentativa: $.vars.preparar.tentativa

  - id: texto_intencao_invalida
    action: montar_resposta_texto
    input:
      dados:
        texto_usuario: "Não consegui validar sua solicitação. Pode informar novamente sobre a sua fatura?"

  - id: fim_intencao_invalida
    action: montar_resposta_texto
    input:
      dados:
        texto_usuario: "Não foi possível validar sua solicitação neste momento."

  - id: resposta_falha_servico
    action: montar_resposta_texto
    input:
      dados:
        texto_usuario: "Para continuar com a sua solicitação, aguarde um instante."

  - id: decisao
    action: no_op
    input: {}

  - id: registrar_sim
    action: registrar_atendimento_invoice_explanation
    input:
      resposta_usuario: SIM

  - id: registrar_protocolo_aceite
    action: registrar_protocolo_inicio
    input:
      msisdn: $.input.msisdn
      scenario: invoice_explanation_aceite_fechado
      request_status: Fechado
      status: CLOSED

  - id: registrar_nao
    action: registrar_atendimento_invoice_explanation
    input:
      resposta_usuario: NAO

  # A variação foi causada por VAS avulso ou estratégico? Sem VAS variado não há nada que
  # o bot resolva, e insistir com o orquestrador só gasta turno (SPEC §9 "Explicação da variação recusada").
  - id: checar_vas_variacao
    action: checar_vas_variado
    input:
      invoice_variation: $.input.invoice_variation
      invoice_detail: $.input.invoice_detail

  # Nó só para nomear o last_node: o backend o mapeia para nao_resolvido em
  # auto_finalize_status_map, e a fala vem do NAO_RESOLVIDO_CLOSING.
  - id: finalizar_nao_resolvido
    action: no_op
    input: {}

edges:
  - from: preparar
    to: formatar
    priority: 10
    when:
      eq: [$.vars.preparar.success, true]

  - from: preparar
    to: resposta_falha_servico
    priority: 20
    when:
      eq: [$.vars.preparar.service_failed, true]

  - from: preparar
    to: checar_tentativa
    priority: 30
    when:
      eq: [$.vars.preparar.success, false]

  - from: checar_tentativa
    to: fim_intencao_invalida
    priority: 10
    when:
      eq: [$.vars.checar_tentativa.limite_excedido, true]

  - from: checar_tentativa
    to: texto_intencao_invalida
    priority: 20

  - from: formatar
    to: decisao

  - from: decisao
    to: registrar_sim
    priority: 10
    when:
      eq: [$.input.resposta_usuario, SIM]

  - from: decisao
    to: registrar_nao
    priority: 20
    when:
      eq: [$.input.resposta_usuario, NAO]

  - from: registrar_sim
    to: registrar_protocolo_aceite

  - from: registrar_protocolo_aceite
    to: END

  - from: registrar_nao
    to: checar_vas_variacao

  - from: checar_vas_variacao
    to: finalizar_nao_resolvido
    priority: 10
    when:
      eq: [$.vars.checar_vas_variacao.tem_vas_variado, false]

  # Tem VAS variado (ou não deu para saber): devolve ao orquestrador, como sempre.
  - from: checar_vas_variacao
    to: END
    priority: 20

  - from: finalizar_nao_resolvido
    to: END

  - from: texto_intencao_invalida
    to: END

  - from: fim_intencao_invalida
    to: END

  - from: resposta_falha_servico
    to: END
