<?php
/**
 * استيراد الشات من الواتس اب من الموباي بالكيو ار كود 
 * WhatsApp to Smart Logic Chatbot Importer
 * يستخرج المحادثات من ملف JSON ويحولها لتنسيق الشات بوت
 */

// إعدادات عامة
ini_set('max_execution_time', '300');
ini_set('memory_limit', '1024M');
date_default_timezone_set('Africa/Cairo');

const REQUIRED_DIRECTORIES = ['customers', 'chats', 'logs', 'temp', 'imports'];
const LOG_FILE = 'logs/whatsapp_import.log';
const ALLOWED_EXTENSIONS = ['json', 'txt'];
const MAX_FILE_SIZE_MB = 25;

ensureDirectories(REQUIRED_DIRECTORIES);

// معالجة رفع الملف
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['whatsapp_json'])) {
    $response = handleUpload($_FILES['whatsapp_json']);
}

/**
 * @param string $path
 * @return array<int,array<string,mixed>>
 */
function parseWhatsAppJson(string $path): array {
    $jsonContent = file_get_contents($path);
    if ($jsonContent === false || trim($jsonContent) === '') {
        throw new RuntimeException('تعذر قراءة محتوى ملف JSON أو الملف فارغ.');
    }

    $decoded = json_decode($jsonContent, true);
    if (json_last_error() !== JSON_ERROR_NONE || !is_array($decoded)) {
        throw new RuntimeException('ملف JSON غير صالح أو يحتوي على بنية غير متوقعة.');
    }

    return $decoded;
}

/**
 * يحول ملف WhatsApp TXT (Export chat) إلى صيغة JSON يفهمها المستورد.
 *
 * @param string $path
 * @param string $originalName
 * @return array<int,array<string,mixed>>
 */
function parseWhatsAppTxtFile(string $path, string $originalName): array {
    $contents = file_get_contents($path);
    if ($contents === false || trim($contents) === '') {
        throw new RuntimeException('تعذر قراءة ملف TXT أو الملف فارغ.');
    }

    $encoding = mb_detect_encoding($contents, ['UTF-8', 'UTF-16LE', 'UTF-16BE', 'Windows-1256', 'ISO-8859-6'], true) ?: 'UTF-8';
    if ($encoding !== 'UTF-8') {
        $contents = mb_convert_encoding($contents, 'UTF-8', $encoding);
    }

    $lines = preg_split('/\r\n|\r|\n/', $contents);
    if (!$lines) {
        throw new RuntimeException('صيغة ملف TXT غير معروفة.');
    }

    $messages = [];
    $currentMessage = null;

    $pattern = '/^(\d{1,2}\/\d{1,2}\/\d{2,4}),\s*(\d{1,2}:\d{2}(?:\s*[AP]M)?)\s*-\s*(.*?):\s*(.*)$/u';
    foreach ($lines as $line) {
        $line = trim($line);
        if ($line === '') {
            continue;
        }

        if (preg_match($pattern, $line, $matches)) {
            // حفظ الرسالة السابقة
            if ($currentMessage !== null) {
                $messages[] = $currentMessage;
            }

            [, $date, $time, $sender, $messageText] = $matches;
            $timestamp = parseWhatsAppTimestamp($date, $time);

            $currentMessage = [
                'id'        => 'txt_' . md5($timestamp . $sender . $messageText),
                'content'   => $messageText,
                'timestamp' => $timestamp,
                'role'      => guessRoleFromSender($sender),
                'sender'    => $sender,
            ];
        } else {
            // السطر تابع للرسالة السابقة (رسالة متعددة الأسطر)
            if ($currentMessage !== null) {
                $currentMessage['content'] .= "\n" . $line;
            }
        }
    }

    if ($currentMessage !== null) {
        $messages[] = $currentMessage;
    }

    $phone = sanitizePhone(pathinfo($originalName, PATHINFO_FILENAME));
    if (strpos($phone, 'imported_') === 0 || $phone === '') {
        $phone = 'txt_' . time();
    }

    return [
        [
            'phone'    => $phone,
            'name'     => $messages[0]['sender'] ?? $phone,
            'messages' => $messages,
        ],
    ];
}

/**
 * يحوّل التاريخ والوقت من WhatsApp TXT إلى طابع زمني.
 */
function parseWhatsAppTimestamp(string $date, string $time): int {
    // يدعم صيغ مثل 12/8/2024, 10:15 PM
    $dateTimeStr = $date . ' ' . $time;
    $formats = [
        'd/m/Y h:i A',
        'd/m/Y H:i',
        'd/m/y h:i A',
        'd/m/y H:i',
    ];
    foreach ($formats as $format) {
        $dt = DateTime::createFromFormat($format, $dateTimeStr);
        if ($dt instanceof DateTime) {
            return $dt->getTimestamp();
        }
    }
    // fallback
    return time();
}

function guessRoleFromSender(string $sender): string {
    $normalized = mb_strtolower($sender, 'UTF-8');
    if ($normalized === 'you' || $normalized === 'أنا' || $normalized === 'me') {
        return 'assistant';
    }
    if (preg_match('/(me|أنا|myself|you|أنا)/u', $normalized)) {
        return 'assistant';
    }
    return 'user';
}

/**
 * @param array<string,mixed> $upload
 * @return array<string,mixed>
 */
function handleUpload(array $upload): array {
    try {
        if (!isset($upload['error']) || !isset($upload['tmp_name'])) {
            throw new RuntimeException('بيانات الملف المرفوع غير مكتملة.');
        }

        if ($upload['error'] !== UPLOAD_ERR_OK) {
            throw new RuntimeException('حدث خطأ أثناء رفع الملف (رمز الخطأ: ' . $upload['error'] . ').');
        }

        if (!is_uploaded_file($upload['tmp_name'])) {
            throw new RuntimeException('الملف المرفوع غير صالح أو تم التلاعب به.');
        }

        $extension = strtolower(pathinfo($upload['name'] ?? '', PATHINFO_EXTENSION));
        if (!in_array($extension, ALLOWED_EXTENSIONS, true)) {
            throw new RuntimeException('يُسمح فقط بملفات JSON أو TXT المصدَّرة من واتساب.');
        }
        $sizeMB = ($upload['size'] ?? 0) / 1048576;
        if ($sizeMB > MAX_FILE_SIZE_MB) {
            throw new RuntimeException('يتجاوز الملف الحجم المسموح به (' . MAX_FILE_SIZE_MB . 'MB).');
        }

        if ($extension === 'json') {
            $whatsappData = parseWhatsAppJson($upload['tmp_name']);
        } else {
            $whatsappData = parseWhatsAppTxtFile($upload['tmp_name'], $upload['name'] ?? '');
        }

        logImportOperation('بدء الاستيراد - عدد المحادثات: ' . count($whatsappData));
        $importResults = importWhatsAppToChatbot($whatsappData);
        logImportOperation(sprintf(
            'انتهاء الاستيراد بنجاح - عملاء: %d، رسائل: %d، أخطاء طفيفة: %d',
            $importResults['customers'],
            $importResults['messages'],
            count($importResults['errors'])
        ));
        return [
            'success'            => true,
            'imported_customers' => $importResults['customers'],
            'imported_messages'  => $importResults['messages'],
            'total_chats'        => $importResults['total_chats'],
            'errors'             => $importResults['errors'],
        ];
    } catch (Throwable $e) {
        logImportOperation('خطأ أثناء الاستيراد: ' . $e->getMessage());
        return ['success' => false, 'error' => $e->getMessage()];
    }
}

/**
 * @param array<int,array<string,mixed>> $whatsappChats
 * @return array{customers:int,messages:int,total_chats:int,errors:array<int,string>}
 */
function importWhatsAppToChatbot(array $whatsappChats): array {
    $importedCustomers = 0;
    $importedMessages = 0;
    $errors = [];
    
    foreach ($whatsappChats as $index => $chat) {
        if (!is_array($chat)) {
            $errors[] = "تم تجاهل سجل المحادثة رقم {$index} بسبب تنسيق غير معروف.";
            continue;
        }

        $phoneRaw = $chat['phone'] ?? '';
        $messagesRaw = $chat['messages'] ?? [];

        $phone = sanitizePhone(is_string($phoneRaw) ? $phoneRaw : '');
        $name = trim(is_string($chat['name'] ?? '') ? $chat['name'] : '');
        $messages = is_array($messagesRaw) ? $messagesRaw : [];
        
        if (empty($phone) || empty($messages)) {
            $errors[] = "تم تجاوز محادثة بلا رقم هاتف أو رسائل (السجل {$index}).";
            continue;
        }
        
        // إنشاء بيانات العميل
        $customerData = createCustomerFromWhatsApp($phone, $name, $messages);
        saveCustomerData($phone, $customerData);
        $importedCustomers++;
        
        // تحويل المحادثات لتنسيق الشات بوت
        $chatbotConversation = convertToChatbotFormat($messages, $phone);
        saveChatbotConversation($phone, $chatbotConversation);
        $importedMessages += count($chatbotConversation);
        
        logImportOperation("استيراد محادثة: $name ($phone) - " . count($messages) . " رسالة");
        if ($index % 10 === 0) {
            gc_collect_cycles();
        }
    }
    
    return [
        'customers' => $importedCustomers,
        'messages' => $importedMessages,
        'total_chats' => count($whatsappChats),
        'errors' => $errors,
    ];
}

function createCustomerFromWhatsApp(string $phone, string $name, array $messages): array {
    // تحليل المحادثات لاستخراج معلومات العميل
    $interests = [];
    $businessType = '';
    $leadScore = 0;
    
    $allText = '';
    foreach ($messages as $msg) {
        $allText .= ' ' . ($msg['content'] ?? '');
    }
    $allText = mb_strtolower($allText, 'UTF-8');
    
    // كشف نوع النشاط التجاري
    $businessPatterns = [
        '/مطعم|كافيه|طعام|restaurant|cafe|food/' => 'مطاعم وكافيهات',
        '/عيادة|طبيب|صيدلية|medical|clinic/' => 'طبي وصحي',
        '/متجر|تجارة|بيع|شراء|store|shop/' => 'تجارة إلكترونية',
        '/تعليم|مدرسة|دورات|education/' => 'تعليمي',
        '/عقارات|شقق|فيلا|real estate/' => 'عقاري',
        '/تصميم|جرافيك|design/' => 'تصميم وإعلان'
    ];
    
    foreach ($businessPatterns as $pattern => $type) {
        if (preg_match($pattern . 'u', $allText)) {
            $businessType = $type;
            $leadScore += 5;
            break;
        }
    }
    
    // كشف الاهتمامات
    $interestPatterns = [
        '/موقع|website|site/' => 'تطوير مواقع',
        '/متجر|store|shop|ecommerce/' => 'متاجر إلكترونية',
        '/تطبيق|app|mobile/' => 'تطبيقات موبايل',
        '/بوت|bot|chatbot/' => 'بوت ذكي',
        '/تسويق|marketing|ads/' => 'تسويق رقمي',
        '/نظام|system|erp/' => 'أنظمة إدارة'
    ];
    
    foreach ($interestPatterns as $pattern => $interest) {
        if (preg_match($pattern . 'u', $allText)) {
            $interests[] = $interest;
            $leadScore += 3;
        }
    }
    
    // تحديد حالة التأهيل
    $qualificationStatus = 'imported';
    if (preg_match('/مهتم|interested|أريد|want|محتاج|need/u', $allText)) {
        $qualificationStatus = 'qualified';
        $leadScore += 10;
    }
    
    return [
        'phone' => $phone,
        'name' => $name ?: 'عميل WhatsApp',
        'business_type' => $businessType,
        'interests' => array_unique($interests),
        'conversation_count' => count($messages),
        'notes' => [
            [
                'msg' => 'مستورد من WhatsApp - ' . count($messages) . ' رسالة',
                'ts' => time()
            ]
        ],
        'qualification_status' => $qualificationStatus,
        'lead_score' => min($leadScore, 100),
        'created_at' => time(),
        'last_contact' => time(),
        'conversion_signals' => [],
        'source' => 'whatsapp_import'
    ];
}

function convertToChatbotFormat(array $messages, string $phone): array {
    $chatbotConversation = [];
    
    foreach ($messages as $msg) {
        if (!is_array($msg)) {
            continue;
        }
        $content = trim((string)($msg['content'] ?? ''));
        $role = strtolower((string)($msg['role'] ?? 'user')) === 'assistant' ? 'assistant' : 'user';
        $timestamp = $msg['timestamp'] ?? time();
        
        // تنظيف المحتوى
        if (empty($content) || $content === '[رسالة فارغة]') {
            continue;
        }
        
        // تحويل لتنسيق الشات بوت
        $chatbotMessage = [
            'role' => $role,
            'content' => $content,
            'timestamp' => $timestamp,
            'meta' => [
                'type' => 'imported_from_whatsapp',
                'original_id' => $msg['id'] ?? '',
                'import_date' => time()
            ]
        ];
        
        $chatbotConversation[] = $chatbotMessage;
    }
    
    // ترتيب حسب الوقت
    usort($chatbotConversation, fn($a, $b) => ($a['timestamp'] ?? 0) <=> ($b['timestamp'] ?? 0));
    
    return $chatbotConversation;
}

function saveCustomerData(string $phone, array $customerData): void {
    $file = "customers/" . basename($phone) . ".json";
    
    if (file_exists($file)) {
        $existing = json_decode(file_get_contents($file), true);
        if (is_array($existing)) {
            $customerData = array_merge($existing, $customerData);
            $customerData['conversation_count'] = ($existing['conversation_count'] ?? 0) + ($customerData['conversation_count'] ?? 0);
            $customerData['interests'] = array_values(array_unique(array_merge(
                $existing['interests'] ?? [],
                $customerData['interests'] ?? []
            )));
            if (!empty($existing['last_contact']) && ($customerData['last_contact'] ?? 0) < $existing['last_contact']) {
                $customerData['last_contact'] = $existing['last_contact'];
            }
            if (!empty($existing['lead_score'])) {
                $customerData['lead_score'] = max($existing['lead_score'], $customerData['lead_score'] ?? 0);
            }
        }
    }

    file_put_contents($file, json_encode($customerData, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT), LOCK_EX);
}

function saveChatbotConversation(string $phone, array $conversation): void {
    $file = "chats/" . basename($phone) . ".json";
    $merged = [];

    if (file_exists($file)) {
        $existing = json_decode(file_get_contents($file), true);
        if (is_array($existing)) {
            $merged = $existing;
        }
    }

    $merged = array_merge($merged, $conversation);

    // إزالة التكرار بالاعتماد على original_id + timestamp + content
    $unique = [];
    $deduplicated = [];
    foreach ($merged as $item) {
        if (!is_array($item)) {
            continue;
        }
        $keyParts = [
            $item['meta']['original_id'] ?? '',
            $item['timestamp'] ?? '',
            $item['content'] ?? '',
        ];
        $hash = md5(implode('|', $keyParts));
        if (!isset($unique[$hash])) {
            $unique[$hash] = true;
            $deduplicated[] = $item;
        }
    }

    usort($deduplicated, fn($a, $b) => ($a['timestamp'] ?? 0) <=> ($b['timestamp'] ?? 0));

    file_put_contents($file, json_encode($deduplicated, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT), LOCK_EX);
}

function sanitizePhone(string $phone): string {
    $clean = preg_replace('/[^\d+]/', '', $phone);
    return $clean ?: 'imported_' . time() . '_' . rand(1000, 9999);
}

function logImportOperation(string $message): void {
    $timestamp = date('Y-m-d H:i:s');
    file_put_contents(LOG_FILE, "[$timestamp] $message\n", FILE_APPEND | LOCK_EX);
}

/**
 * @param array<int,string> $directories
 */
function ensureDirectories(array $directories): void {
    foreach ($directories as $dir) {
        if (!is_dir($dir) && !@mkdir($dir, 0755, true) && !is_dir($dir)) {
            logImportOperation("تعذر إنشاء المجلد: {$dir}");
        }
    }
}

?>
<!DOCTYPE html>
<html lang="ar" dir="rtl">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>مستورد محادثات WhatsApp للشات بوت</title>
    <style>
        * { margin: 0; padding: 0; box-sizing: border-box; }
        body { font-family: 'Segoe UI', Tahoma, sans-serif; background: #f5f5f5; padding: 20px; }
        .container { max-width: 800px; margin: 0 auto; background: white; padding: 30px; border-radius: 10px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
        h1 { color: #25d366; margin-bottom: 20px; text-align: center; }
        .step { background: #f8f9fa; padding: 20px; margin: 15px 0; border-radius: 8px; border-right: 4px solid #007bff; }
        .step h3 { color: #007bff; margin-bottom: 10px; }
        .upload-area { border: 2px dashed #25d366; padding: 40px; text-align: center; border-radius: 10px; margin: 20px 0; }
        .btn { background: #25d366; color: white; padding: 12px 24px; border: none; border-radius: 6px; cursor: pointer; font-size: 16px; }
        .btn:hover { background: #1ea952; }
        .result { padding: 20px; margin: 20px 0; border-radius: 8px; }
        .result.success { background: #d4edda; color: #155724; border: 1px solid #c3e6cb; }
        .result.error { background: #f8d7da; color: #721c24; border: 1px solid #f5c6cb; }
        .stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px; margin: 20px 0; }
        .stat { background: #f8f9fa; padding: 20px; text-align: center; border-radius: 8px; }
        .stat-number { font-size: 2em; font-weight: bold; color: #25d366; }
        .code-block { background: #f8f9fa; padding: 15px; border-radius: 8px; font-family: monospace; margin: 10px 0; border: 1px solid #e9ecef; }
    </style>
</head>
<body>
    <div class="container">
        <h1>🚀 مستورد محادثات WhatsApp للشات بوت</h1>
        
        <div class="step">
            <h3>الخطوة 1: استخراج المحادثات من WhatsApp</h3>
            <p>1. افتح <a href="https://web.whatsapp.com" target="_blank">WhatsApp Web</a></p>
            <p>2. افتح أدوات المطوّر (F12 → Console)</p>
            <p>3. الصق الكود التالي:</p>
            <div class="code-block">
(() => {
  if (!document.getElementById('quickExtractBtn')) {
    let btn = document.createElement('button');
    btn.id = 'quickExtractBtn';
    btn.innerText = '📱 استخراج كل المحادثات للشات بوت';
    btn.style = 'position:fixed;top:20px;right:20px;z-index:9999;padding:15px;background:#25d366;color:white;border:none;border-radius:8px;cursor:pointer;font-weight:bold;';
    btn.onclick = async () => {
      btn.innerText = '⏳ جاري الاستخراج...';
      btn.disabled = true;
      
      // تحميل المحادثات
      let chatList = document.querySelector('[data-testid="chat-list"]');
      let prev = 0, loops = 0;
      while (loops < 30) {
        chatList.scrollTop = chatList.scrollHeight;
        await new Promise(r => setTimeout(r, 1000));
        if (chatList.scrollHeight === prev) break;
        prev = chatList.scrollHeight; loops++;
      }
      
      const chatEls = Array.from(chatList.querySelectorAll('[data-testid^="cell-frame-"]'));
      const result = [];
      
      for (let i = 0; i < chatEls.length; i++) {
        chatEls[i].click();
        await new Promise(r => setTimeout(r, 1500));
        
        const name = document.querySelector('[data-testid="conversation-title"]')?.textContent?.trim() || 'unknown';
        let phone = name.match(/[\d\+\(\)\-\s]+/g)?.[0]?.replace(/[^\d+]/g,'') || `contact_${Date.now()}_${i}`;
        
        const msgsParent = document.querySelector('[data-testid="conversation-panel-messages"]');
        let lastCount = 0;
        for (let t = 0; t < 20; t++) {
          msgsParent.scrollTop = 0;
          await new Promise(r => setTimeout(r, 500));
          const tot = msgsParent.querySelectorAll('[data-testid^="msg-container-"]').length;
          if (tot === lastCount) break;
          lastCount = tot;
        }
        
        const msgs = [];
        for (const msg of msgsParent.querySelectorAll('[data-testid^="msg-container-"]')) {
          let txt = msg.querySelector('.selectable-text span')?.textContent?.trim() || msg.textContent?.trim() || '';
          if (txt && txt !== '') {
            const isOut = !!msg.closest('[class*="message-out"]');
            msgs.push({
              id: `msg_${Date.now()}_${msgs.length}`,
              content: txt,
              timestamp: Date.now(),
              role: isOut ? 'assistant' : 'user'
            });
          }
        }
        
        if (msgs.length > 0) {
          result.push({phone, name, messages: msgs});
        }
        
        btn.innerText = `📦 ${i + 1}/${chatEls.length} - ${name}`;
        await new Promise(r => setTimeout(r, 300));
      }
      
      const blob = new Blob([JSON.stringify(result, null, 2)], {type: 'application/json'});
      const url = URL.createObjectURL(blob);
      const a = document.createElement('a');
      a.href = url;
      a.download = 'whatsapp_for_chatbot.json';
      a.click();
      
      btn.innerText = '✅ تم التحميل - ارفع الملف للشات بوت';
      btn.disabled = false;
    };
    document.body.appendChild(btn);
  }
})();
            </div>
            <p>4. اضغط الزر الأزرق وانتظر انتهاء التحميل</p>
        </div>

        <div class="step">
            <h3>الخطوة 2: رفع الملف للشات بوت</h3>
            <form method="post" enctype="multipart/form-data" class="upload-area">
                <p>اختر ملف JSON المحمل من WhatsApp:</p><br>
                <input type="file" name="whatsapp_json" accept=".json" required>
                <br><br>
                <button type="submit" class="btn">🚀 استيراد للشات بوت</button>
            </form>
        </div>

        <?php if (isset($response)): ?>
            <div class="result <?= $response['success'] ? 'success' : 'error' ?>">
                <?php if ($response['success']): ?>
                    <h3>✅ تم الاستيراد بنجاح!</h3>
                    <div class="stats">
                        <div class="stat">
                            <div class="stat-number"><?= $response['imported_customers'] ?></div>
                            <div>عميل مستورد</div>
                        </div>
                        <div class="stat">
                            <div class="stat-number"><?= $response['imported_messages'] ?></div>
                            <div>رسالة مستوردة</div>
                        </div>
                        <div class="stat">
                            <div class="stat-number"><?= $response['total_chats'] ?></div>
                            <div>محادثة معالجة</div>
                        </div>
                    </div>
                    <p>تم حفظ بيانات العملاء في مجلد <code>customers/</code> والمحادثات في مجلد <code>chats/</code></p>
                    <?php if (!empty($response['errors'])): ?>
                        <div class="code-block" style="margin-top:20px;">
                            <strong>ملاحظات:</strong>
                            <ul style="margin-top:10px; padding-right:18px; line-height:1.6;">
                                <?php foreach ($response['errors'] as $warning): ?>
                                    <li><?= htmlspecialchars($warning, ENT_QUOTES, 'UTF-8') ?></li>
                                <?php endforeach; ?>
                            </ul>
                        </div>
                    <?php endif; ?>
                <?php else: ?>
                    <h3>❌ خطأ في الاستيراد</h3>
                    <p><?= htmlspecialchars($response['error']) ?></p>
                <?php endif; ?>
            </div>
        <?php endif; ?>

        <div class="step">
            <h3>الخطوة 3: تحقق من النتائج</h3>
            <p>بعد الاستيراد، ستجد:</p>
            <ul>
                <li><strong>مجلد customers/:</strong> ملفات JSON لكل عميل بكامل بياناته</li>
                <li><strong>مجلد chats/:</strong> محادثات مرتبة حسب الوقت</li>
                <li><strong>مجلد logs/:</strong> سجل العمليات</li>
            </ul>
            <p>الآن العملاء الجدد سيكون لديهم تاريخ محادثات من WhatsApp ويمكن للشات بوت الاستكمال معهم بذكاء!</p>
        </div>
    </div>
</body>
</html>
