Skip to main content
Centralize todos os disparos de mensagens em um único serviço reutilizável.
// notification-service.ts
import { CordialyClient } from './cordialy';

const cordialy = new CordialyClient(process.env.CORDIALY_API_KEY!);

export const Notificacoes = {

  // ── E-commerce ─────────────────────────────────────────────────────────

  async pedidoConfirmado(leadId: string, pedido: Pedido) {
    await cordialy.leads.sendMessage(leadId,
      `✅ Pedido *#${pedido.id}* confirmado!\n\n` +
      `📦 Itens: ${pedido.itens.join(', ')}\n` +
      `💰 Total: R$ ${pedido.total.toFixed(2)}\n` +
      `🚚 Previsão de entrega: ${pedido.prazoEntrega}`
    );
  },

  async pedidoEnviado(leadId: string, pedido: Pedido) {
    await cordialy.leads.sendMessage(leadId,
      `📦 Seu pedido *#${pedido.id}* saiu para entrega!\n\n` +
      `Rastreio: ${pedido.codigoRastreio}\n` +
      `Transportadora: ${pedido.transportadora}`
    );
  },

  async pedidoEntregue(leadId: string, pedido: Pedido) {
    await cordialy.leads.sendMessage(leadId,
      `🎉 Pedido *#${pedido.id}* entregue!\n\n` +
      `Obrigado pela compra! Sua avaliação é muito importante para nós. ⭐`
    );
    // Marca como convertido
    await cordialy.leads.update(leadId, { status: 'converted' });
  },

  async carrinhoAbandonado(leadId: string, carrinho: Carrinho) {
    await cordialy.leads.sendMessage(leadId,
      `Oi! Vi que você deixou ${carrinho.itens.length} item(s) no carrinho 🛒\n\n` +
      `${carrinho.itens.map(i => `• ${i.nome} — R$ ${i.preco.toFixed(2)}`).join('\n')}\n\n` +
      `Posso te ajudar com alguma dúvida?`
    );
  },

  // ── Financeiro ─────────────────────────────────────────────────────────

  async faturaGerada(leadId: string, fatura: Fatura) {
    await cordialy.leads.sendMessage(leadId,
      `💳 Sua fatura de *R$ ${fatura.valor.toFixed(2)}* foi gerada.\n\n` +
      `📅 Vencimento: ${formatarData(fatura.vencimento)}\n` +
      `🔗 Pague via Pix: ${fatura.linkPagamento}`
    );
  },

  async faturaVencendo(leadId: string, fatura: Fatura, diasRestantes: number) {
    const urgencia = diasRestantes <= 1 ? '⚠️ ATENÇÃO:' : '📅';
    await cordialy.leads.sendMessage(leadId,
      `${urgencia} Sua fatura de *R$ ${fatura.valor.toFixed(2)}* vence ` +
      `${diasRestantes === 0 ? 'hoje' : `em ${diasRestantes} dia(s)`}.\n\n` +
      `Pague agora: ${fatura.linkPagamento}`
    );
  },

  async pagamentoConfirmado(leadId: string, fatura: Fatura) {
    await cordialy.leads.sendMessage(leadId,
      `✅ Pagamento de *R$ ${fatura.valor.toFixed(2)}* confirmado!\n\n` +
      `Obrigado. Seu acesso permanece ativo. 🙏`
    );
  },

  // ── Agendamentos ───────────────────────────────────────────────────────

  async agendamentoConfirmado(leadId: string, agendamento: Agendamento) {
    await cordialy.leads.sendMessage(leadId,
      `📅 *Agendamento confirmado!*\n\n` +
      `🗓 Data: ${formatarData(agendamento.data)}\n` +
      `🕐 Horário: ${agendamento.hora}\n` +
      `📍 Local: ${agendamento.local}\n\n` +
      `Para cancelar ou reagendar, responda esta mensagem.`
    );
  },

  async lembreteAgendamento(leadId: string, agendamento: Agendamento) {
    await cordialy.leads.sendMessage(leadId,
      `⏰ *Lembrete:* você tem um agendamento amanhã!\n\n` +
      `🗓 ${formatarData(agendamento.data)} às ${agendamento.hora}\n` +
      `📍 ${agendamento.local}`
    );
  },
};

// Uso:
// No webhook de pedido do e-commerce:
await Notificacoes.pedidoConfirmado(lead.cordialy_id, pedido);

// No cron de cobranças (rodar diariamente):
for (const fatura of faturasVencendo3Dias) {
  await Notificacoes.faturaVencendo(fatura.leadId, fatura, 3);
}