/**
 * Workflow: Conflito de Agenda (1 Hora)
 *
 * Regra de negócio:
 *   - Pessoa A solicita o slot que Pessoa B já tem PENDENTE.
 *   - Sistema marca o conflito como WAITING_B e aguarda 1 hora.
 *   - Se B confirmar dentro de 1h  → slot permanece com B, A é notificada.
 *   - Se B não responder em 1h    → slot é liberado e transferido para A.
 */
import {
  proxyActivities,
  sleep,
  defineSignal,
  setHandler,
  condition,
  log,
} from '@temporalio/workflow'
import type * as acts from '../activities'

const {
  liberarSlotAgenda,
  notificarConflito,
} = proxyActivities<typeof acts>({
  startToCloseTimeout: '30 seconds',
  retry: { maximumAttempts: 3 },
})

// Signal enviado quando B confirma o slot
export const confirmarSlotSignal = defineSignal<[{ confirmado: boolean }]>('confirmarSlot')

export interface ConflitoAgendaInput {
  solicitanteId: string        // Pessoa A
  detentorId: string           // Pessoa B
  chatIdSolicitante: string
  chatIdDetentor: string
  tituloSlot: string           // ex: "Consulta 14h do dia 10/04"
}

export async function conflitoAgendaWorkflow(input: ConflitoAgendaInput): Promise<{
  resultado: 'MANTIDO_B' | 'LIBERADO_A'
}> {
  let bConfirmou = false

  // Registra o handler do signal de confirmação de B
  setHandler(confirmarSlotSignal, ({ confirmado }) => {
    bConfirmou = confirmado
    log.info('Signal recebido de B', { confirmado })
  })

  // Notifica B sobre a disputa
  await notificarConflito({
    chatIdB: input.chatIdDetentor,
    solicitanteNome: input.solicitanteId,
    tituloSlot: input.tituloSlot,
  })

  log.info('Aguardando confirmação de B por 1 hora', { tituloSlot: input.tituloSlot })

  // Aguarda signal de B OU timeout de 1 hora
  const bRespondeu = await condition(() => bConfirmou !== false, '1 hour')

  if (bRespondeu && bConfirmou) {
    log.info('B confirmou o slot — slot mantido com B')
    return { resultado: 'MANTIDO_B' }
  }

  // B não respondeu ou recusou → libera para A
  log.info('B não confirmou em 1 hora — liberando slot para A')
  await liberarSlotAgenda({
    solicitanteId: input.solicitanteId,
    tituloSlot: input.tituloSlot,
    chatIdSolicitante: input.chatIdSolicitante,
  })

  return { resultado: 'LIBERADO_A' }
}
