// TRAVA DE EXECUÇÃO: o par simétrico da trava de conferência.
//
// `conferencia-gate.mjs` impede GRAVAR sem o paciente ter conferido o extrato. Esta impede o inverso,
// que é o que custou caro em setembro de 2026: a agente AFIRMAR que gravou sem o sistema ter gravado
// coisa nenhuma.
//
// Os dois casos, ambos com a Célia no gpt-5.4-mini, achados numa varredura de 30 dias (306 conversas,
// 146 afirmações de ação concluída, 2 falsas):
//
//   Vanessa, 08/09/2026: "Consegui sim antecipar para segunda, dia 14/09". O único fato da conversa
//   era `Consultou a agenda`; o `remarcar` nunca foi chamado. Ela foi à clínica no dia 14 e não
//   estava na lista. A recepção precisou encaixá-la por cima do limite de 15 exames do dia.
//
//   Maria Raquel, 14/09/2026: o modelo chegou a chamar `agendar` SEM confirmar, o extrato saiu certo
//   pelo `enviarLiteral`, a paciente respondeu "Quero sim", e ele emendou "Perfeito, ficou agendado"
//   sem nunca fazer a segunda chamada, a que grava. Zero registro no Fluxa.
//
// O padrão é o mesmo nos dois e é o que esta trava mira: o protocolo de duas chamadas perde a
// SEGUNDA, e a frase de conclusão entra no lugar dela. Prompt não segura isso, porque o texto que o
// modelo escreve nesse caso é indistinguível do texto correto. Quem sabe se gravou é o orquestrador,
// que tem o resultado das ferramentas na mão. Mesma divisão de camada da trava de conferência: prova
// do que aconteceu na conversa é daqui, julgamento de catálogo e preço é do MCP.

// Ferramentas de LEITURA que também devolvem `fatoDoSistema`. Consultar não é gravar, e um fato de
// consulta não pode servir de álibi para "ficou agendado" (foi exatamente o álibi que a conversa da
// Vanessa tinha).
//
// A lista é de LEITURA, não de escrita, de propósito: ferramenta desconhecida que devolva fato conta
// como escrita e a trava fica quieta. O erro barato aqui é deixar passar uma afirmação; o caro é
// mandar refazer um turno que já gravou e sair um agendamento duplicado.
const SO_LEITURA = new Set([
  'listar_servicos', 'consultar_disponibilidade', 'meus_agendamentos',
  'listar_bloqueios', 'consultar_agenda', 'consultar_faturamento',
]);

// Gravou alguma coisa NESTE turno? `gravou: true` é o contrato explícito, para quando o MCP quiser
// dizer isso sem ambiguidade; até lá vale o `fatoDoSistema`, que o `agendar` e o `remarcar` só
// emitem depois da escrita real no Fluxa (preview e recusa não geram fato).
export function gravouNesteTurno(toolCalls = []) {
  return (toolCalls || []).some((c) => c?.result?.gravou === true
    || (!SO_LEITURA.has(c?.name) && typeof c?.result?.fatoDoSistema === 'string' && c.result.fatoDoSistema.trim()));
}

// AÇÃO CONCLUÍDA PELA PRÓPRIA AGENTE, não estado da agenda.
//
// "ficou agendado" e "consegui remarcar" dizem que ELA fez agora; "está agendado para quinta" diz que
// existe um agendamento, que é outra afirmação e se prova com consulta, não com escrita. Misturar as
// duas quebraria o caminho legítimo: quem chama `meus_agendamentos` e conta o que achou estaria
// barrado por não ter gravado nada, e não tinha mesmo o que gravar.
const AFIRMA_ACAO = [
  /\b(agendei|marquei|remarquei|reagendei|cancelei|antecipei|transferi|reservei|encaixei)\b/i,
  /\bconsegui\s+(sim\s+)?(antecipar|remarcar|reagendar|agendar|marcar|encaixar|transferir|mudar|trocar|passar)/i,
  /\b(ficou|fica)\s+(agora\s+)?(agendad|marcad|remarcad|reagendad|cancelad|transferid|reservad)[oa]/i,
  // Exige a cópula ("foi"/"ficou"). Sem ela, "agendamento feito por este número" entra, e essa frase
  // aparece justamente quando a agente diz que NÃO achou nada.
  /\b(agendamento|remarca[çc][ãa]o|reagendamento|cancelamento)\s+(j[áa]\s+)?(foi|ficou)\s+(realizad|efetuad|conclu[íi]d|feit|registrad|confirmad)[oa]/i,
  // Só "já deixei", nunca "já está".
  //
  // Medido contra 30 dias de conversa real: `já está marcado/marcada` aparece 20 vezes, e nas 20 é a
  // agente contando o ESTADO da agenda depois de consultar ("Você já está marcada para hoje!"), que é
  // o comportamento certo e se prova com leitura, não com escrita. Barrar isso transformaria a trava
  // num gerador de retrabalho em cima de quem acertou.
  /\bj[áa]\s+deixei\s+(agendad|marcad|remarcad)[oa]/i,
  /\bacabei\s+de\s+(agendar|marcar|remarcar|cancelar)/i,
];

// NEGAÇÃO E PERGUNTA NÃO SÃO AFIRMAÇÃO, e a diferença é uma palavra.
//
// "Não consegui antecipar: sexta já está cheia" contém "consegui antecipar" e é o oposto do que a
// trava procura: é a agente sendo honesta. "Já está agendado?" é pergunta. Por isso a varredura é
// por FRASE e não pela mensagem inteira: numa mensagem só, "não consegui a sexta, mas agendei a
// quinta" tem as duas coisas, e só a segunda metade é afirmação de escrita.
const NEGA = /\bn[ãa]o\s+(consegui|deu|foi\s+poss[íi]vel|ficou|fica|est[áa]|vou|posso|consigo|agendei|marquei|remarquei|cancelei|reservei|encaixei)/i;
// "Agendei aqui para o dia 17, tá?" termina em "?" e não é pergunta nenhuma: é afirmação com bordão
// no fim, que é como a Célia fala. O bordão sai antes de decidir se a frase pergunta alguma coisa.
const BORDAO = /,\s*(t[áa]|viu|n[ée]|certo|ok|beleza|combinado|sim)\s*\?\s*$/i;
const emFrases = (texto) => String(texto).split(/(?<=[.!?\n])\s*/).map((f) => f.trim()).filter(Boolean);
const ehAfirmacao = (frase) => {
  const semBordao = frase.replace(BORDAO, '');
  return !semBordao.endsWith('?') && !NEGA.test(semBordao) && AFIRMA_ACAO.some((re) => re.test(semBordao));
};

// A saída afirma ação concluída sem o sistema ter gravado nada? Devolve o trecho, ou null.
//
// Só o que o MODELO escreveu entra na conta. O que veio por `enviarLiteral` é texto do próprio
// sistema (o extrato, a lista de exames): acusar o sistema de mentir não faz sentido, e o extrato
// contém justamente as palavras que a regra procura.
export function afirmacaoSemGravacao({ parts = [], literais = [], toolCalls = [] } = {}) {
  if (gravouNesteTurno(toolCalls)) return null;
  const doModelo = parts.filter((p) => typeof p === 'string' && !literais.includes(p));
  for (const p of doModelo) {
    const frase = emFrases(p).find(ehAfirmacao);
    if (frase) return { trecho: frase.slice(0, 300), mensagem: p.slice(0, 300) };
  }
  return null;
}

// O que vai ao modelo na segunda tentativa. Diz o que fazer, não o que não fazer: proibição solta
// este modelo ignora (mesmo achado do resumidor de memória, ver memory.mjs).
export const INSTRUCAO_REEXECUCAO = [
  'CORREÇÃO DO SISTEMA, leia antes de responder: na sua última tentativa você escreveu ao cliente que',
  'o agendamento estava feito, mas NENHUMA ferramenta gravou nada. O texto sozinho não marca exame:',
  'só a chamada da ferramenta marca.',
  'Se o cliente já conferiu os dados e disse que está certo, chame agora `agendar` (ou `remarcar`,',
  'quando a data de um exame que já existe é que muda) com confirmar:true e ESPERE o resultado.',
  'Não reenvie o extrato: ele já foi entregue.',
  'Se ainda faltar algum dado, peça o dado que falta em vez de afirmar que está agendado.',
].join(' ');

// Quando nem a segunda tentativa grava, o cliente recebe isto em vez da afirmação falsa. O sistema
// AGE em vez de devolver erro: a frase é verdadeira, não assusta ninguém, e mantém a conversa viva
// enquanto a recepção resolve.
export const FALA_DE_ESCAPE = 'Deixa eu confirmar isso aqui no sistema e já te retorno, tá? 🙏';
