<?php
/**
 * Smart Logic WhatsApp Bot - Enhanced Version
 * Version: 2.0 | Date: 2024-07-06
 */


require_once __DIR__ . '/config.php';




// ======== Directory Creation (Best Practice & Error Safe) ========

if (isset($config['dirs']) && is_array($config['dirs'])) {
    foreach ($config['dirs'] as $dir) {
        if (!is_dir($dir)) {
            // Create directory with permissions if not exists
            @mkdir($dir, 0755, true);
        }
    }
}

// ======== Enhanced Logging System ========
function logMessage(string $message, string $type = 'INFO', string $user_id = null): void {
    global $config;
    $timestamp = date('Y-m-d H:i:s');
    $prefix = "[$timestamp] [$type]" . ($user_id ? " [User: $user_id]" : '');
    $entry = "$prefix $message\n";
    
    $logFiles = [
        'ERROR'      => 'logs/errors.log',
        'WARNING'    => 'logs/warnings.log',
        'RATE_LIMIT' => 'logs/rate_limits.log',
        'CONVERSION' => 'logs/conversions.log',
        'API'        => 'logs/api_requests.log'
    ];
    
    $filepath = $logFiles[$type] ?? 'logs/activity.log';
    // Ensure log directory exists
    if (!is_dir(dirname($filepath))) {
        @mkdir(dirname($filepath), 0755, true);
    }
    @file_put_contents($filepath, $entry, FILE_APPEND | LOCK_EX);
}

// ======== Security Headers (should be sent only ONCE per request) ========
// NOTE: It's best to send headers from your main entry script only ONCE!
// Here for reference, but don't repeat in every include:
if (!headers_sent()) {
    header('Content-Type: application/json; charset=utf-8');
    header('X-Content-Type-Options: nosniff');
    header('X-Frame-Options: DENY');
    header('X-XSS-Protection: 1; mode=block');
    header('Strict-Transport-Security: max-age=31536000');
}

// ======== Input Validation ========
function validateInput($input): bool {
    $input = $input ?? '';
    $trimmed = trim($input);
    return !empty($trimmed) &&
           mb_strlen($trimmed, 'UTF-8') <= 2000 &&
           mb_strlen($trimmed, 'UTF-8') >= 1;
}

function sanitizeInput($input): string {
    $input = $input ?? '';
    $input = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/', '', $input);
    $input = preg_replace('/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/i', '', $input);
    return trim(htmlspecialchars($input, ENT_QUOTES, 'UTF-8'));
}

// ======== Defensive Helper for All Inputs ========
function safeInput($input): string {
    return isset($input) && $input !== null ? (string)$input : '';
}

// ======== Token Management ========
function getOpenAIToken(): string {
    global $openaiTokens;
    static $tokenIndex = 0;
    
    if (empty($openaiTokens)) {
        throw new RuntimeException('No OpenAI tokens available');
    }
    
    $token = $openaiTokens[$tokenIndex];
    $tokenIndex = ($tokenIndex + 1) % count($openaiTokens);
    
    return $token;
}








// ======== Main Execution Flow ========
try {
    $rawInput = file_get_contents('php://input');
    if ($rawInput) {
        @file_put_contents('logs/webhook.log', "[" . date('Y-m-d H:i:s') . "] $rawInput\n", FILE_APPEND | LOCK_EX);
    }

    // Handle webhook verification challenge (GET request)
    if ($_SERVER['REQUEST_METHOD'] === 'GET') {
        handleVerification();
        exit;
    }

    // Ensure POST request
    if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
        http_response_code(405);
        echo json_encode(['error' => 'Method not allowed']);
        exit;
    }

    // Decode WhatsApp payload
    $data = json_decode($rawInput, true) ?? [];
    if (json_last_error() !== JSON_ERROR_NONE) {
        throw new Exception('Invalid JSON received: ' . json_last_error_msg());
    }

    // Extract message (ignore if status)
// Extract message (ignore if status)
$message = extractWebhookMessage($data);
if (!$message) {
    echo json_encode(['status' => 'ignored']);
    exit;
}

// ===== معالجة التعليقات أولاً (قبل معالجة الرسائل العادية) =====
if (($message['type'] ?? '') === 'comment') {
    $commentId = $message['comment_id'] ?? '';
    $userId = $message['from_id'] ?? '';
    $platform = $message['platform'] ?? 'facebook';
    $field = $message['field'] ?? '';
    $postId = $message['post_id'] ?? '';
    
    // الحصول على نص التعليق
// في معالجة التعليقات، بدلاً من محاولة جلب النص من API:
$commentText = trim($message['comment_text'] ?? '');

// لا تحاول جلب من API إذا كان معرف التعليق يحتوي على "_"
// لأن هذا قد يعني أنه مُركب ولا يمكن الوصول إليه مباشرة
if (empty($commentText) && !empty($commentId) && strpos($commentId, '_') === false) {
    $commentText = fetchCommentText($commentId, $config['facebook_token']);
    logMessage("Fetched comment text from API: '$commentText'", 'INFO', $userId);
}

// إذا ما زال فارغ، استخدم نص افتراضي
if (empty($commentText)) {
    $commentText = 'شكرًا لتعليقك! نقدر تفاعلك معنا';
    logMessage("Using default comment text", 'INFO', $userId);
}


    // Log البيانات الأولية للتشخيص
    file_put_contents('logs/comment_processing.log', 
        date('Y-m-d H:i:s') . " [$platform] Processing comment\n" .
        "Field: $field\n" .
        "Comment ID: $commentId\n" .
        "User ID: $userId\n" .
        "Post ID: $postId\n" .
        "Initial Text: '$commentText'\n" .
        "Raw data: " . json_encode($message, JSON_UNESCAPED_UNICODE) . "\n\n", 
        FILE_APPEND
    );
    
    // إذا كان النص فارغ، جرب جلبه من API
    if (empty($commentText) && !empty($commentId)) {
        $commentText = fetchCommentText($commentId, $config['facebook_token']);
        logMessage("Fetched comment text from API: '$commentText'", 'INFO', $userId);
    }
    
    // إذا ما زال فارغ، استخدم رسالة واضحة
    if (empty($commentText)) {
        $commentText = 'شكرًا لتعليقك!';
        logMessage("Empty comment detected for ID: $commentId - using default text", 'WARNING', $userId);
    }
    
    logMessage("$platform comment from $userId: $commentText", 'INFO', $userId);
    
    // إدارة الحالة لمنع التكرار
    $stateKey = md5($platform . '_' . $commentId);
    $commentStateFile = "cache/comment_state_{$stateKey}.json";
    $defaultState = [
        'comment_id'   => $commentId,
        'user_id'      => $userId,
        'platform'     => $platform,
        'field'        => $field,
        'post_id'      => $postId,
        'comment_text' => $commentText,
        'like_done'    => false,
        'reply_sent'   => false,
        'dm_sent'      => false,
        'ai_reply'     => null,
        'dm_text'      => null,
        'created_at'   => time(),
        'updated_at'   => time()
    ];
    $commentState = $defaultState;
    if (is_file($commentStateFile)) {
        $storedState = json_decode(file_get_contents($commentStateFile), true);
        if (is_array($storedState)) {
            $commentState = array_merge($commentState, $storedState);
        }
    }
    $saveCommentState = function () use (&$commentState, $commentStateFile) {
        $commentState['updated_at'] = time();
        @file_put_contents(
            $commentStateFile,
            json_encode($commentState, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT),
            LOCK_EX
        );
    };

    $commentState['comment_text'] = $commentText;
    $commentState['field'] = $field;
    $commentState['post_id'] = $postId;
    $saveCommentState();

    if ($commentState['reply_sent'] && $commentState['dm_sent'] && $commentState['like_done']) {
        logMessage("Comment already fully processed: $commentId", 'INFO', $userId);
        echo json_encode([
            'status' => 'already_processed',
            'platform' => $platform,
            'comment_id' => $commentId,
            'user_id' => $userId,
            'comment_liked' => true,
            'comment_reply_sent' => true,
            'dm_sent' => true,
            'comment_text' => $commentState['comment_text'],
            'ai_reply' => $commentState['ai_reply'],
            'dm_text' => $commentState['dm_text']
        ]);
        exit;
    }

    // إنشاء رد الذكاء الاصطناعي عند الحاجة فقط
    if (empty($commentState['ai_reply'])) {
        $conversation = [
            [
                'role' => 'system',
                'content' => buildSystemPrompt([
                    'business_type' => '',
                    'interests' => [],
                    'qualification_status' => 'new',
                    'lead_score' => 0
                ])
            ],
            [
                'role' => 'user',
                'content' => "$commentText (تعليق من $platform)"
            ]
        ];

        $aiReply = getAIResponse($conversation);
        if (!$aiReply) {
            if ($platform === 'instagram') {
                $aiReply = "شكرًا لتعليقك! 👋 راسلنا خاص للمزيد من المعلومات 📱";
            } else {
                $aiReply = "شكرًا لتعليقك! 👋\nللمزيد من المعلومات راسلنا خاص أو زر موقعنا:\n🌐 smartlogiceg.com\n📱 +201144470365";
            }
        }

        $aiReply = preg_replace('/\[BUTTONS:.*?\]/i', '', $aiReply);
        $aiReply = trim($aiReply);

        if (mb_strlen($aiReply) > 300) {
            $aiReply = mb_substr($aiReply, 0, 280) . "...\n🔗 للمزيد راسلنا خاص";
        }

        $commentState['ai_reply'] = $aiReply;
        $saveCommentState();
    } else {
        $aiReply = (string)$commentState['ai_reply'];
    }

    // حارس لمنع تكرار الردود: رد واحد فقط لكل (منصة + بوست + مستخدم)
    $replyOnceKey = md5(implode('_', [
        (string)$platform,
        (string)$postId,
        (string)$userId
    ]));
    $replyOnceFile = "cache/replied_once_{$replyOnceKey}.flag";

    // 1. لايك التعليق مرة واحدة
    if (!$commentState['like_done'] && !empty($commentId)) {
        if (likeComment($commentId, $config['facebook_token'])) {
            $commentState['like_done'] = true;
            $saveCommentState();
            logMessage("Comment liked successfully", 'INFO', $userId);
        } else {
            logMessage("Comment like failed", 'WARNING', $userId);
        }
    }

    // 2. إرسال الرد مع المنشن مرة واحدة (حقيقي) على مستوى (post_id + from_id)
    if (!file_exists($replyOnceFile) && !$commentState['reply_sent'] && !empty($commentId)) {
        $replyWithMention = createReplyWithMention($aiReply, $userId, $platform);
        if (replyToComment($commentId, $replyWithMention, $config['facebook_token'], $platform)) {
            $commentState['reply_sent'] = true;
            $saveCommentState();
            // وضع علامة أن هذا المستخدم تم الرد عليه لهذا البوست
            @file_put_contents($replyOnceFile, (string)time());
            logMessage("Single comment reply sent successfully", 'INFO', $userId);
        } else {
            logMessage("Comment reply failed", 'ERROR', $userId);
        }
    }

    // 3. إرسال رسالة خاصة مرة واحدة فقط أيضاً حسب (post_id + from_id)
    if (!file_exists($replyOnceFile) && !$commentState['dm_sent'] && !empty($userId)) {
        $dmText = $commentState['dm_text'] ?? (
            "شكرًا لاهتمامك بخدمات Smart Logic! 🙏✨\n\n" . $aiReply .
            "\n\n💬 يسعدنا الرد على أي استفسار إضافي في أي وقت.\n" .
            "📞 للتواصل المباشر: +201144470365\n" .
            "🌐 زورنا: smartlogiceg.com"
        );
        $commentState['dm_text'] = $dmText;
        $saveCommentState();

        if ($platform === 'instagram') {
            $dmSent = sendInstagramDM($userId, $dmText, $config['facebook_token']);
        } else {
            $dmSent = sendMessengerMessage($userId, $dmText);
        }

        if ($dmSent) {
            $commentState['dm_sent'] = true;
            $saveCommentState();
            // ضع نفس العلامة حتى لا نرسل DM أو رد ثاني مرة
            @file_put_contents($replyOnceFile, (string)time());
            logMessage("Private message sent successfully", 'INFO', $userId);
        } else {
            logMessage("Private message failed to send", 'WARNING', $userId);
        }
    }

    echo json_encode([
        'status' => 'comment_processed',
        'platform' => $platform,
        'comment_liked' => (bool)$commentState['like_done'],
        'comment_reply_sent' => (bool)$commentState['reply_sent'],
        'dm_sent' => (bool)$commentState['dm_sent'],
        'timestamp' => time(),
        'comment_id' => $commentId,
        'user_id' => $userId,
        'comment_text' => $commentState['comment_text'],
        'ai_reply' => $commentState['ai_reply'],
        'dm_text' => $commentState['dm_text']
    ]);
    exit;


}


// باقي الكود للرسائل العادية...
// في أعلى الملف أو بعد require_once:
$forwardNumbers = [ '201094490609', '201285451680'];
$targetNumber = '201144470365';

// ... بعد استخراج الرسالة:
$from = $message['from'] ?? '';
$userInput = extractMessageText($message) ?? '';
$platform = $message['platform'] ?? 'whatsapp';
// معالجة الميديا لواتساب: تنزيل الصوت ونسخ الكلام، حفظ الصور
try {
    if ($platform === 'whatsapp') {
        $msgType = $message['type'] ?? '';
        if (in_array($msgType, ['audio','voice'])) {
            $mediaId = $message[$msgType]['id'] ?? '';
            if ($mediaId) {
                $download = downloadWhatsAppMedia($mediaId);
                if ($download && !empty($download['path'])) {
                    $transcribed = transcribeAudioOpenAI($download['path']);
                    if ($transcribed) {
                        $userInput = '[صوت] ' . $transcribed;
                        logMessage('Audio transcribed successfully', 'INFO', $from);
                    } else {
                        logMessage('Audio transcription failed', 'WARNING', $from);
                    }
                }
            }
        } elseif ($msgType === 'image') {
            $mediaId = $message['image']['id'] ?? '';
            if ($mediaId) {
                $download = downloadWhatsAppMedia($mediaId);
                if ($download && !empty($download['path'])) {
                    // خزّن المسار في الميتا وواصل المحادثة بدون استدعاء AI للرؤية لتقليل التكلفة
                    $meta['image_path'] = $download['path'];
                    $meta['image_mime'] = $download['mime'] ?? '';
                    logMessage('Image downloaded: ' . $download['path'], 'INFO', $from);
                }
            }
        }
    }
} catch (Throwable $e) {
    logMessage('Media handling error: ' . $e->getMessage(), 'ERROR', $from);
}

// كود التحويل:
// Forward internal team messages to all sales numbers
if (in_array($from, $forwardNumbers)) {
    $recipients = array_unique(array_merge([$targetNumber], $forwardNumbers));
    foreach ($recipients as $rcpt) {
        if ($rcpt === $from) continue; // don't notify sender
        sendInternalAlert($rcpt, "رسالة داخلية من فريق المبيعات من $from:\n$userInput");
    }
    // Extra emphasis to Sales Manager (Ramy)
    $manager = $config['sales_manager_number'] ?? '201094490609';
    if ($manager && $manager !== $from && !in_array($manager, $recipients, true)) {
        sendInternalAlert($manager, "[تنبيه مدير المبيعات] رسالة من $from:\n$userInput");
    } elseif ($manager && $manager !== $from) {
        // Send an emphasized extra copy
        sendInternalAlert($manager, "[تنبيه إضافي] رسالة من $from:\n$userInput");
    }
}
if (false && in_array($from, $forwardNumbers)) {
    sendWhatsAppMessage($targetNumber, "رسالة جديدة تم تحويلها من $from:\n$userInput");
}



// === إنشاء/تحديث Lead في Odoo من كل رسالة ===
try {
    $customer = loadCustomerData($from); // عندك بالفعل
    // اسم الشخص إن وُجد من الcustomer أو سيبه null
    $customerName = $customer['name'] ?? null;

    // لو عندك استخراج ايميل من الرسالة - اختياري
    $email = null;
    if (preg_match('/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/i', $userInput, $m)) {
        $email = $m[0];
    }

    $leadId = odooUpsertLeadFromChat($odoo, [
        'name'       => $customerName,
        'message'    => $userInput,
        'phone'      => $from,              // رقم واتساب كـ phone
        'email'      => $email,
        'platform'   => $platform,          // whatsapp/messenger/instagram
        'source_name'=> $odoo['default_source'], // WhatsApp Chatbot
        'extra'      => $meta ?? []         // نفس الـ meta اللي بتحفظه
    ]);

    logMessage("Odoo Lead upserted: ID=$leadId", 'INFO', $from);

} catch (Throwable $e) {
    logMessage("Odoo Lead error: ".$e->getMessage(), 'ERROR', $from);
}


// تجهيز بيانات إضافية لكل رسالة
$meta = [
    'type' => $message['type'] ?? 'unknown',
    'raw' => $message
];

// تخزين ID الميديا لو فيه
foreach (['image', 'video', 'audio', 'document', 'sticker'] as $mtype) {
    if (isset($message[$mtype]['id'])) {
        $meta['media_id'] = $message[$mtype]['id'];
        $meta['caption'] = $message[$mtype]['caption'] ?? '';
    }
}

// استخراج الأكواد الرقمية (OTP)
if (preg_match('/\b\d{4,8}\b/', $userInput, $otpMatch)) {
    $meta['otp'] = $otpMatch[0];
}


    logMessage("Received: '" . mb_substr($userInput, 0, 100) . "'", 'INFO', $from);

    // Rate limit & duplicate
    if (!$from || !checkRateLimit($from) || isDuplicateMessage($from, $userInput)) {
        http_response_code(200);
        exit;
    }

    // Detect if this is the first-ever message from this customer
    $isNewConversation = empty(loadConversation($from));

    // Load customer/chat, add message
    $customer = loadCustomerData($from);

    // Notify sales team on first conversation start (no message sent to customer)
    if ($isNewConversation && ($config['notify_on_new_chat'] ?? false)) {
        try {
            notifySalesOnNewChat($from, $platform ?? 'whatsapp', $customer);
        } catch (Throwable $e) {
            logMessage('Failed to notify sales on new chat: ' . $e->getMessage(), 'WARNING', $from);
        }
    }

    addToChatLog($from, $userInput, 'user', $meta);
    updateCustomerProfile($customer, $userInput);

    // Build conversation for AI
    $conversation = loadConversation($from);
    $conversation = initConversation($conversation, $customer);
    $conversation = trimConversationHistory($conversation);

    // ===== Get AI Response (with cheap fallbacks) =====
    // اختصار استهلاك API: ردود سريعة بدون AI لبعض الأنماط البسيطة
    $normalized = trim(mb_strtolower($userInput, 'UTF-8'));
    $quickMap = [
        'شكرا' => 'شكرًا لك! هل تحتاج أي مساعدة إضافية؟',
        'شكراً' => 'شكرًا لك! يسعدنا خدمتك دائمًا.',
        'thanks' => 'Thanks! How can we help you further?',
        'hi' => 'أهلاً وسهلاً! كيف نساعدك؟',
        'hello' => 'مرحبًا! كيف نساعدك اليوم؟',
    ];
    $aiResponse = null;
    if (isset($quickMap[$normalized])) {
        $aiResponse = $quickMap[$normalized];
    } else {
        $aiResponse = getAIResponse($conversation);
    }
    if ($aiResponse === null) {
        $aiResponse = 'عذراً، حدث خطأ تقني. سيتم التواصل معك قريباً من فريق Smart Logic. للاستفسار الفوري: +201144470365';
    }
    logMessage("AI RAW: " . $aiResponse, 'INFO', $from);

    // ===== Extract Buttons (case-insensitive) =====
    $buttons = [];
    $responseText = $aiResponse;
    if (preg_match('/\[(buttons):\s*(.*?)\]/i', $aiResponse, $matches)) {
        $responseText = trim(str_replace($matches[0], '', $aiResponse));
        $buttonTitles = array_map('trim', explode('|', $matches[2]));
        $buttons = array_filter($buttonTitles);
    }

    // ===== Fallback: Default buttons لو AI لم يرجّع أزرار في أول محادثة =====
    if (empty($buttons) && count($conversation) <= 2) {
        sendInteractiveMessage($from, "مرحبًا بك في Smart Logic! 👋 اختر من الأزرار 👇", ["خدماتنا", "تواصل معنا"]);
        addToChatLog($from, "مرحبًا بك في Smart Logic! 👋 اختر من الأزرار 👇", 'assistant');
        saveCustomerData($from, $customer);
        http_response_code(200);
        echo json_encode(['status' => 'success']);
        exit;
    }


function sendMessengerQuickReplies(string $to, string $body, array $buttons): bool {
    global $config;
    $quickReplies = [];
    foreach (array_slice($buttons, 0, 11) as $button) {
        $quickReplies[] = [
            'content_type' => 'text',
            'title' => $button,
            'payload' => $button
        ];
    }
    $payload = json_encode([
        'recipient' => ['id' => $to],
        'message'   => [
            'text' => $body,
            'quick_replies' => $quickReplies
        ]
    ], JSON_UNESCAPED_UNICODE);

    $ch = curl_init("https://graph.facebook.com/v19.0/me/messages?access_token={$config['messenger_token']}");
    curl_setopt_array($ch, [
        CURLOPT_POST => true,
        CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
        CURLOPT_POSTFIELDS => $payload,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => $config['messenger_timeout'],
        CURLOPT_SSL_VERIFYPEER => true
    ]);
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    logMessage("Messenger Quick Replies API response: $httpCode $response", 'INFO', $to);
    curl_close($ch);
    return $httpCode >= 200 && $httpCode < 300;
}


    // ===== Send Actual Message =====
    $messageSent = false;
$platform = $message['platform'] ?? 'whatsapp';

if ($platform === 'messenger') {
    logMessage("Messenger response to $from", 'INFO', $from);
    // يمكنك هنا لاحقًا عمل دالة للأزرار السريعة، الآن ابعت نص فقط
       if (!empty($buttons)) {
        // لو عايز تدعم أزرار سريعة (Quick Replies) في ماسنجر
        $messageSent = sendMessengerQuickReplies($from, $responseText, $buttons);
    } else {
        $messageSent = sendMessengerMessage($from, $responseText);
    }
} else {
    // واتساب: أزرار أو نص
    if (!empty($buttons)) {
        logMessage("Sending interactive WhatsApp response to $from", 'INFO', $from);
        $messageSent = sendInteractiveMessage($from, $responseText, $buttons);
    } else {
        logMessage("Sending standard WhatsApp text response to $from", 'INFO', $from);
        $messageSent = sendWhatsAppMessage($from, $responseText);
    }
}



    if (!$messageSent) {
        throw new Exception('Failed to send WhatsApp message');
    }

    addToChatLog($from, $aiResponse, 'assistant');
    saveCustomerData($from, $customer);
    trackConversionSignals($from, $userInput, $aiResponse);

    logMessage('Reply sent successfully', 'INFO', $from);
    http_response_code(200);
    echo json_encode(['status' => 'success']);

} catch (Throwable $e) {
    handleError($e, $from ?? null, $userInput ?? null);
}








// ======== Core Functions ========
function handleVerification(): void {
    global $config;

    if (!isset($_GET['hub_verify_token'])) {
        http_response_code(400);
        exit;
    }

    if (hash_equals($config['verify_token'], $_GET['hub_verify_token'])) {
        logMessage('Webhook verified');
        echo $_GET['hub_challenge'] ?? '';
    } else {
        logMessage('Invalid verify token', 'ERROR');
        http_response_code(403);
        echo json_encode(['error' => 'Forbidden']);
    }
}





function extractWebhookMessage(array $data): ?array {
    
        $webhookHash = md5(json_encode($data));
    $webhookCacheFile = "cache/webhook_$webhookHash.txt";
    
    if (file_exists($webhookCacheFile)) {
        $lastProcessed = (int)file_get_contents($webhookCacheFile);
        if ((time() - $lastProcessed) < 30) { // 30 ثانية
            return null; // تجاهل الـ webhook المكرر
        }
    }
    
    // WhatsApp payload
    if (isset($data['entry'][0]['changes'][0]['value']['messages'][0])) {
        $msg = $data['entry'][0]['changes'][0]['value']['messages'][0];
        $msg['platform'] = 'whatsapp';
        return $msg;
    }
    
    // Messenger payload (تجاهل delivery receipts)
    elseif (isset($data['entry'][0]['messaging'][0])) {
        $msgObj = $data['entry'][0]['messaging'][0];
        
        // تجاهل delivery receipts و read receipts
        if (isset($msgObj['delivery']) || isset($msgObj['read'])) {
            return null;
        }
        
        if (isset($msgObj['message']['text'])) {
            return [
                'from'     => $msgObj['sender']['id'] ?? '',
                'type'     => 'text',
                'platform' => 'messenger',
                'text'     => $msgObj['message']['text']
            ];
        }
    }
    
    // Facebook/Instagram Comments - تحديث شامل
    elseif (isset($data['entry'][0]['changes'][0])) {
        $change = $data['entry'][0]['changes'][0];
        $field = $change['field'] ?? '';
        
        // Log البيانات الخام للتشخيص
        file_put_contents('logs/comment_debug.log', 
            date('Y-m-d H:i:s') . " WEBHOOK RECEIVED\n" .
            "FIELD: $field\n" .
            "FULL DATA: " . json_encode($data, JSON_UNESCAPED_UNICODE) . "\n\n", 
            FILE_APPEND
        );
        
        // دعم كل الـ fields المحتملة للتعليقات
        if (in_array($field, ['feed', 'comments', 'mention', 'comment', 'live_comments']) && isset($change['value'])) {
            $value = $change['value'];
            
            // تحديد نوع الحدث
            $item = $value['item'] ?? '';
            $verb = $value['verb'] ?? '';
            
            // شروط أوسع للتعرف على التعليق
            $isComment = (
                $item === 'comment' || 
                $verb === 'add' || 
                isset($value['comment_id']) || 
                isset($value['id']) ||
                ($field === 'feed' && isset($value['message'])) ||
                ($field === 'comments' && (isset($value['text']) || isset($value['message']))) ||
                ($field === 'comment') // أحياناً يأتي بهذا الاسم
            );
            
            if ($isComment) {
                // محاولة استخراج النص من كل الحقول المحتملة
                $commentText = '';
                $textFields = [
                    'message',      // Facebook الأساسي
                    'text',         // Instagram الأساسي
                    'comment_text', // بديل
                    'body',         // بديل آخر
                    'content'       // بديل إضافي
                ];
                
                foreach ($textFields as $textField) {
                    if (!empty($value[$textField]) && is_string($value[$textField])) {
                        $commentText = trim($value[$textField]);
                        if ($commentText !== '') break;
                    }
                }
                
                // تحديد المنصة بطريقة أفضل
                $platform = 'facebook'; // افتراضي
                
                // طرق تحديد Instagram
                if (
                    strpos(json_encode($value), 'instagram') !== false ||
                    isset($value['media']) ||
                    isset($value['media_id']) ||
                    ($field === 'comments' && !isset($value['post_id'])) ||
                    isset($value['media_type'])
                ) {
                    $platform = 'instagram';
                }
                
                // استخراج معرف المستخدم بطرق مختلفة
                $fromId = '';
                $fromFields = ['sender_id', 'from', 'user_id', 'author_id'];
                foreach ($fromFields as $fromField) {
                    if (!empty($value[$fromField])) {
                        $fromId = is_array($value[$fromField]) ? $value[$fromField]['id'] : $value[$fromField];
                        if (!empty($fromId)) break;
                    }
                }
                
                return [
                    'type'         => 'comment',
                    'platform'     => $platform,
                    'comment_id'   => $value['comment_id'] ?? $value['id'] ?? '',
                    'from_id'      => $fromId,
                    'comment_text' => $commentText,
                    'post_id'      => $value['post_id'] ?? $value['media']['id'] ?? $value['parent_id'] ?? '',
                    'raw_data'     => $value,
                    'field'        => $field
                ];
            }
        }
    }

    // تجاهل delivery receipts بدلاً من log كـ unhandled
    if (isset($data['entry'][0]['messaging'][0]['delivery']) || isset($data['entry'][0]['messaging'][0]['read'])) {
        return null;
    }

    // Log للحالات غير المتوقعة فقط
    file_put_contents('logs/webhook_unhandled.log', 
        date('Y-m-d H:i:s') . " UNHANDLED WEBHOOK: " . json_encode($data, JSON_UNESCAPED_UNICODE) . "\n", 
        FILE_APPEND
    );
    
    
      // في نهاية الدالة قبل return، أضف:
    if (isset($change) && isset($change['value'])) {
        file_put_contents($webhookCacheFile, time());
    }
    return null;
}



function mentionUser($postId, $userId, $accessToken) {
    if (empty($postId) || empty($userId) || empty($accessToken)) {
        return false;
    }
    
    // محاولة عمل mention في comment منفصل
    $url = "https://graph.facebook.com/v19.0/{$postId}/comments";
    $data = [
        'message' => "شكرًا لتفاعلك معنا! 🙏 @[$userId]",
        'access_token' => $accessToken
    ];
    
    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => http_build_query($data),
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_SSL_VERIFYPEER => true,
        CURLOPT_TIMEOUT => 15
    ]);
    
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    
    // Log محاولة المنشن
    file_put_contents('logs/mention_attempts.log', 
        date('Y-m-d H:i:s') . " Mention attempt: Post $postId, User $userId, HTTP: $httpCode\n" .
        "Response: $response\n\n", 
        FILE_APPEND
    );
    
    curl_close($ch);
    
    return $httpCode >= 200 && $httpCode < 300;
}









function extractMessageText(array $message): string {
    

    if (($message['type'] ?? '') === 'comment') {
        $txt = trim($message['comment_text'] ?? '');
        return $txt === '' ? '[تعليق فارغ]' : $txt;
    }

    if (($message['platform'] ?? '') === 'messenger') {
        return trim($message['text'] ?? '[رسالة فارغة]');
    }
    
    $type = $message['type'] ?? 'unknown';

    switch($type) {
        case 'text':
            $text = $message['text']['body'] ?? '';
            break;

        case 'button':
            $text = $message['button']['payload'] ?? $message['button']['text'] ?? '[زر تفاعلي]';
            break;

        case 'interactive':
            $text = extractInteractiveMessage($message['interactive'] ?? []);
            break;

        case 'image':
            $caption = $message['image']['caption'] ?? '';
            $media_id = $message['image']['id'] ?? '';
            $text = "[صورة] ID: $media_id" . ($caption ? " - $caption" : '');
            break;

        case 'video':
            $caption = $message['video']['caption'] ?? '';
            $media_id = $message['video']['id'] ?? '';
            $text = "[فيديو] ID: $media_id" . ($caption ? " - $caption" : '');
            break;

        case 'audio':
        case 'voice':
            $media_id = $message[$type]['id'] ?? '';
            $text = "[صوت] ID: $media_id";
            break;

        case 'document':
            $caption = $message['document']['caption'] ?? '';
            $media_id = $message['document']['id'] ?? '';
            $filename = $message['document']['filename'] ?? '';
            $text = "[ملف] $filename - ID: $media_id" . ($caption ? " - $caption" : '');
            break;

        case 'sticker':
            $media_id = $message['sticker']['id'] ?? '';
            $text = "[ملصق] ID: $media_id";
            break;

        case 'location':
            $lat = $message['location']['latitude'] ?? '';
            $lng = $message['location']['longitude'] ?? '';
            $name = $message['location']['name'] ?? '';
            $address = $message['location']['address'] ?? '';
            $text = "[موقع جغرافي] $name $address (Lat: $lat, Lng: $lng)";
            break;

        case 'contacts':
            $contacts = $message['contacts'] ?? [];
            $text = "[جهة اتصال] " . json_encode($contacts, JSON_UNESCAPED_UNICODE);
            break;

        case 'order':
            $order = $message['order'] ?? [];
            $text = "[طلب منتج] " . json_encode($order, JSON_UNESCAPED_UNICODE);
            break;

default:
        logMessage('UNSUPPORTED MESSAGE: ' . json_encode($message, JSON_UNESCAPED_UNICODE), 'ERROR');
    // لو الرسالة فيها أي نص مهما كان المفتاح، حتى لو النوع "unsupported" أو غريب
    $fallback = '';
    foreach (['body', 'caption', 'payload', 'text', 'message', 'value'] as $key) {
        if (!empty($message[$type][$key])) {
            $fallback = $message[$type][$key];
            break;
        }
    }
    // أحيانًا الـ payload نفسه هو نص
    if (empty($fallback) && !empty($message[$type]) && is_string($message[$type])) {
        $fallback = $message[$type];
    }
    // لو وجد نص، اعرضه مباشرة (بدون أي قوس أو تعليق)
    if (!empty($fallback)) {
        $text = $fallback;
    } else {
        $details = isset($message[$type]) ? json_encode($message[$type], JSON_UNESCAPED_UNICODE) : '';
        $text = "[نوع رسالة: $type]" . ($details ? ' - ' . $details : '');
    }


    }

    // Handle replies
    if (isset($message['context']['from'])) {
        $text = "رد على رسالة: " . $text;
    }

    $text = trim(strip_tags($text));
    if (empty($text)) $text = "[رسالة فارغة]";

    return mb_substr($text, 0, 1500, 'UTF-8');
}


function sendMessengerMessage(string $to, string $message): bool {
    global $config;
    $payload = json_encode([
        'recipient' => ['id' => $to],
        'message'   => ['text' => $message]
    ], JSON_UNESCAPED_UNICODE);

    $ch = curl_init("https://graph.facebook.com/v19.0/me/messages?access_token={$config['messenger_token']}");
    curl_setopt_array($ch, [
        CURLOPT_POST => true,
        CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
        CURLOPT_POSTFIELDS => $payload,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => $config['messenger_timeout'] ?? 8,
        CURLOPT_SSL_VERIFYPEER => true
    ]);
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    logMessage("Messenger API response: $httpCode $response", 'INFO', $to);

    curl_close($ch);
    return $httpCode >= 200 && $httpCode < 300;
}


function extractInteractiveMessage(array $interactive): string {
    if ($interactive['button_reply']['title'] ?? false) {
        return $interactive['button_reply']['title'];
    }
    if ($interactive['list_reply']['title'] ?? false) {
        return $interactive['list_reply']['title'];
    }
    if ($interactive['product']['title'] ?? false) {
        return '[استفسار عن منتج: ' . $interactive['product']['title'] . ']';
    }
    return '[رسالة تفاعلية]';
}

function checkRateLimit(string $phone): bool {
    global $config;
    $rateFile = "logs/rate_$phone.txt";
    $now = time();

    if (file_exists($rateFile)) {
        $lastRequest = (int)@file_get_contents($rateFile);
        if ($now - $lastRequest < $config['rate_limit_seconds']) {
            logMessage("Rate limited", 'RATE_LIMIT', $phone);
            addToChatLog($phone, 'تم تجاهل الرسالة بسبب الإرسال السريع', 'system');
            return false;
        }
    }

    @file_put_contents($rateFile, $now);
    return true;
}

function isDuplicateMessage(string $phone, string $message): bool {
    global $config;
    $conversation = loadConversation($phone);
    $now = time();

    foreach (array_slice($conversation, -5) as $msg) {
        if (
            $msg['role'] === 'user' &&
            $msg['content'] === $message &&
            isset($msg['timestamp']) &&
            ($now - $msg['timestamp']) < $config['duplicate_threshold']
        ) {
            logMessage("Duplicate message", 'WARNING', $phone);
            return true;
        }
    }
    return false;
}

function initConversation(array $conversation, array $customer): array {
    global $config;
    if (empty($conversation) || $conversation[0]['role'] !== 'system') {
        $systemPrompt = buildSystemPrompt($customer);
        array_unshift($conversation, ['role' => 'system', 'content' => $systemPrompt]);
    }
    return $conversation;
}

function trimConversationHistory(array $conversation): array {
    global $config;
    if (count($conversation) > $config['max_history']) {
        $systemMsg = array_shift($conversation);
        $conversation = array_slice($conversation, -($config['max_history'] - 1));
        array_unshift($conversation, $systemMsg);
    }
    return $conversation;
}

// ======== Customer Management ========
function loadCustomerData(string $phone): array {
    $file = "customers/" . basename($phone) . ".json";
    if (file_exists($file)) {
        $data = json_decode(file_get_contents($file), true);
        return is_array($data) ? $data : getDefaultCustomerData($phone);
    }
    return getDefaultCustomerData($phone);
}

function getDefaultCustomerData(string $phone): array {
    return [
        'phone' => $phone,
        'business_type' => '',
        'interests' => [],
        'conversation_count' => 0,
        'notes' => [],
        'qualification_status' => 'new',
        'lead_score' => 0,
        'created_at' => time(),
        'last_contact' => time(),
        'conversion_signals' => [],
        'note' => '', // ملاحظة يدوي
        'custom_details' => '', // تفاصيل المشروع
        'followup_date' => null // معاد الفولو اب (يونكس تايم أو null)
    ];
}

function saveCustomerData(string $phone, array $data): void {
    $data['last_contact'] = time();
    $file = "customers/" . basename($phone) . ".json";
    @file_put_contents($file, json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT), LOCK_EX);
}

function updateCustomerProfile(array &$customer, string $input): void {
    global $config;
    $input = $input ?? '';
    $customer['conversation_count']++;
    $customer['notes'][] = [
        'msg' => mb_substr($input, 0, 200),
        'ts' => time()
    ];

if (preg_match('/\b\d{4,8}\b/', $input, $otpMatch)) {
    if (!isset($customer['otps'])) $customer['otps'] = [];
    $customer['otps'][] = [
        'code' => $otpMatch[0],
        'ts' => time()
    ];
}

    if (count($customer['notes']) > $config['max_notes']) {
        $customer['notes'] = array_slice($customer['notes'], -$config['max_notes']);
    }

    $lower = mb_strtolower($input, 'UTF-8');

    // Detect business type
    if (empty($customer['business_type'])) {
        $businessPatterns = [
            '/مطعم|كافيه|طعام|restaurant|cafe|food/' => 'مطاعم وكافيهات',
            '/عيادة|طبيب|صيدلية|medical|clinic|pharmacy/' => 'طبي وصحي',
            '/محاماة|محامي|قانوني|law|legal|lawyer/' => 'خدمات قانونية',
            '/متجر|تجارة|بيع|شراء|store|shop|retail/' => 'تجارة إلكترونية',
            '/تعليم|مدرسة|دورات|تدريب|education|training/' => 'تعليمي',
            '/عقارات|شقق|فيلا|أراضي|real estate|property/' => 'عقاري',
            '/تصميم|جرافيك|إعلان|design|advertising/' => 'تصميم وإعلان',
            '/استشارات|خدمات|consulting|services/' => 'استشارات',
            '/تكنولوجيا|برمجة|تطبيقات|tech|programming/' => 'تكنولوجيا',
            '/مصنع|تصنيع|manufacturing|factory/' => 'تصنيع وإنتاج'
        ];

        foreach ($businessPatterns as $regex => $type) {
            if (preg_match($regex . 'u', $lower ?? '')) {
                $customer['business_type'] = $type;
                break;
            }
        }
    }

    // Update qualification status
    if (preg_match('/زائر|visitor|visit/iu', $input ?? '')) {
        $customer['qualification_status'] = 'visitor';
    } elseif (preg_match('/عارض|exhibitor|exhibit|مشارك/iu', $input ?? '')) {
        $customer['qualification_status'] = 'exhibitor';
        $customer['lead_score'] += 10;
    }

    // Detect interests
    $interestPatterns = [
        '/معرض|exhibition|expo|fair/' => 'معارض دولية',
        '/تصدير|export|international/' => 'التصدير والاستيراد',
        '/منتج|product|manufacturing/' => 'عرض المنتجات',
        '/شركة|company|business/' => 'تطوير الأعمال',
        '/تسويق|marketing|promotion/' => 'التسويق الدولي'
    ];

    foreach ($interestPatterns as $regex => $interest) {
        if (preg_match($regex . 'u', $lower ?? '') && !in_array($interest, $customer['interests'])) {
            $customer['interests'][] = $interest;
            $customer['lead_score'] += 2;
        }
    }

    if (count($customer['interests']) > 10) {
        $customer['interests'] = array_slice($customer['interests'], -10);
    }
}

function trackConversionSignals(string $phone, string $userInput, string $aiResponse): void {
    $customer = loadCustomerData($phone);
    $input = mb_strtolower($userInput ?? '', 'UTF-8');
    $signals = [];
    $newlyQualified = false;

    if (preg_match('/مهتم|interested|أريد|want|محتاج|need/u', $input)) {
        $signals['interest_expressed'] = time();
        $customer['lead_score'] += 5;
    }

    if (preg_match('/سعر|price|cost|تكلفة|كام|كم/u', $input)) {
        $signals['price_inquiry'] = time();
        $customer['lead_score'] += 8;
    }

    if (preg_match('/متى|when|موعد|date|تاريخ/u', $input)) {
        $signals['timeline_inquiry'] = time();
        $customer['lead_score'] += 6;
    }

    if (preg_match('/تسجيل|register|اشتراك|booking/u', $input)) {
        $signals['registration_intent'] = time();
        $customer['lead_score'] += 15;
        if ($customer['qualification_status'] !== 'qualified') {
            $customer['qualification_status'] = 'qualified';
            $newlyQualified = true;
        }
    }

    if (preg_match('/اتصال|call|تواصل|contact|رقم|number/u', $input)) {
        $signals['contact_request'] = time();
        $customer['lead_score'] += 12;
        logMessage('Contact requested', 'CONVERSION', $phone);
        $newlyQualified = true; // إشارة قوية تستدعي الإشعار
    }

    if (!empty($signals)) {
        $customer['conversion_signals'] = array_merge($customer['conversion_signals'] ?? [], $signals);
        saveCustomerData($phone, $customer);

        // إشعار فريق المبيعات إذا كانت هناك إشارة مهمة
        if ($newlyQualified) {
            $signalType = isset($signals['registration_intent']) ? 'نية تسجيل' : 'طلب اتصال';
            notifySalesTeam($phone, $customer, $signalType);
        }
    }
}

// ======== Conversation Management ========
function loadConversation(string $phone): array {
    $file = "chats/" . basename($phone) . ".json";
    return file_exists($file) ?
        (json_decode(file_get_contents($file), true) ?? []) :
        [];
}

function saveConversation(string $phone, array $conversation): void {
    $file = "chats/" . basename($phone) . ".json";
    @file_put_contents($file, json_encode($conversation, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT), LOCK_EX);
}

function addToChatLog(string $phone, string $content, string $role, array $meta = []): void {
    $conversation = loadConversation($phone);
    $conversation[] = [
        'role' => $role,
        'content' => $content,
        'timestamp' => time(),
        'meta' => $meta // بيانات إضافية مثل نوع الرسالة أو ID الميديا أو الكود
    ];
    saveConversation($phone, $conversation);
}


// ======== AI Response Generation ========
function getAIResponse(array $conversation): ?string {
    global $config;

    // 1) قلّل التاريخ المستخدم فعليًا لتقليل التكلفة
    $maxHist = (int)($config['ai_max_history'] ?? 16);
    if ($maxHist > 0 && count($conversation) > $maxHist) {
        // احتفظ بأول رسالة system ثم آخر ($maxHist-1)
        $system = $conversation[0]['role'] === 'system' ? array_shift($conversation) : null;
        $conversation = array_slice($conversation, -($maxHist - 1));
        if ($system) array_unshift($conversation, $system);
    }

    // 2) كاش مبني على محتوى الرسائل
    $cacheKey = md5(json_encode($conversation, JSON_UNESCAPED_UNICODE));
    $cacheFile = "cache/ai_{$cacheKey}.json";
    $ttl = (int)($config['ai_cache_ttl'] ?? 1800);
    if (is_file($cacheFile) && (time() - filemtime($cacheFile) < $ttl)) {
        $cached = json_decode(@file_get_contents($cacheFile), true);
        if (!empty($cached['content'])) {
            return (string)$cached['content'];
        }
    }

    // 3) إعدادات موديل أخف
    $model = $config['ai_model'] ?? 'gpt-4o-mini';
    $temperature = (float)($config['ai_temperature'] ?? 0.3);
    $maxTokens = (int)($config['ai_max_tokens'] ?? 400);

    $payload = json_encode([
        'model' => $model,
        'messages' => $conversation,
        'temperature' => $temperature,
        'max_tokens' => $maxTokens,
        'presence_penalty' => 0.1,
        'frequency_penalty' => 0.1,
    ], JSON_UNESCAPED_UNICODE);

    $ch = curl_init('https://api.openai.com/v1/chat/completions');
    curl_setopt_array($ch, [
        CURLOPT_POST => true,
        CURLOPT_HTTPHEADER => [
            'Content-Type: application/json',
            'Authorization: Bearer ' . getOpenAIToken(),
        ],
        CURLOPT_POSTFIELDS => $payload,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => $config['api_timeout'],
        CURLOPT_SSL_VERIFYPEER => true
    ]);

    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    if (curl_errno($ch)) {
        logMessage('cURL error: ' . curl_error($ch), 'API');
        curl_close($ch);
        return null;
    }

    curl_close($ch);

    if ($httpCode !== 200) {
        logMessage("API error $httpCode: $response", 'API');
        return null;
    }

    $data = json_decode($response, true);
    $content = $data['choices'][0]['message']['content'] ?? null;
    if ($content !== null) {
        @file_put_contents($cacheFile, json_encode(['content' => $content, 'ts' => time()], JSON_UNESCAPED_UNICODE));
    }
    return $content;
}

// ======== WhatsApp Media Helpers ========
function getWhatsAppMediaUrl(string $mediaId): ?array {
    global $config;
    if (!$mediaId) return null;
    $url = "https://graph.facebook.com/v19.0/{$mediaId}";
    $qs = http_build_query(['access_token' => $config['whatsapp_token']]);
    $ch = curl_init("{$url}?{$qs}");
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => $config['whatsapp_timeout'] ?? 25,
        CURLOPT_SSL_VERIFYPEER => true,
    ]);
    $res = curl_exec($ch);
    $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    if ($code !== 200) return null;
    $json = json_decode($res, true);
    if (empty($json['url'])) return null;
    return ['url' => $json['url'], 'mime' => $json['mime_type'] ?? 'application/octet-stream'];
}

function downloadWhatsAppMedia(string $mediaId): ?array {
    global $config;
    $info = getWhatsAppMediaUrl($mediaId);
    if (!$info) return null;
    $headers = [
        'Authorization: Bearer ' . $config['whatsapp_token']
    ];
    $ext = 'bin';
    if (!empty($info['mime']) && strpos($info['mime'], '/') !== false) {
        $parts = explode('/', $info['mime']);
        $ext = end($parts);
        $ext = preg_replace('/[^a-z0-9]/i', '', $ext) ?: 'bin';
    }
    if (!is_dir('imports')) @mkdir('imports', 0755, true);
    $dest = 'imports/' . $mediaId . '.' . $ext;

    $fp = fopen($dest, 'wb');
    if (!$fp) return null;

    $ch = curl_init($info['url']);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_SSL_VERIFYPEER => true,
        CURLOPT_TIMEOUT => $config['whatsapp_timeout'] ?? 25,
        CURLOPT_HTTPHEADER => $headers,
    ]);
    $data = curl_exec($ch);
    $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    if ($code >= 200 && $code < 300 && $data !== false) {
        fwrite($fp, $data);
        fclose($fp);
        return ['path' => $dest, 'mime' => $info['mime'] ?? ''];
    }
    fclose($fp);
    @unlink($dest);
    return null;
}

function transcribeAudioOpenAI(string $filePath): ?string {
    global $config;
    if (!is_file($filePath)) return null;
    $model = $config['ai_transcribe_model'] ?? 'whisper-1';

    $ch = curl_init('https://api.openai.com/v1/audio/transcriptions');

    $fields = [
        'model' => $model,
        'file' => new CURLFile($filePath)
    ];

    curl_setopt_array($ch, [
        CURLOPT_POST => true,
        CURLOPT_HTTPHEADER => [
            'Authorization: Bearer ' . getOpenAIToken()
        ],
        CURLOPT_POSTFIELDS => $fields,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => $config['api_timeout'] ?? 30,
        CURLOPT_SSL_VERIFYPEER => true,
    ]);
    $res = curl_exec($ch);
    $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    if ($code !== 200) return null;
    $json = json_decode($res, true);
    return $json['text'] ?? null;
}
function buildSystemPrompt(array $customer): string {
    $businessType = $customer['business_type'] ?: 'غير محدد';
    $interests = $customer['interests'] ? implode(', ', $customer['interests']) : 'غير محدد';
    $status = $customer['qualification_status'] ?? 'new';
    $leadScore = $customer['lead_score'] ?? 0;

return <<<PROMPT
🔸 *بيانات العميل:*
- *نوع النشاط التجاري:* $businessType
- *الاهتمامات:* $interests
- *حالة العميل:* $status
- *درجة التأهيل:* $leadScore نقطة
---
أنت *مستشار التسويق الرقمي والتقني الاحترافي* لفريق *Smart Logic Business Solutions*  
(شركة تقنية متخصصة 100% أونلاين – مقر مصر – نخدم مصر، الخليج، أوروبا. خبرة +10 سنوات في تطوير المواقع/المتاجر، الأنظمة الذكية، التسويق الرقمي، أتمتة الأعمال، التحول الرقمي، تصميم الهوية البصرية).

*مهمتك الأساسية:* تحويل العميل إلى *قرار شراء/حجز فوري* عبر شرح عملي موجز + فائدة ملموسة + خطوة تالية واضحة.

## 🧠 أسلوب الحديث الطبيعي (مُحدَّث)
- تحدث بلغة عربية فصحى احترافية، جُمل قصيرة، نبرة ودودة واثقة دون مبالغة.
- لا تستخدم الأزرار في *رسالة الترحيب* و*أول سؤال*. استخدم الأزرار فقط عندما تعرض *أكثر من اختيار واضح* (حد أقصى 3).
- *بنهاية كل رسالة دائمًا:* ضع *سؤالًا قصيرًا جدًا (3–7 كلمات)* يطلب المعلومة التالية الأهم. **السؤال القصير يجب أن يكون آخر سطر.**
- لا تطرح أكثر من سؤال واحد في الرسالة. لا تكرر معلومات سبق ذكرها.
- عندما يرد العميل بإجابة عامة مثل "مش عارف"، اعرض 2–3 خيارات جاهزة لتيسير القرار (يمكن استخدام الأزرار هنا).
- التزم حصريًا بخدمات Smart Logic. إذا كان الطلب خارجها:  
  "نركز على تقديم حلول متكاملة داخل Smart Logic، دعني أوضح لك كيف نحقق نفس الهدف بطريقتنا…"
- *إبراز الركائز الأربع دائمًا* في سطر موجز داخل الرد (ليس ختامًا):  
  **الأمان المتقدم (SSL/GDPR/PCI/نسخ احتياطي يومي) • توسعة سهلة • مرونة كاملة • دعم 12 ساعة**

## 🧩 مسار جمع المتطلبات (اسأل عنصرًا واحدًا في كل مرة)
اسأل تدريجيًا وفق الأولوية التالية (واسأل التالي غير المكتمل فقط):
1) الهدف الرئيسي (بيع/حجز/استفسارات)  2) السوق/الدولة المستهدفة  
3) نوع الخدمة الأنسب مبدئيًا (موقع/متجر/نظام/ERP/بوت/تطبيق)  
4) الميزانية التقريبية  5) موعد الإطلاق/الإطار الزمني  
6) اللغة/اللغات  7) عدد الصفحات أو المنتجات  8) طرق الدفع والشحن (إن وُجدت)  
9) التكاملات المطلوبة (بوابات دفع/شحن/ERP/CRM/APIs)  10) عدد المستخدمين/الأدوار

> **صيغة السؤال القصير:** فعل + مكوّن واحد. أمثلة:  
> "ما هدفك الآن؟" – "السوق المستهدف؟" – "ميزانية تقريبية؟" – "موعد الإطلاق؟"

## 🧱 هيكل كل رد (ثابت لكن مرن)
- *جملة افتتاحية مخصصة* تربط بما قاله العميل أو اهتماماته.
- *شرح الخدمة + 2–3 فوائد عملية مباشرة* (زيادة المبيعات/توفير الوقت/تقليل التكلفة).  
  *سطر الركائز:* الأمان المتقدم • توسعة سهلة • مرونة كاملة • دعم 12 ساعة.
- *السعر الدقيق إذا سأل* أو *نطاق سعر* + ما يشمله (استضافة، دومين، إيميلات، تدريب، دعم، تسويق أولي).
- *الخطوة التالية الواضحة* (مثال: "احجز استشارة مجانية 15 دقيقة لنحلل احتياجك ونرسل عرضًا خلال 24 ساعة").
- *الأزرار (اختياري)* عند وجود اختيارات متعددة فقط.  
- **السؤال القصير جدًا (آخر سطر دائمًا).**

## 🔹 مميزات Smart Logic (مختصرة للردود)
- متكاملة: تحليل مجاني → تصميم → تطوير → تدريب → دعم مستمر.  
- استضافة سحابية + دومين + بريد احترافي مجانًا أول سنة.  
- كتابة محتوى + صور + فيديو تسويقي + هوية بصرية كاملة.  
- بوت AI ذكي: 1,000 جنيه/شهر (واتساب + موقع + تقارير + تصدير).  
- تسويق رقمي آلي: خطة مجانية + إدارة حملات Google/Meta + تقارير لحظية.  
- أنظمة قابلة للتوسعة: ERP/CRM/متاجر/حجز/مطاعم – تتكامل سويًا.  
- دفع مرن: دفعة واحدة | أقساط بدون فوائد | اشتراك شهري.

## 🔸 تفاصيل الأسعار (محدثة وموحَّدة)
| الخدمة | السعر يبدأ من | ما يشمله |
|--------|---------------|----------|
| 🤖 بوت AI | 1,000 جنيه/شهر | قنوات متعددة + تقارير + تصدير + دعم |
| 🌐 موقع WordPress | 8,000 جنيه | تصميم مخصص + لغتين + SEO + محتوى |
| 🛒 متجر إلكتروني | 16,000 جنيه | دفع + شحن + فواتير إلكترونية |
| 🖥 نظام Laravel | 9,000 جنيه | لوحة تحكم + APIs + تقارير |
| 📱 تطبيق موبايل | 14,000 جنيه | iOS + Android + إشعارات |
| ⚙ Odoo ERP | 18,000 جنيه | مبيعات + مخزون + حضور + تقارير |
> *كل الأسعار تشمل:* استضافة + دومين + إيميلات + تدريب + دعم + خطة تسويق أولية.

## 🏆 سابقة أعمال (روابط مختصرة)
- Tasadar.com – Laravel + SEO  
- RasAlhamra.com – WordPress مقاولات  
- 53PRO System – نظام إدارة شركة  
- 53PRO.com –شركة محاسبة و مراجعة مالية   

- unitedarabexpo.com –تنظيم معارض دولية   
- dafatrak –شركة مراجعة مالية    

- Smart Logic System – ERP متكامل  
- بروفايل شامل: smartlogiceg.com/smartlogic-profile

## 👣 آلية العمل
1) استشارة مجانية (15 دقيقة) → تحليل احتياج.  
2) عرض سعر مخصص (خلال 24 ساعة) → مع تصور مرئي.  
3) موافقة + دفعة أولى → بدء التنفيذ.  
4) تسليم + تدريب + دعم مستمر.

---

## 🎯 سيناريوهات ردود *طبيعية ومختصرة* (كلها تنتهي بسؤال قصير)
> **مهم:** لا تستخدم الأزرار في الترحيب وأول سؤال. استخدمها فقط عند وجود اختيارات.

### 0) الترحيب (بدون أزرار)
مرحبًا! يسعدني مساعدتك في *$businessType*. أخبرني باختصار ما الذي تريد تحقيقه أولًا لنوجّهك للحل الأسرع عائدًا.  
**ما هدفك الآن؟**

### 1) العميل: "كم سعر موقع تعريفي؟" (بدون أزرار)
سعر موقع laravel الاحترافي *يبدأ من 10,000 جنيه* ويشمل الاستضافة، الدومين، الإيميلات، المحتوى، وSEO أولي مع تدريب ودعم. سيساعدك على إظهار احترافية علامتك وجذب عملاء جدد تلقائيًا.  
**لغة واحدة أم لغتان؟**

### 2) العميل: "عاوز متجر إلكتروني" (أزرار لاختيار المنصة)
متجر جاهز للبيع يبدأ من *16,000 جنيه* مع دفع وشحن وفواتير وتقارير، وربط شركات الشحن وبوابات الدفع. هدفه تسريع إطلاقك وزيادة المبيعات.  
[BUTTONS: WooCommerce | Odoo eCommerce | متجر Laravel مخصص]  
**عدد المنتجات تقريبًا؟**

### 3) العميل: "محتاج بوت شات"
بوت الذكاء الاصطناعي بـ*1,000 جنيه/شهر* يعمل على واتساب والموقع، يجمع بيانات العملاء ويقدم تقارير يومية و يتربط بالواتس اب و الماسنجر و الفيس بوك. يوفر وقت فريقك ويستقبل الطلبات 24/7.  
[BUTTONS: واتساب | موقع | كلاهما]  
**كم حجم المحادثات اليومي؟**

### 4) العميل: "ممكن أقساط أو نظام اشتراك؟"
نعم، نوفر *أقساط بدون فوائد* أو *اشتراك شهري* حسب حجم المشروع. مثال: متجر إلكتروني بـ*16,000 جنيه* → *3 دفعات شهرية* (≈ *5,333 جنيه/شهر*). كل الباقات تشمل الاستضافة والدعم.  
[BUTTONS: دفعة واحدة | أقساط 3 أشهر | اشتراك شهري]  
**موعد الإطلاق المتوقع؟**

### 5) العميل: "شفتوا شغل قبل كده؟"
أكيد، لدينا أمثلة حية في المتاجر والأنظمة وERP. يمكننا عمل *جولة ديمو مباشرة* لتتأكد بنفسك.  
[BUTTONS: جولة ديمو مباشر | تحميل البروفايل | طلب عرض سعر]  
**أي مجال أقرب لنشاطك؟**

### 6) العميل: "مش عارف أبدأ منين" (بدون أزرار)
لا تقلق. سنبدأ باستشارة مجانية 15 دقيقة لنحدد الحل الأنسب ونرسل عرضًا مبدئيًا واضحًا خلال 24 ساعة.  
**السوق المستهدف؟**

### 7) العميل: "عاوز نظام إدارة مطعم"
نظام مطاعم متكامل يبدأ من *18,000 جنيه*: طلبات وفواتير ومخزون وتقارير يومية وربط الدفع أونلاين وتطبيق نادل. يقلّل الهدر ويزيد سرعة الخدمة.  
[BUTTONS: تجربة ديمو النظام | طلب عرض سعر | حجز استشارة]  
**عدد الفروع؟**

### 8) العميل: "هل في دعم بعد التسليم؟" (بدون أزرار)
نعم، دعم يومي من 10ص إلى 10م عبر واتساب وإيميل ومكالمة، مع تحديثات ونسخ احتياطي وتدريب إضافي. نوفر عقود دعم شهرية/سنوية مرنة.  
**تفضّل دعمًا شهريًا أم بالطلب؟**

### 9) العميل: "ممكن فيديو تعريفي؟"
يشمل كل مشروع فيديو تعريفي (30–60 ثانية) مع صور ومحتوى وسيناريو بالتعاون معك. يمكن دمج الفيديو مع الموقع في عرض واحد.  
[BUTTONS: طلب عرض فيديو | حجز استشارة | تحميل البروفايل]  
**أين سيُعرض الفيديو؟**

### 10) اعتراض عام: "مش مقتنع"
نفهمك تمامًا. جرّب دون التزام: استشارة مجانية + ديمو مباشر + عرض مخصص. لدينا أكثر من 50 عميلًا في مصر والخليج.  
[BUTTONS: تجربة ديمو مجاني | حجز استشارة | طلب عرض سعر]  
**ما أهم نتيجة تريدها؟**

---

## 📱 معلومات تواصل
- واتساب: +201144470365
- الموقع: smartlogiceg.com
- البروفايل: smartlogiceg.com/smartlogic-profile

## 🔁 أتمتة المتابعة
- إن لم يرد العميل خلال 3 دقائق:  
  "هل ما زلت مهتمًا؟ يمكنني جدولة مكالمة سريعة أو إرسال عرض سعر فوري 📩"  
  **أفضل وسيلة تواصل؟**
- عند طلب ديمو: أرسل رابط مباشر + أقرب موعدين مقترحين.  
- عند طلب عرض سعر: اطلب *(الاسم + النشاط + رقم التواصل)* ثم أرسل PDF مخصص خلال 24 ساعة.

*كل رد = خطوة للأمام. كل سؤال ختامي = تجميع معلومة واحدة. لا أزرار في الترحيب وأول سؤال. الأزرار للاختيارات فقط.*

PROMPT;
}





/**
 * Sends an interactive message with up to 3 buttons.

 */
function sendInteractiveMessage(string $to, string $body, array $buttons): bool {
    global $config;

    $buttonPayloads = [];
    foreach (array_slice($buttons, 0, 3) as $i => $buttonTitle) {
        $buttonPayloads[] = [
            'type' => 'reply',
            'reply' => [
                'id' => 'btn' . ($i+1), // لازم id بسيط جدًا
                'title' => $buttonTitle
            ]
        ];
    }

    $payload = json_encode([
        'messaging_product' => 'whatsapp',
        'to' => $to,
        'type' => 'interactive',
        'interactive' => [
            'type' => 'button',
            'body' => ['text' => $body],
            'action' => ['buttons' => $buttonPayloads]
        ]
    ], JSON_UNESCAPED_UNICODE);

    $ch = curl_init("https://graph.facebook.com/v19.0/{$config['phone_number_id']}/messages");
    curl_setopt_array($ch, [
        CURLOPT_POST => true,
        CURLOPT_HTTPHEADER => [
            'Content-Type: application/json',
            'Authorization: Bearer ' . $config['whatsapp_token'],
        ],
        CURLOPT_POSTFIELDS => $payload,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => $config['whatsapp_timeout'],
        CURLOPT_SSL_VERIFYPEER => true
    ]);

    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    logMessage("WhatsApp API response: $httpCode $response", 'INFO', $to);

    if (curl_errno($ch)) {
        logMessage('WhatsApp Interactive error: ' . curl_error($ch), 'ERROR', $to);
        curl_close($ch);
        return false;
    }
    curl_close($ch);
    return $httpCode >= 200 && $httpCode < 300;
}



function notifySalesTeam(string $phone, array $customer, string $signalType): void {
    // Broadcast to all configured sales numbers (new behavior)
    global $config;
    $msg = "إشعار مبيعات ($signalType): عميل مهتم $phone\n" .
           "الحالة: " . ($customer['qualification_status'] ?? 'new') . " | النقاط: " . ($customer['lead_score'] ?? 0);
    $numbers = $config['sales_notify_numbers'] ?? [];
    if (is_string($numbers)) { $numbers = [$numbers]; }
    foreach ($numbers as $n) { @sendInternalAlert($n, $msg); }
    $manager = $config['sales_manager_number'] ?? '201094490609';
    if ($manager) { @sendInternalAlert($manager, "[تنبيه مدير المبيعات] $msg"); }
    logMessage("Sales Team notified for $signalType signal from $phone", 'CONVERSION', $phone);
    return;
    $msg = "عميل مؤهل ($signalType): رقم الهاتف $phone، حالة العميل: {$customer['qualification_status']}، نقاط: {$customer['lead_score']}";

    // إرسال تنبيه لـ WhatsApp الخاص بفريق المبيعات
    sendWhatsAppMessage("201144470365", $msg);

    // حفظ السجل
    logMessage("Sales Team notified for $signalType signal from $phone", 'CONVERSION', $phone);
}


// Send a sales notification when a new chat starts
function notifySalesOnNewChat(string $phone, string $platform, array $customer): void {
    global $config;

    // Avoid duplicate notifications if already sent
    if (!empty($customer['first_chat_notified'])) {
        return;
    }

    $numbers = $config['sales_notify_numbers'] ?? [];
    if (is_string($numbers)) { $numbers = [$numbers]; }

    $leadScore = (string)($customer['lead_score'] ?? 0);
    $qStatus = (string)($customer['qualification_status'] ?? 'new');
    $ts = date('Y-m-d H:i');

    $msg = "إشعار مبيعات: بدأ عميل محادثة جديدة\n" .
           "الهاتف: +$phone\n" .
           "المنصة: $platform\n" .
           "الحالة: $qStatus | النقاط: $leadScore\n" .
           "الوقت: $ts";

    foreach ($numbers as $n) {
        @sendInternalAlert($n, $msg);
    }
    // Extra emphasized copy to Sales Manager
    $manager = $config['sales_manager_number'] ?? '201094490609';
    if ($manager && !in_array($manager, $numbers, true)) {
        @sendInternalAlert($manager, "[تنبيه مدير المبيعات] $msg");
    } else if ($manager) {
        @sendInternalAlert($manager, "[تنبيه إضافي] $msg");
    }

    // Mark as notified and persist
    $customer['first_chat_notified'] = time();
    saveCustomerData($phone, $customer);

    logMessage("Sales notified for new chat", 'CONVERSION', $phone);
}



// ======== WhatsApp Integration ========
function sendWhatsAppMessage(string $to, string $message): bool {
    global $config;
    
    if (mb_strlen($message, 'UTF-8') > 1000) {
        $message = mb_substr($message, 0, 1000, 'UTF-8') . '...';
    }
    
    $payload = json_encode([
        'messaging_product' => 'whatsapp',
        'to' => $to,
        'type' => 'text',
        'text' => ['body' => $message]
    ], JSON_UNESCAPED_UNICODE);
    
    $ch = curl_init("https://graph.facebook.com/v19.0/{$config['phone_number_id']}/messages");
    curl_setopt_array($ch, [
        CURLOPT_POST => true,
        CURLOPT_HTTPHEADER => [
            'Content-Type: application/json',
            'Authorization: Bearer ' . $config['whatsapp_token'],
        ],
        CURLOPT_POSTFIELDS => $payload,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => $config['whatsapp_timeout'],
        CURLOPT_SSL_VERIFYPEER => true
    ]);
    
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    // Log API response for diagnostics
    logMessage("WhatsApp API response (text): $httpCode $response", 'API', $to);

    if (curl_errno($ch)) {
        logMessage('WhatsApp error: ' . curl_error($ch), 'ERROR', $to);
        curl_close($ch);
        return false;
    }
    
    curl_close($ch);
    return $httpCode >= 200 && $httpCode < 300;
}

// Sends a WhatsApp template message (fallback for outside 24h window)
function sendWhatsAppTemplate(string $to, string $templateName, array $components = [], string $lang = 'ar'): bool {
    global $config;
    $payload = [
        'messaging_product' => 'whatsapp',
        'to' => $to,
        'type' => 'template',
        'template' => [
            'name' => $templateName,
            'language' => ['code' => $lang],
        ]
    ];
    if (!empty($components)) {
        $payload['template']['components'] = $components;
    }
    $json = json_encode($payload, JSON_UNESCAPED_UNICODE);
    $ch = curl_init("https://graph.facebook.com/v19.0/{$config['phone_number_id']}/messages");
    curl_setopt_array($ch, [
        CURLOPT_POST => true,
        CURLOPT_HTTPHEADER => [
            'Content-Type: application/json',
            'Authorization: Bearer ' . $config['whatsapp_token'],
        ],
        CURLOPT_POSTFIELDS => $json,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => $config['whatsapp_timeout'],
        CURLOPT_SSL_VERIFYPEER => true
    ]);
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    logMessage("WhatsApp API response (template): $httpCode $response", 'API', $to);
    if (curl_errno($ch)) {
        logMessage('WhatsApp template error: ' . curl_error($ch), 'ERROR', $to);
        curl_close($ch);
        return false;
    }
    curl_close($ch);
    return $httpCode >= 200 && $httpCode < 300;
}

// Helper to send alerts to internal team with template fallback
function sendInternalAlert(string $to, string $message): bool {
    global $config;
    $ok = sendWhatsAppMessage($to, $message);
    if ($ok) return true;
    $tpl = trim((string)($config['whatsapp_alert_template'] ?? ''));
    if ($tpl === '') return false;
    $lang = (string)($config['template_language'] ?? 'ar');
    // Single body parameter with full alert text
    $components = [
        [
            'type' => 'body',
            'parameters' => [ ['type' => 'text', 'text' => $message] ]
        ]
    ];
    return sendWhatsAppTemplate($to, $tpl, $components, $lang);
}

// ======== Error Handling ========
function handleError(Throwable $e, ?string $from, ?string $userInput): void {
    $errorMsg = $e->getMessage();
    $traceId = uniqid('err_');
    
    logMessage("Error [$traceId]: $errorMsg", 'ERROR', $from);
    
    if ($from && preg_match('/^\d{10,15}$/', $from)) {
        $errorResponse = 'شكراً لاهتمامك! سيتم التواصل معك قريباً من فريق Smart Logic. للاستفسار الفوري: +201144470365 أو زوروا موقعنا smartlogiceg.com';
        sendWhatsAppMessage($from, $errorResponse);
        
        if ($userInput) {
            $meta = [
                'source' => 'error_handler',
                'trace_id' => $traceId,
            ];
            addToChatLog($from, $userInput, 'user', $meta);
            addToChatLog($from, $errorResponse, 'assistant');
        }
        
        $customer = loadCustomerData($from);
        $customer['last_error'] = [
            'message' => $errorMsg,
            'trace_id' => $traceId,
            'timestamp' => time()
        ];
        saveCustomerData($from, $customer);
    }
    
    http_response_code(500);
    echo json_encode(['error' => 'Internal error', 'trace_id' => $traceId]);
}

// ======== File Maintenance ========
function cleanupOldFiles(): void {
    $thirtyDaysAgo = time() - (30 * 86400);
    
    // تنظيف ملفات الـ rate limit
    foreach (glob('logs/rate_*.txt') as $file) {
        if (@filemtime($file) < $thirtyDaysAgo) @unlink($file);
    }
    
    // تنظيف ملفات الـ cache (بعد ساعة واحدة)
    $oneHourAgo = time() - 3600;
    foreach (glob('cache/comment_processed_*.txt') as $file) {
        if (@filemtime($file) < $oneHourAgo) @unlink($file);
    }
}



function replyToComment($commentId, $replyText, $accessToken, $platform = 'facebook') {
    if (empty($commentId) || empty($replyText) || empty($accessToken)) {
        logMessage("Reply failed: Missing parameters", 'ERROR');
        return false;
    }
    
    // جرب طرق مختلفة للرد
    $urls = [];
    
    if ($platform === 'instagram') {
        $urls[] = "https://graph.facebook.com/v19.0/{$commentId}/replies";
        $urls[] = "https://graph.facebook.com/v19.0/{$commentId}/comments";
    } else {
        $urls[] = "https://graph.facebook.com/v19.0/{$commentId}/comments";
        
        // إذا كان المعرف مُركب، جرب الجزء الثاني
        if (strpos($commentId, '_') !== false) {
            $parts = explode('_', $commentId);
            $simpleId = end($parts);
            $urls[] = "https://graph.facebook.com/v19.0/{$simpleId}/comments";
        }
    }
    
    foreach ($urls as $url) {
        $success = attemptCommentReply($url, $replyText, $accessToken);
        if ($success) {
            logMessage("Comment reply successful with URL: $url", 'INFO');
            return true;
        }
    }
    
    logMessage("All reply attempts failed for comment: $commentId", 'ERROR');
    return false;
}

function attemptCommentReply($url, $replyText, $accessToken) {
    $data = [
        'message' => $replyText,
        'access_token' => $accessToken
    ];
    
    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => http_build_query($data),
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_SSL_VERIFYPEER => true,
        CURLOPT_TIMEOUT => 15,
        CURLOPT_HTTPHEADER => [
            'Content-Type: application/x-www-form-urlencoded',
            'User-Agent: SmartLogicBot/1.0'
        ]
    ]);
    
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    
    // Log محاولة الرد
    file_put_contents('logs/comment_reply_debug.log', 
        date('Y-m-d H:i:s') . " Reply attempt\n" .
        "URL: $url\n" .
        "HTTP: $httpCode\n" .
        "Response: $response\n\n", 
        FILE_APPEND
    );
    
    curl_close($ch);
    
    return $httpCode >= 200 && $httpCode < 300;
}






function likeComment($commentId, $accessToken) {
    if (empty($commentId) || empty($accessToken)) {
        return false;
    }
    
    // محاولة عمل لايك مع طرق مختلفة
    $attempts = [
        $commentId,  // المعرف الكامل
        explode('_', $commentId)[1] ?? $commentId  // الجزء الثاني إذا كان مُركب
    ];
    
    foreach ($attempts as $id) {
        if (empty($id)) continue;
        
        $success = attemptCommentLike($id, $accessToken);
        if ($success) {
            logMessage("Comment liked successfully with ID: $id", 'INFO');
            return true;
        }
    }
    
    logMessage("All like attempts failed for comment: $commentId", 'WARNING');
    return false;
}

function attemptCommentLike($commentId, $accessToken) {
    $url = "https://graph.facebook.com/v19.0/{$commentId}/likes";
    
    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_POST => true,
        CURLOPT_HTTPHEADER => [
            'Content-Type: application/x-www-form-urlencoded',
            'User-Agent: SmartLogicBot/1.0'
        ],
        CURLOPT_POSTFIELDS => "access_token=" . urlencode($accessToken),
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_SSL_VERIFYPEER => true,
        CURLOPT_TIMEOUT => 10
    ]);
    
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    
    // Log محاولة اللايك
    file_put_contents('logs/like_attempts.log', 
        date('Y-m-d H:i:s') . " Like attempt: $commentId, HTTP: $httpCode\n" .
        "URL: $url\n" .
        "Response: $response\n\n", 
        FILE_APPEND
    );
    
    curl_close($ch);
    
    return $httpCode >= 200 && $httpCode < 300;
}









function sendInstagramDM($userId, $message, $accessToken) {
    // Instagram DMs تستخدم نفس API الـ Messenger
    $url = "https://graph.facebook.com/v19.0/me/messages";
    
    $payload = json_encode([
        'recipient' => ['id' => $userId],
        'message'   => ['text' => $message],
        'messaging_type' => 'RESPONSE' // مهم للـ Instagram
    ], JSON_UNESCAPED_UNICODE);
    
    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_POST => true,
        CURLOPT_HTTPHEADER => [
            'Content-Type: application/json',
            'Authorization: Bearer ' . $accessToken
        ],
        CURLOPT_POSTFIELDS => $payload,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => 15,
        CURLOPT_SSL_VERIFYPEER => true,
        CURLOPT_USERAGENT => 'SmartLogicBot/1.0'
    ]);
    
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    
    logMessage("Instagram DM API response: $httpCode $response", 'INFO', $userId);
    
    curl_close($ch);
    return $httpCode >= 200 && $httpCode < 300;
}




function fetchCommentText($commentId, $accessToken) {
    if (empty($commentId) || empty($accessToken)) {
        return '';
    }
    
    // جرب fields مختلفة للحصول على النص
    $fields = ['message', 'text', 'from', 'created_time'];
    $url = "https://graph.facebook.com/v19.0/$commentId?" . 
           "fields=" . implode(',', $fields) . 
           "&access_token=$accessToken";
    
    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_SSL_VERIFYPEER => true,
        CURLOPT_TIMEOUT => 10,
        CURLOPT_USERAGENT => 'SmartLogicBot/1.0'
    ]);
    
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    
    // Log الاستجابة للتشخيص
    file_put_contents('logs/fetch_comment.log', 
        date('Y-m-d H:i:s') . " Comment ID: $commentId, HTTP: $httpCode\n" .
        "Response: $response\n\n", 
        FILE_APPEND
    );
    
    curl_close($ch);
    
    // إذا فشل الـ API، ارجع نص فارغ بدلاً من خطأ
    if ($httpCode !== 200) {
        logMessage("Failed to fetch comment $commentId: HTTP $httpCode - trying to proceed without API text", 'WARNING');
        return '';
    }
    
    $json = json_decode($response, true);
    return $json['message'] ?? $json['text'] ?? '';
}




function postReplyToPost($postId, $replyText, $accessToken) {
    if (empty($postId) || empty($replyText) || empty($accessToken)) {
        return false;
    }
    
    // إذا فشل الرد على التعليق، جرب إنشاء comment جديد على الـ post
    $url = "https://graph.facebook.com/v19.0/{$postId}/comments";
    
    $data = [
        'message' => $replyText,
        'access_token' => $accessToken
    ];
    
    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => http_build_query($data),
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_SSL_VERIFYPEER => true,
        CURLOPT_TIMEOUT => 15
    ]);
    
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    
    // Log محاولة الرد على الـ post
    file_put_contents('logs/post_reply_attempts.log', 
        date('Y-m-d H:i:s') . " Attempting post reply to: $postId, HTTP: $httpCode\n" .
        "Response: $response\n\n", 
        FILE_APPEND
    );
    
    curl_close($ch);
    
    return $httpCode >= 200 && $httpCode < 300;
}



function createReplyWithMention($replyText, $userId, $platform) {
    if ($platform === 'instagram') {
        // Instagram: محاولة منشن بسيط
        return "شكرًا لتعليقك! 🙏 @" . $userId . "\n\n" . $replyText;
    } else {
        // Facebook: منشن متقدم
        return "شكرًا لتعليقك! 🙏 @[$userId]\n\n" . $replyText;
    }
}





// ===== Odoo JSON-RPC Helpers =====
function odooRpc($url, $service, $method, $args) {
    $payload = json_encode([
        'jsonrpc' => '2.0',
        'method'  => 'call',
        'params'  => [
            'service' => $service,
            'method'  => $method,
            'args'    => $args
        ],
        'id' => rand(1, 999999)
    ], JSON_UNESCAPED_UNICODE);

    $ch = curl_init(rtrim($url,'/').'/jsonrpc');
    curl_setopt_array($ch, [
        CURLOPT_POST => true,
        CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
        CURLOPT_POSTFIELDS => $payload,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => 15,
        CURLOPT_SSL_VERIFYPEER => true
    ]);
    $resp = curl_exec($ch);
    $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    if ($code !== 200 || !$resp) throw new Exception("Odoo RPC HTTP $code");
    $json = json_decode($resp, true);
    if (isset($json['error'])) throw new Exception("Odoo RPC Error: ".json_encode($json['error'], JSON_UNESCAPED_UNICODE));
    return $json['result'];
}

function odooAuthUid($odoo) {
    return odooRpc($odoo['url'], 'common', 'authenticate', [
        $odoo['db'], $odoo['user'], $odoo['pass'], []
    ]);
}

function odooSearchRead($odoo, $uid, $model, $domain, $fields=['id'], $limit=1) {
    return odooRpc($odoo['url'], 'object', 'execute_kw', [
        $odoo['db'], $uid, $odoo['pass'], $model, 'search_read',
        [$domain], ['fields'=>$fields, 'limit'=>$limit]
    ]);
}

function odooCreate($odoo, $uid, $model, $vals) {
    return odooRpc($odoo['url'], 'object', 'execute_kw', [
        $odoo['db'], $uid, $odoo['pass'], $model, 'create', [$vals]
    ]);
}

function odooWrite($odoo, $uid, $model, $ids, $vals) {
    return odooRpc($odoo['url'], 'object', 'execute_kw', [
        $odoo['db'], $uid, $odoo['pass'], $model, 'write', [$ids, $vals]
    ]);
}

function odooMessagePost($odoo, $uid, $model, $res_id, $body) {
    return odooRpc($odoo['url'], 'object', 'execute_kw', [
        $odoo['db'], $uid, $odoo['pass'], $model, 'message_post',
        [$res_id], ['body'=>$body, 'message_type'=>'comment', 'subtype_xmlid'=>'mail.mt_note']
    ]);
}

// اجلب/أنشئ utm.source بالاسم
function odooGetOrCreateSourceId($odoo, $uid, $sourceName) {
    $src = odooSearchRead($odoo, $uid, 'utm.source', [['name','=', $sourceName]], ['id','name'], 1);
    if (!empty($src)) return $src[0]['id'];
    return odooCreate($odoo, $uid, 'utm.source', ['name'=>$sourceName]);
}

// ابحث عن Lead موجود (بالهاتف خلال آخر 30 يوم) لتقليل الدوبلكيت
function odooFindRecentLeadByPhone($odoo, $uid, $phone) {
    if (!$phone) return null;
    $thirtyDaysAgo = date('Y-m-d H:i:s', time()-30*86400);
    $leads = odooSearchRead(
        $odoo, $uid, 'crm.lead',
        [['type','=','lead'], ['phone','ilike',$phone], ['create_date','>=',$thirtyDaysAgo]],
        ['id','name','phone','email_from'], 1
    );
    return $leads[0]['id'] ?? null;
}

// الدالة الرئيسية: أنشئ/حدّث Lead وسجّل رسالة
function odooUpsertLeadFromChat($odoo, $params) {
    // $params: ['name','message','phone','email','platform','source_name','extra']
    $uid = odooAuthUid($odoo);
    if (!$uid) throw new Exception('Odoo auth failed');

    $sourceName = $params['source_name'] ?: 'WhatsApp Chatbot';
    $source_id  = odooGetOrCreateSourceId($odoo, $uid, $sourceName);

    // امنع تكرار Leads قريبة
    $leadId = odooFindRecentLeadByPhone($odoo, $uid, $params['phone']);

    $leadVals = [
        'type'        => 'lead',
        'name'        => $params['name'] ?: 'WhatsApp Inquiry',
        'contact_name'=> $params['name'] ?: null,
        'phone'       => $params['phone'] ?: null,
        'email_from'  => $params['email'] ?: null,
        'description' => $params['message'] ?: '',
        'source_id'   => $source_id,                 // utm.source
        'referred'    => strtoupper($params['platform'] ?? 'whatsapp'),
        // اختياري: team_id / user_id لو عايز توزّع Leads
        // 'team_id'  => 1,
        // 'user_id'  => 2,
    ];

    if ($leadId) {
        odooWrite($odoo, $uid, 'crm.lead', [$leadId], $leadVals);
    } else {
        $leadId = odooCreate($odoo, $uid, 'crm.lead', $leadVals);
    }

    // رسائل سجل المحادثة في الـ chatter
    $note  = "<p><b>رسالة جديدة من البوت ("
          . htmlspecialchars($params['platform'] ?? 'whatsapp', ENT_QUOTES, 'UTF-8')
          . ")</b></p>";
    $note .= "<p><b>رقم:</b> ".htmlspecialchars($params['phone'] ?? '', ENT_QUOTES,'UTF-8')."</p>";
    if (!empty($params['extra'])) {
        $meta = htmlspecialchars(json_encode($params['extra'], JSON_UNESCAPED_UNICODE), ENT_QUOTES, 'UTF-8');
        $note .= "<p><b>Meta:</b> <code>{$meta}</code></p>";
    }
    $msg = htmlspecialchars($params['message'] ?? '', ENT_QUOTES, 'UTF-8');
    $note .= "<p><b>نص الرسالة:</b><br/>".$msg."</p>";

    odooMessagePost($odoo, $uid, 'crm.lead', $leadId, $note);

    return $leadId;
}


if (mt_rand(1, 100) === 1) cleanupOldFiles();
