<?php
/**
 * Webhook Proxy — wifi2fm.com ► سيرفرنا ► البوت الأصلي
 */

require_once __DIR__ . '/../includes/config.php';
require_once __DIR__ . '/../includes/functions.php';

if ($_SERVER['REQUEST_METHOD'] === 'GET') {
    http_response_code(200);
    echo json_encode(['status' => 'ok', 'mode' => 'webhook_proxy']);
    exit;
}

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405);
    exit;
}

$rawBody = file_get_contents('php://input');

// 1. تمرير فوري للبوت الأصلي
forwardToOriginalWebhook($rawBody);

// 2. حفظ debug
ensureStorageDirs();
file_put_contents(
    STORAGE_PATH . 'webhook_debug.log',
    json_encode(['time' => date('Y-m-d H:i:s'), 'body' => $rawBody], JSON_UNESCAPED_UNICODE) . "\n",
    FILE_APPEND | LOCK_EX
);

$payload = json_decode($rawBody, true);
if (!$payload) {
    http_response_code(200);
    echo json_encode(['status' => 'ok', 'proxied' => true]);
    exit;
}

// 3. استخراج الرسائل
$stored = false;

// wifi2fm بنية مختلفة حسب نوع الحدث:
// messages.update:  payload.data.data = [ {key, update} ]
// messages.upsert:  payload.data.data = { messages: [{key, message}], type: "append" }
$outerData = $payload['data'] ?? $payload;
$event     = $outerData['event'] ?? $payload['event'] ?? $payload['type'] ?? 'unknown';
$innerData = $outerData['data'] ?? null;

// ██ الإصلاح الحاسم: messages.upsert يأتي بصيغة {messages:[...]} وليس [...] ██
$items = [];

if (is_array($innerData)) {
    // حالة 1: innerData فيه مفتاح "messages" (messages.upsert)
    if (isset($innerData['messages']) && is_array($innerData['messages'])) {
        $items = $innerData['messages'];
    }
    // حالة 2: innerData مصفوفة مرقمة (messages.update)
    elseif (isset($innerData[0])) {
        $items = $innerData;
    }
    // حالة 3: innerData associative بدون messages (عنصر واحد)
    elseif (isset($innerData['key'])) {
        $items = [$innerData];
    }
}

// fallback: لو ما لقينا شي، نجرب المستوى الأعلى
if (empty($items) && isset($outerData['key'])) {
    $items = [$outerData];
}
if (empty($items) && isset($payload['key'])) {
    $items = [$payload];
}

logEvent('webhook_parsing', [
    'event'       => $event,
    'items_count' => count($items),
    'innerData_keys' => is_array($innerData) ? array_keys($innerData) : 'null',
]);

foreach ($items as $item) {
    if (!is_array($item)) continue;
    
    $key       = $item['key'] ?? [];
    $fromMe    = $key['fromMe'] ?? null;
    $remoteJid = $key['remoteJid'] ?? '';
    
    // ██ استخراج الرقم — إصلاح مشكلة :13 ██
    // remoteJid: "970597150889:13@s.whatsapp.net" → نأخذ "970597150889"
    // الخطوة 1: إزالة @s.whatsapp.net
    $phonePart = preg_replace('/@.*$/', '', $remoteJid);
    // الخطوة 2: إزالة :XX (device suffix)
    if (strpos($phonePart, ':') !== false) {
        $phonePart = explode(':', $phonePart)[0];
    }
    // الخطوة 3: أرقام فقط
    $from = preg_replace('/[^0-9]/', '', $phonePart);
    
    // fallback
    if (empty($from)) {
        $rawFrom = $item['from'] ?? $item['phone'] ?? $item['chatId'] ?? $item['sender'] ?? '';
        $rawFrom = preg_replace('/@.*$/', '', $rawFrom);
        if (strpos($rawFrom, ':') !== false) {
            $rawFrom = explode(':', $rawFrom)[0];
        }
        $from = preg_replace('/[^0-9]/', '', $rawFrom);
    }
    
    if (empty($from)) continue;
    
    // ── استخراج نص الرسالة ──
    $message = $item['message'] ?? $item['msg'] ?? null;
    $body = '';
    $type = 'text';
    
    if (is_array($message) && !empty($message)) {
        // ██ إصلاح extractText — نفحص كل حقل على حدة ██
        if (isset($message['conversation']) && $message['conversation'] !== '') {
            $body = $message['conversation'];
        } elseif (isset($message['extendedTextMessage']['text'])) {
            $body = $message['extendedTextMessage']['text'];
        } elseif (isset($message['buttonsResponseMessage']['selectedDisplayText'])) {
            $body = $message['buttonsResponseMessage']['selectedDisplayText'];
        } elseif (isset($message['listResponseMessage']['title'])) {
            $body = $message['listResponseMessage']['title'];
        } elseif (isset($message['listResponseMessage']['singleSelectReply']['selectedRowId'])) {
            $body = $message['listResponseMessage']['singleSelectReply']['selectedRowId'];
        } elseif (isset($message['templateButtonReplyMessage']['selectedDisplayText'])) {
            $body = $message['templateButtonReplyMessage']['selectedDisplayText'];
        } elseif (isset($message['imageMessage'])) {
            $body = '[صورة' . (isset($message['imageMessage']['caption']) ? ': '.$message['imageMessage']['caption'] : '') . ']';
            $type = 'image';
        } elseif (isset($message['videoMessage'])) {
            $body = '[فيديو]';
            $type = 'video';
        } elseif (isset($message['audioMessage'])) {
            $body = '[صوتية]';
            $type = 'audio';
        } elseif (isset($message['documentMessage'])) {
            $body = '[مستند: '.($message['documentMessage']['fileName'] ?? 'ملف').']';
            $type = 'document';
        } elseif (isset($message['stickerMessage'])) {
            $body = '[ملصق]';
            $type = 'sticker';
        } elseif (isset($message['locationMessage'])) {
            $body = '[موقع]';
            $type = 'location';
        } elseif (isset($message['contactMessage'])) {
            $body = '[جهة اتصال]';
            $type = 'contact';
        } else {
            // محاولة أخيرة — أي حقل text/body
            foreach (['text', 'body', 'caption', 'selectedDisplayText', 'title'] as $field) {
                if (isset($message[$field]) && is_string($message[$field]) && $message[$field] !== '') {
                    $body = $message[$field];
                    break;
                }
            }
            // إذا ما لقينا شي، نسجل كل الحقول للتحليل
            if (empty($body)) {
                logEvent('webhook_unknown_message_format', [
                    'from'    => $from,
                    'fromMe'  => $fromMe,
                    'event'   => $event,
                    'msg_keys' => array_keys($message),
                ]);
            }
        }
    } elseif (is_string($message) && $message !== '') {
        $body = $message;
    }
    
    // fallback مباشر
    if (empty($body)) {
        $body = $item['body'] ?? $item['text'] ?? '';
        if (is_array($body)) {
            $body = $body['text'] ?? $body['body'] ?? '';
        }
    }
    
    // إذا ما فيه نص → status update
    if (empty($body)) {
        if (isset($item['update']['status'])) {
            logEvent('webhook_status_only', [
                'from' => $from, 'status' => $item['update']['status'],
            ]);
        }
        continue;
    }
    
    // ── تحديد الاتجاه ──
    if ($fromMe === true) {
        $direction = 'incoming'; // رد البوت
    } elseif ($fromMe === false) {
        $direction = 'outgoing'; // من المستخدم
    } else {
        $direction = 'incoming'; // افتراضي
    }
    
    // ── منع التكرار ──
    $shouldStore = true;
    if ($direction === 'outgoing') {
        $recentMessages = loadMessages($from);
        $cutoff = time() - 60;
        foreach (array_reverse($recentMessages) as $existing) {
            if ($existing['timestamp'] < $cutoff) break;
            if (
                $existing['direction'] === 'outgoing' &&
                isset($existing['source']) && $existing['source'] === 'web' &&
                trim($existing['body']) === trim($body)
            ) {
                $shouldStore = false;
                break;
            }
        }
    }
    
    if ($shouldStore) {
        $msg = createMessage($direction, $body, $from, $type);
        saveMessage($from, $msg);
        $stored = true;
        
        logEvent('webhook_STORED', [
            'from'      => $from,
            'direction' => $direction,
            'fromMe'    => $fromMe,
            'event'     => $event,
            'body'      => mb_substr($body, 0, 100),
            'type'      => $type,
        ]);
    }
}

if (!$stored) {
    logEvent('webhook_NOT_stored', [
        'event'      => $event,
        'keys'       => array_keys($payload),
        'data_keys'  => isset($payload['data']) ? (is_array($payload['data']) ? array_keys($payload['data']) : 'scalar') : 'none',
        'inner_count' => count($innerData),
    ]);
}

http_response_code(200);
echo json_encode(['status' => 'ok', 'proxied' => true, 'stored' => $stored, 'event' => $event]);
