<?php
/**
 * Enhanced Duplicate Contacts Removal System
 * نظام تصفية التكرار التلقائي لجهات الاتصال
 * 
 * @version 2.0
 * @author Enhanced Development Team
 */

session_start();
require 'config.php';

header('Content-Type: application/json; charset=UTF-8');

// التحقق من تسجيل الدخول
if (!isset($_SESSION['user_id'])) {
    http_response_code(401);
    echo json_encode(['status' => 'error', 'message' => 'غير مسموح، يرجى تسجيل الدخول']);
    exit;
}

// التحقق من أن الطلب هو POST
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405);
    echo json_encode(['status' => 'error', 'message' => 'Method not allowed']);
    exit;
}

try {
    // التحقق من وجود الجدول
    $checkTable = $conn->query("SHOW TABLES LIKE 'device_contacts'");
    if ($checkTable->rowCount() == 0) {
        throw new Exception('الجدول device_contacts غير موجود في قاعدة البيانات');
    }
    
    // بدء المعاملة
    $conn->beginTransaction();
    
    $removedCount = 0;
    $totalBefore = 0;
    $totalAfter = 0;
    
    // الحصول على العدد الإجمالي قبل التنظيف
    $totalBefore = $conn->query("SELECT COUNT(*) FROM device_contacts")->fetchColumn();
    
    /**
     * استراتيجية 1: حذف التكرارات بناءً على رقم الهاتف (الأكثر دقة)
     * إذا كان نفس رقم الهاتف موجوداً عدة مرات لنفس الجهاز، نحتفظ بالأحدث
     */
    $duplicatesByPhone = $conn->query("
        SELECT device_id, phone_number, COUNT(*) as cnt, GROUP_CONCAT(id ORDER BY uploaded_at DESC) as ids
        FROM device_contacts
        WHERE phone_number IS NOT NULL AND phone_number != ''
        GROUP BY device_id, phone_number
        HAVING cnt > 1
    ")->fetchAll(PDO::FETCH_ASSOC);
    
    foreach ($duplicatesByPhone as $dup) {
        $ids = explode(',', $dup['ids']);
        // نحتفظ بالأول (الأحدث) ونحذف الباقي
        if (count($ids) > 1) {
            $idsToDelete = array_slice($ids, 1);
            $placeholders = implode(',', array_fill(0, count($idsToDelete), '?'));
            $deleteStmt = $conn->prepare("DELETE FROM device_contacts WHERE id IN ($placeholders)");
            $deleteStmt->execute($idsToDelete);
            $removedCount += $deleteStmt->rowCount();
        }
    }
    
    /**
     * استراتيجية 2: حذف التكرارات بناءً على الاسم + رقم الهاتف
     * إذا كان نفس الاسم ورقم الهاتف موجودان عدة مرات لنفس الجهاز
     */
    $duplicatesByNamePhone = $conn->query("
        SELECT device_id, contact_name, phone_number, COUNT(*) as cnt, GROUP_CONCAT(id ORDER BY uploaded_at DESC) as ids
        FROM device_contacts
        WHERE contact_name IS NOT NULL AND contact_name != '' 
          AND phone_number IS NOT NULL AND phone_number != ''
        GROUP BY device_id, contact_name, phone_number
        HAVING cnt > 1
    ")->fetchAll(PDO::FETCH_ASSOC);
    
    foreach ($duplicatesByNamePhone as $dup) {
        $ids = explode(',', $dup['ids']);
        if (count($ids) > 1) {
            $idsToDelete = array_slice($ids, 1);
            $placeholders = implode(',', array_fill(0, count($idsToDelete), '?'));
            $deleteStmt = $conn->prepare("DELETE FROM device_contacts WHERE id IN ($placeholders)");
            $deleteStmt->execute($idsToDelete);
            $removedCount += $deleteStmt->rowCount();
        }
    }
    
    /**
     * استراتيجية 3: حذف التكرارات بناءً على البريد الإلكتروني
     * إذا كان نفس البريد موجوداً عدة مرات لنفس الجهاز
     */
    $duplicatesByEmail = $conn->query("
        SELECT device_id, email, COUNT(*) as cnt, GROUP_CONCAT(id ORDER BY uploaded_at DESC) as ids
        FROM device_contacts
        WHERE email IS NOT NULL AND email != '' AND email LIKE '%@%'
        GROUP BY device_id, email
        HAVING cnt > 1
    ")->fetchAll(PDO::FETCH_ASSOC);
    
    foreach ($duplicatesByEmail as $dup) {
        $ids = explode(',', $dup['ids']);
        if (count($ids) > 1) {
            $idsToDelete = array_slice($ids, 1);
            $placeholders = implode(',', array_fill(0, count($idsToDelete), '?'));
            $deleteStmt = $conn->prepare("DELETE FROM device_contacts WHERE id IN ($placeholders)");
            $deleteStmt->execute($idsToDelete);
            $removedCount += $deleteStmt->rowCount();
        }
    }
    
    /**
     * استراتيجية 4: حذف التكرارات المطابقة تماماً (جميع الحقول)
     * إذا كانت جميع الحقول متطابقة تماماً
     */
    $duplicatesExact = $conn->query("
        SELECT device_id, contact_name, phone_number, email, organization, COUNT(*) as cnt, 
               GROUP_CONCAT(id ORDER BY uploaded_at DESC) as ids
        FROM device_contacts
        WHERE (contact_name IS NOT NULL OR phone_number IS NOT NULL OR email IS NOT NULL)
        GROUP BY device_id, contact_name, phone_number, email, organization
        HAVING cnt > 1
    ")->fetchAll(PDO::FETCH_ASSOC);
    
    foreach ($duplicatesExact as $dup) {
        $ids = explode(',', $dup['ids']);
        if (count($ids) > 1) {
            $idsToDelete = array_slice($ids, 1);
            $placeholders = implode(',', array_fill(0, count($idsToDelete), '?'));
            $deleteStmt = $conn->prepare("DELETE FROM device_contacts WHERE id IN ($placeholders)");
            $deleteStmt->execute($idsToDelete);
            $removedCount += $deleteStmt->rowCount();
        }
    }
    
    /**
     * استراتيجية 5: تنظيف أرقام الهواتف المكررة بعد توحيد التنسيق
     * إزالة المسافات والأحرف الخاصة من أرقام الهواتف للمقارنة
     */
    // تحديث أرقام الهواتف لتوحيد التنسيق (إزالة المسافات والأحرف الخاصة)
    $conn->exec("
        UPDATE device_contacts 
        SET phone_number = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(phone_number, ' ', ''), '-', ''), '(', ''), ')', ''), '+', '')
        WHERE phone_number IS NOT NULL AND phone_number != ''
    ");
    
    // حذف التكرارات بعد توحيد التنسيق
    $duplicatesNormalized = $conn->query("
        SELECT device_id, phone_number, COUNT(*) as cnt, GROUP_CONCAT(id ORDER BY uploaded_at DESC) as ids
        FROM device_contacts
        WHERE phone_number IS NOT NULL AND phone_number != ''
        GROUP BY device_id, phone_number
        HAVING cnt > 1
    ")->fetchAll(PDO::FETCH_ASSOC);
    
    foreach ($duplicatesNormalized as $dup) {
        $ids = explode(',', $dup['ids']);
        if (count($ids) > 1) {
            $idsToDelete = array_slice($ids, 1);
            $placeholders = implode(',', array_fill(0, count($idsToDelete), '?'));
            $deleteStmt = $conn->prepare("DELETE FROM device_contacts WHERE id IN ($placeholders)");
            $deleteStmt->execute($idsToDelete);
            $removedCount += $deleteStmt->rowCount();
        }
    }
    
    // الحصول على العدد الإجمالي بعد التنظيف
    $totalAfter = $conn->query("SELECT COUNT(*) FROM device_contacts")->fetchColumn();
    
    // تأكيد المعاملة
    $conn->commit();
    
    echo json_encode([
        'status' => 'success',
        'message' => "تم تنظيف قاعدة البيانات بنجاح",
        'removed' => $removedCount,
        'total_before' => $totalBefore,
        'total_after' => $totalAfter,
        'saved_space' => $totalBefore - $totalAfter
    ]);
    
} catch (PDOException $e) {
    if ($conn->inTransaction()) {
        $conn->rollBack();
    }
    http_response_code(500);
    error_log("Duplicate removal error: " . $e->getMessage());
    echo json_encode([
        'status' => 'error',
        'message' => 'خطأ في قاعدة البيانات: ' . $e->getMessage()
    ]);
} catch (Exception $e) {
    if ($conn->inTransaction()) {
        $conn->rollBack();
    }
    http_response_code(400);
    echo json_encode([
        'status' => 'error',
        'message' => $e->getMessage()
    ]);
}
?>

