/**
 * مسارات واتساب — WhatsApp Webhook Routes
 * GET  /webhook/whatsapp — التحقق من الـ webhook (Meta verification)
 * POST /webhook/whatsapp — استقبال الرسائل والتحديثات
 */
import { z } from 'zod';
import { config } from '../../config.js';
import { createChildLogger } from '../../utils/logger.js';
import { handleWhatsAppWebhook } from './handler.js';
const log = createChildLogger('whatsapp:routes');
// ─── Validation Schemas ─────────────────────────────────────────────────────
const verifyQuerySchema = z.object({
    'hub.mode': z.literal('subscribe'),
    'hub.verify_token': z.string(),
    'hub.challenge': z.string(),
});
const webhookBodySchema = z.object({
    object: z.literal('whatsapp_business_account'),
    entry: z.array(z.object({
        id: z.string(),
        changes: z.array(z.object({
            value: z.object({
                messaging_product: z.literal('whatsapp'),
                metadata: z.object({
                    display_phone_number: z.string(),
                    phone_number_id: z.string(),
                }),
                contacts: z.array(z.any()).optional(),
                messages: z.array(z.any()).optional(),
                statuses: z.array(z.any()).optional(),
                errors: z.array(z.any()).optional(),
            }),
            field: z.string(),
        })),
    })),
});
// ─── Route Registration ─────────────────────────────────────────────────────
export async function registerWhatsAppRoutes(app) {
    /**
     * GET /webhook/whatsapp — Meta webhook verification
     * ميتا ترسل هذا الطلب عند تسجيل الـ webhook
     */
    app.get('/webhook/whatsapp', async (request, reply) => {
        const query = request.query;
        const parsed = verifyQuerySchema.safeParse(query);
        if (!parsed.success) {
            log.warn({ query }, 'Invalid webhook verification request');
            return reply.status(400).send('Bad Request');
        }
        const { 'hub.verify_token': token, 'hub.challenge': challenge } = parsed.data;
        if (token !== config.WHATSAPP_VERIFY_TOKEN) {
            log.warn('Webhook verification failed: invalid verify token');
            return reply.status(403).send('Forbidden');
        }
        log.info('WhatsApp webhook verified successfully ✅');
        return reply.status(200).send(challenge);
    });
    /**
     * POST /webhook/whatsapp — استقبال الرسائل والتحديثات
     * يجب الرد بـ 200 فوراً ثم معالجة الرسالة في الخلفية
     */
    app.post('/webhook/whatsapp', async (request, reply) => {
        const body = request.body;
        // التحقق من صحة البيانات
        const parsed = webhookBodySchema.safeParse(body);
        if (!parsed.success) {
            log.warn({ errors: parsed.error.issues }, 'Invalid webhook payload received');
            // لا نزال نرد بـ 200 لتجنب إعادة الإرسال من ميتا
            return reply.status(200).send('OK');
        }
        // الرد فوراً ثم المعالجة في الخلفية
        // هذا مهم جداً — ميتا تتوقع رد سريع وإلا تعيد الإرسال
        reply.status(200).send('OK');
        // معالجة في الخلفية — لا ننتظر
        setImmediate(async () => {
            try {
                await handleWhatsAppWebhook(parsed.data);
            }
            catch (error) {
                log.error({ error }, 'Unhandled error in webhook processing');
            }
        });
    });
    log.info('WhatsApp webhook routes registered 📱');
}
//# sourceMappingURL=routes.js.map