'use strict'

const Order = require('../models/Order')
const Ticket = require('../models/Ticket')
const WhatsappCore = require('../services/whatsappService')

const ASAAS_WEBHOOK_TOKEN = process.env.ASAAS_WEBHOOK_TOKEN

const webhookController = {
  async asaasWebhook(req, res) {
    try {
      if (!ASAAS_WEBHOOK_TOKEN) {
        console.error('[Webhook Asaas] ASAAS_WEBHOOK_TOKEN não configurado')
        return res.status(500).json({ error: 'Configuração incompleta' })
      }
      const incomingToken = req.headers['asaas-access-token']
      if (!incomingToken || incomingToken !== ASAAS_WEBHOOK_TOKEN) {
        console.warn('[Webhook Asaas] Token inválido rejeitado')
        return res.status(401).json({ error: 'Não autorizado' })
      }

      const { event, payment } = req.body

      if (!event || !payment) {
        return res.status(400).json({ error: 'Payload inválido' })
      }

      console.log(`[Webhook Asaas] Recebido evento: ${event} para o pagamento ${payment.id}`)

      if (event === 'PAYMENT_CONFIRMED' || event === 'PAYMENT_RECEIVED') {
        const order = await Order.findByAsaasId(payment.id)
        if (!order) {
          console.error(`[Webhook Asaas] Pedido não encontrado para payment.id: ${payment.id}`)
          return res.status(404).json({ error: 'Pedido não encontrado' })
        }

        if (order.status !== 'paid') {
          await Order.updateStatus(order.id, 'paid')
          await Ticket.confirmOrder(order.id)

          // Fase 7: Dispara Confirmação de Compra pelo WhatsApp via BullMQ Fila
          const getTickets = await Ticket.getByOrderId(order.id)
          if (getTickets && getTickets.length > 0) {
             const userPhone = getTickets[0].usuario_telefone
             const numerosComprados = getTickets.map(t => t.numero).join(', ')
             
             WhatsappCore.sendNotification({
                 userId: null,
                 phone: userPhone,
                 type: 'purchase_confirmed',
                 variables: {
                     numeros: numerosComprados,
                     valor: parseFloat(order.total_amount).toFixed(2),
                     link: `${process.env.APP_URL || 'http://alemaoconveniencias.local'}/meus-premios`
                 }
             }).catch(console.error)
          }

          console.log(`[Webhook Asaas] Pagamento confirmado! Pedido ${order.id} status atualizado para 'paid' e tickets garantidos.`)
        } else {
          console.log(`[Webhook Asaas] Pedido ${order.id} já estava marcado como 'paid'.`)
        }
      } else if (event === 'PAYMENT_DELETED' || event === 'PAYMENT_OVERDUE') {
        const order = await Order.findByAsaasId(payment.id)
        if (order && order.status !== 'paid') {
            await Order.updateStatus(order.id, event === 'PAYMENT_DELETED' ? 'canceled' : 'expired')
        }
      }

      return res.json({ success: true })
    } catch (error) {
      console.error('[Webhook Asaas] Erro no processamento:', error)
      return res.status(500).json({ error: 'Erro interno no processamento do webhook' })
    }
  }
}

module.exports = webhookController
