/**
 * عميل واتساب — WhatsApp Cloud API v21.0 Client
 * يتعامل مع جميع عمليات إرسال الرسائل وتحميل الوسائط
 */
import { config } from '../../config.js';
import { createChildLogger } from '../../utils/logger.js';
const log = createChildLogger('whatsapp:client');
const BASE_URL = 'https://graph.facebook.com/v21.0';
// ─── مساعد الطلبات ──────────────────────────────────────────────────────────
async function apiRequest(endpoint, options = {}) {
    const url = `${BASE_URL}${endpoint}`;
    const response = await fetch(url, {
        ...options,
        headers: {
            Authorization: `Bearer ${config.WHATSAPP_ACCESS_TOKEN}`,
            'Content-Type': 'application/json',
            ...options.headers,
        },
    });
    if (!response.ok) {
        const errorBody = await response.text();
        log.error({ status: response.status, body: errorBody, endpoint }, 'WhatsApp API request failed');
        throw new WhatsAppAPIError(`WhatsApp API error ${response.status}: ${errorBody}`, response.status, errorBody);
    }
    return response.json();
}
export class WhatsAppAPIError extends Error {
    statusCode;
    responseBody;
    constructor(message, statusCode, responseBody) {
        super(message);
        this.statusCode = statusCode;
        this.responseBody = responseBody;
        this.name = 'WhatsAppAPIError';
    }
}
// ─── عميل واتساب ────────────────────────────────────────────────────────────
export class WhatsAppClient {
    phoneNumberId;
    constructor(phoneNumberId) {
        this.phoneNumberId = phoneNumberId ?? config.WHATSAPP_PHONE_NUMBER_ID;
    }
    get messagesEndpoint() {
        return `/${this.phoneNumberId}/messages`;
    }
    /**
     * إرسال رسالة عبر API
     */
    async sendMessage(message) {
        const result = await apiRequest(this.messagesEndpoint, {
            method: 'POST',
            body: JSON.stringify(message),
        });
        log.info({
            to: message.to,
            type: message.type,
            messageId: result.messages?.[0]?.id,
        }, 'Message sent successfully');
        return result;
    }
    // ─── إرسال نص ──────────────────────────────────────────────────────────────
    async sendText(to, text) {
        return this.sendMessage({
            messaging_product: 'whatsapp',
            recipient_type: 'individual',
            to,
            type: 'text',
            text: { preview_url: true, body: text },
        });
    }
    // ─── إرسال صورة ─────────────────────────────────────────────────────────────
    async sendImage(to, imageUrl, caption) {
        return this.sendMessage({
            messaging_product: 'whatsapp',
            recipient_type: 'individual',
            to,
            type: 'image',
            image: { link: imageUrl, caption },
        });
    }
    // ─── إرسال مستند ────────────────────────────────────────────────────────────
    async sendDocument(to, docUrl, filename, caption) {
        return this.sendMessage({
            messaging_product: 'whatsapp',
            recipient_type: 'individual',
            to,
            type: 'document',
            document: { link: docUrl, filename, caption },
        });
    }
    // ─── إرسال صوت ──────────────────────────────────────────────────────────────
    async sendAudio(to, audioUrl) {
        return this.sendMessage({
            messaging_product: 'whatsapp',
            recipient_type: 'individual',
            to,
            type: 'audio',
            audio: { link: audioUrl },
        });
    }
    // ─── إرسال قالب ─────────────────────────────────────────────────────────────
    async sendTemplate(to, templateName, components, languageCode = 'ar') {
        return this.sendMessage({
            messaging_product: 'whatsapp',
            recipient_type: 'individual',
            to,
            type: 'template',
            template: {
                name: templateName,
                language: { code: languageCode },
                components,
            },
        });
    }
    // ─── إرسال أزرار تفاعلية ───────────────────────────────────────────────────
    async sendButtons(to, bodyText, buttons) {
        if (buttons.length > 3) {
            throw new Error('WhatsApp allows maximum 3 buttons per message');
        }
        const action = {
            buttons: buttons.map((btn) => ({
                type: 'reply',
                reply: { id: btn.id, title: btn.title },
            })),
        };
        return this.sendMessage({
            messaging_product: 'whatsapp',
            recipient_type: 'individual',
            to,
            type: 'interactive',
            interactive: {
                type: 'button',
                body: { text: bodyText },
                action,
            },
        });
    }
    // ─── إرسال قائمة تفاعلية ───────────────────────────────────────────────────
    async sendList(to, bodyText, sections, buttonText = 'اختر من القائمة') {
        if (sections.length > 10) {
            throw new Error('WhatsApp allows maximum 10 sections per list');
        }
        const totalRows = sections.reduce((sum, s) => sum + s.rows.length, 0);
        if (totalRows > 10) {
            throw new Error('WhatsApp allows maximum 10 rows total across all sections');
        }
        const action = {
            button: buttonText,
            sections,
        };
        return this.sendMessage({
            messaging_product: 'whatsapp',
            recipient_type: 'individual',
            to,
            type: 'interactive',
            interactive: {
                type: 'list',
                body: { text: bodyText },
                action,
            },
        });
    }
    // ─── تعليم كمقروء ──────────────────────────────────────────────────────────
    async markAsRead(messageId) {
        try {
            await apiRequest(this.messagesEndpoint, {
                method: 'POST',
                body: JSON.stringify({
                    messaging_product: 'whatsapp',
                    status: 'read',
                    message_id: messageId,
                }),
            });
            log.debug({ messageId }, 'Message marked as read');
        }
        catch (error) {
            // لا نريد أن يفشل التطبيق بسبب خطأ في تعليم الرسالة كمقروءة
            log.warn({ messageId, error }, 'Failed to mark message as read');
        }
    }
    /**
     * Mark inbound as read AND show "typing..." to the customer.
     * Meta's WhatsApp Cloud API auto-clears the typing state after ~25s OR on
     * the next outbound message — whichever first. So we send this once when
     * the agent starts processing, and our send-message at the end clears it.
     * Errors are non-fatal — typing is a UX nicety, not core flow.
     */
    async markAsReadAndShowTyping(messageId) {
        try {
            await apiRequest(this.messagesEndpoint, {
                method: 'POST',
                body: JSON.stringify({
                    messaging_product: 'whatsapp',
                    status: 'read',
                    message_id: messageId,
                    typing_indicator: { type: 'text' },
                }),
            });
            log.debug({ messageId }, 'Marked as read + typing shown');
        }
        catch (error) {
            log.warn({ messageId, error }, 'Failed to mark read+typing — non-fatal');
        }
    }
    // ─── تحميل وسائط ───────────────────────────────────────────────────────────
    /**
     * تحميل ملف وسائط من واتساب
     * الخطوة 1: الحصول على URL من media ID
     * الخطوة 2: تحميل الملف الفعلي
     */
    async downloadMedia(mediaId) {
        // الخطوة 1: الحصول على رابط التحميل
        const mediaInfo = await apiRequest(`/${mediaId}`);
        // الخطوة 2: تحميل الملف
        const response = await fetch(mediaInfo.url, {
            headers: {
                Authorization: `Bearer ${config.WHATSAPP_ACCESS_TOKEN}`,
            },
        });
        if (!response.ok) {
            throw new WhatsAppAPIError(`Failed to download media ${mediaId}: ${response.status}`, response.status, await response.text());
        }
        const arrayBuffer = await response.arrayBuffer();
        const buffer = Buffer.from(arrayBuffer);
        log.info({ mediaId, mimeType: mediaInfo.mime_type, size: buffer.length }, 'Media downloaded successfully');
        return {
            buffer,
            mimeType: mediaInfo.mime_type,
        };
    }
    // ─── إرسال رد فعل (Reaction) ──────────────────────────────────────────────
    async sendReaction(to, messageId, emoji) {
        return this.sendMessage({
            messaging_product: 'whatsapp',
            recipient_type: 'individual',
            to,
            type: 'reaction',
            reaction: { message_id: messageId, emoji },
        });
    }
}
// Singleton instance with default phone number ID
export const whatsappClient = new WhatsAppClient();
//# sourceMappingURL=client.js.map