<?php
// transfers_scraper.php (v1.1 - YallaKora with AJAX Pagination)

// --- إعدادات الأخطاء والوقت ---
ini_set('max_execution_time', 600); // 10 دقائق (قد تحتاج لوقت أطول للصفحات المتعددة)
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
ini_set('log_errors', 1);
$log_file = __DIR__ . '/scraper_errors.log'; // استخدام نفس ملف السجل
ini_set('// error_log', $log_file);



// --- تضمين الملفات المطلوبة ---
if (!file_exists(__DIR__ . '/config.php')) {
    $errorMsg = "[Transfers Scraper] FATAL ERROR: config.php not found in " . __DIR__;
    // error_log($errorMsg); die($errorMsg);
}
require __DIR__ . '/config.php';

if (!file_exists(__DIR__ . '/simple_html_dom.php')) {
    $errorMsg = "[Transfers Scraper] FATAL ERROR: simple_html_dom.php not found in " . __DIR__;
    // error_log($errorMsg); die($errorMsg);
}
require __DIR__ . '/simple_html_dom.php';

// --- دوال الاتصال وجلب المحتوى وتنسيق التاريخ (كما هي) ---
function connectToDB() {
    // ... (نفس دالة connectToDB) ...
     if (!defined('DB_HOST') || !defined('DB_NAME') || !defined('DB_USER') || !defined('DB_PASS')) {
        // error_log("[Transfers Scraper] FATAL DB Connection Error: Database constants not defined."); return null;
    }
    $dsn = "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=utf8mb4";
    $options = [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false];
    try {
         $db = new PDO($dsn, DB_USER, DB_PASS, $options);
         // error_log("[Transfers Scraper] Database connection successful.");
         return $db;
    } catch (PDOException $e) {
         // error_log("[Transfers Scraper] FATAL DB Connection Error: " . $e->getMessage()); return null;
    }
}

function fetchPageContent($url, $isAjax = false) { // إضافة متغير للتمييز بين الطلبات
    // error_log("[Transfers Scraper] Fetching URL: " . $url);
    $ch = curl_init();
    if ($ch === false) { // error_log("cURL Error: Failed to initialize for URL: " . $url); return null; }
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/5.37.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36');
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_TIMEOUT, 45);
    curl_setopt($ch, CURLOPT_REFERER, 'https://www.yallakora.com/'); // Referer مهم

    // إضافة Headers خاصة بطلبات AJAX إذا لزم الأمر
    if ($isAjax) {
        $headers = [
            'X-Requested-With: XMLHttpRequest', // Header شائع لتمييز طلبات AJAX
            'Accept: text/html, */*; q=0.01' // قد تختلف حسب الموقع
        ];
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    }

    $htmlContent = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $curlError = curl_error($ch);
    if ($htmlContent === false) {
        // error_log("cURL Error executing fetch for {$url}: " . $curlError . " (HTTP Code: {$httpCode})");
        curl_close($ch); return null;
    }
    curl_close($ch);
    // قد ترجع طلبات AJAX أكواد غير 200 حتى لو نجحت جزئياً، أو قد ترجع HTML فارغ عند انتهاء الصفحات
    // سنقوم بالتحقق من المحتوى لاحقاً
    if ($httpCode != 200 && !$isAjax) { // تحقق فقط للصفحة الأولى
        // error_log("[Transfers Scraper] Failed HTTP request for initial page {$url}. Code: {$httpCode}.");
        return null;
    }
     // error_log("[Transfers Scraper] Successfully fetched URL: " . $url . " (HTTP " . $httpCode . ")");
    return $htmlContent;
}

function formatDateForDB($dateStr) {
    // ... (نفس دالة formatDateForDB) ...
      try {
        $date = DateTime::createFromFormat('d-m-Y', trim($dateStr));
        if ($date) {
            return $date->format('Y-m-d');
        }
    } catch (Exception $e) {
        // error_log("[Transfers Scraper] Error formatting date '{$dateStr}': " . $e->getMessage());
    }
    return null; // Return null if format fails
}

/**
 * دالة مساعدة لتحليل صف انتقال وتخزينه
 * @param simple_html_dom_node $row
 * @param PDOStatement $stmtInsert
 * @param int $pageNumber
 * @return int 1 = Inserted, 0 = Duplicate/Skipped, -1 = Error
 */
function processAndInsertTransferRow(simple_html_dom_node $row, PDOStatement $stmtInsert, int $pageNumber = 1): int { // ★★★ تم تغيير نوع الإرجاع إلى int
    try {
        $transferData = [
            ':transfer_date' => null, ':player_name' => null, ':player_image_url' => null,
            ':from_team_name' => null, ':from_team_image_url' => null,
            ':to_team_name' => null, ':to_team_image_url' => null, ':transfer_details' => null,
        ];

        // ... (كل كود استخراج البيانات يبقى كما هو) ...
        // استخراج التاريخ
        $dateEl = $row->find('div.item.fixed', 0);
        if ($dateEl) { $transferData[':transfer_date'] = formatDateForDB($dateEl->plaintext); }

        // استخراج بيانات اللاعب
        $playerDiv = $row->find('div.item.var', 0);
        if ($playerDiv && ($playerLink = $playerDiv->find('a', 0))) {
            $playerImg = $playerLink->find('img', 0);
            $playerP = $playerLink->find('p', 0);
            $transferData[':player_image_url'] = $playerImg ? trim($playerImg->src) : null;
            $transferData[':player_name'] = $playerP ? trim($playerP->plaintext) : null;
        }

        // استخراج الفريق المنتقل منه
        $fromTeamDiv = $row->find('div.item.var.fromTeam', 0);
        if ($fromTeamDiv && ($fromTeamLink = $fromTeamDiv->find('a', 0))) {
            $fromTeamImg = $fromTeamLink->find('img', 0);
            $fromTeamP = $fromTeamLink->find('p', 0);
            $transferData[':from_team_image_url'] = $fromTeamImg ? trim($fromTeamImg->src) : null;
            $transferData[':from_team_name'] = $fromTeamP ? trim($fromTeamP->plaintext) : null;
        }

        // استخراج الفريق المنتقل إليه
        $toTeamDiv = $row->find('div.item.var.toTeam', 0);
        if ($toTeamDiv && ($toTeamLink = $toTeamDiv->find('a', 0))) {
            $toTeamImg = $toTeamLink->find('img', 0);
            $toTeamP = $toTeamLink->find('p', 0);
            $transferData[':to_team_image_url'] = $toTeamImg ? trim($toTeamImg->src) : null;
            $transferData[':to_team_name'] = $toTeamP ? trim($toTeamP->plaintext) : null;
        }

        // استخراج تفاصيل الصفقة
        $detailsDiv = $row->find('div.item.fixed.price', 0);
        if ($detailsDiv && ($detailsP = $detailsDiv->find('p', 0))) {
            $transferData[':transfer_details'] = trim($detailsP->plaintext);
        }

        // إدخال البيانات في قاعدة البيانات
        if (!empty($transferData[':player_name']) && !empty($transferData[':transfer_date'])) {
            try {
                $stmtInsert->execute($transferData);
                if($stmtInsert->rowCount() > 0) {
                     // error_log("[Transfers Scraper] (Page {$pageNumber}) Inserted: {$transferData[':player_name']} on {$transferData[':transfer_date']}");
                     return 1; // ★★★ 1 = تم الإدخال ★★★
                } else {
                     // error_log("[Transfers Scraper] (Page {$pageNumber}) Skipped (0 rows affected): {$transferData[':player_name']} on {$transferData[':transfer_date']}");
                     return 0; // ★★★ 0 = تم التخطي (قد يحدث مع INSERT IGNORE) ★★★
                }
            } catch (PDOException $e) {
                 if ($e->getCode() == '23000') { // ★★★ هذا هو القيد الذي أضفناه ★★★
                     // error_log("[Transfers Scraper] (Page {$pageNumber}) Skipped duplicate entry: {$transferData[':player_name']} on {$transferData[':transfer_date']}");
                     return 0; // ★★★ 0 = تكرار ★★★
                 } else {
                    // error_log("[Transfers Scraper] (Page {$pageNumber}) DB Error inserting: " . $e->getMessage());
                    return -1; // ★★★ -1 = خطأ ★★★
                 }
            }
        } else {
            // error_log("[Transfers Scraper] (Page {$pageNumber}) Skipped row due to missing essential data.");
        }

    } catch (Throwable $t) {
        // error_log("[Transfers Scraper] (Page {$pageNumber}) EXCEPTION processing transfer row: " . $t->getMessage() . ". HTML: " . substr(trim($row->outertext), 0, 200));
    }
    return -1; // ★★★ -1 = خطأ عام ★★★
}


/**
 * سحب وتخزين قائمة الانتقالات من YallaKora (مع الصفحات الإضافية)
 * @param PDO $db
 * @param PDOStatement $stmtInsert
 * @param int $totalPagesToFetch عدد الصفحات الإجمالي المراد جلبها (بما في ذلك الأولى)
 * @return int Count of new transfers inserted
 */
function scrapeAndStoreTransfers(PDO $db, PDOStatement $stmtInsert, int $totalPagesToFetch = 10): int {
    $initialUrl = "https://www.yallakora.com/transfer-list/%d8%ac%d9%85%d9%8a%d8%b9-%d8%a7%d9%84%d8%a5%d9%86%d8%aa%d9%82%d8%a7%d9%84%d8%a7%d8%aa/0";
    $ajaxBaseUrl = "https://www.yallakora.com/Transfers/TransferMore?ajax=2&tourId=0&hashtag=TransfersMore";
    $totalInsertedThisRun = 0;
    
    // ★★★ بداية الإضافة: عداد التكرارات ★★★
    $consecutiveDuplicates = 0;
    $duplicateThreshold = 5; // إيقاف السحب بعد 5 تكرارات متتالية
    // ★★★ نهاية الإضافة ★★★


    // --- الصفحة الأولى ---
    // error_log("--- [Transfers Scraper] Processing Initial Page (Page 1) ---");
    $htmlContent = fetchPageContent($initialUrl, false);
    
    if (!$htmlContent) { 
        // error_log("[Transfers Scraper] Failed initial fetch. Aborting."); 
        return 0; 
    }
    
    if (!function_exists('str_get_html')) { 
        // error_log("[Transfers Scraper] FATAL: simple_html_dom library not loaded correctly."); 
        return 0; 
    }

    $html = str_get_html($htmlContent);
    if ($html && is_object($html)) {
        $listingContainer = $html->find('div#ulListing', 0);
        if ($listingContainer && is_object($listingContainer)) {
            $rows = $listingContainer->find('div.wRow');
            // error_log("[Transfers Scraper] Found " . count($rows) . " transfer rows on initial page.");
            foreach ($rows as $row) {
                // ★★★ بداية التعديل: التحقق من نتيجة الإدخال ★★★
                $result = processAndInsertTransferRow($row, $stmtInsert, 1);
                
                if($result === 1) { // 1 = تم الإدخال
                    $totalInsertedThisRun++;
                    $consecutiveDuplicates = 0; // إعادة تصفير العداد
                } elseif ($result === 0) { // 0 = تكرار
                    $consecutiveDuplicates++;
                    if ($consecutiveDuplicates >= $duplicateThreshold) {
                        // error_log("[Transfers Scraper] Reached duplicate threshold ({$duplicateThreshold}) on Page 1. Stopping.");
                        $html->clear(); unset($html);
                        return $totalInsertedThisRun; // ★★★ إنهاء مبكر ★★★
                    }
                }
                // إذا كانت النتيجة -1 (خطأ)، سيتجاهل ويستمر
                // ★★★ نهاية التعديل ★★★
            }
        } else { 
            // error_log("[Transfers Scraper] Listing container (div#ulListing) not found on initial page."); 
        }
        $html->clear(); 
        unset($html);
    } else { 
        // error_log("[Transfers Scraper] Failed to parse initial page."); 
    }
    
    return $totalInsertedThisRun;
}

    // --- الصفحات الإضافية (من 2 إلى totalPagesToFetch) ---
    for ($page = 2; $page <= $totalPagesToFetch; $page++) {
        
        // ★★★ بداية الإضافة: التحقق قبل جلب الصفحة ★★★
        if ($consecutiveDuplicates >= $duplicateThreshold) {
            // error_log("[Transfers Scraper] Stopping before fetching Page {$page} due to reaching duplicate threshold.");
            break; // ★★★ إيقاف حلقة for ★★★
        }
        // ★★★ نهاية الإضافة ★★★

        // error_log("--- [Transfers Scraper] Processing AJAX Page {$page} ---");
        $currentPageUrl = $ajaxBaseUrl . "&pageIndex=" . $page;

        $ajaxContent = fetchPageContent($currentPageUrl, true); // True لـ isAjax

        // التحقق مما إذا كانت الاستجابة فارغة (قد يعني نهاية الصفحات)
        if (empty(trim($ajaxContent))) {
            // error_log("[Transfers Scraper] Empty response received for page {$page}. Assuming end of transfers. Stopping.");
            break; // توقف عن جلب المزيد من الصفحات
        }

        $ajaxHtml = str_get_html($ajaxContent);
        if ($ajaxHtml && is_object($ajaxHtml)) {
            // الاستجابة من AJAX قد تكون مباشرة الصفوف بدون حاوية div#ulListing
            $rows = $ajaxHtml->find('div.wRow');
            // error_log("[Transfers Scraper] Found " . count($rows) . " transfer rows on AJAX page {$page}.");

            if (empty($rows)) {
                 // error_log("[Transfers Scraper] No transfer rows found in AJAX response for page {$page}. Stopping.");
                 $ajaxHtml->clear(); unset($ajaxHtml);
                 break; // توقف إذا لم يتم العثور على صفوف
            }

            foreach ($rows as $row) {
                 // ★★★ بداية التعديل: التحقق من نتيجة الإدخال ★★★
                 $result = processAndInsertTransferRow($row, $stmtInsert, $page);
                 
                 if($result === 1) { // 1 = تم الإدخال
                    $totalInsertedThisRun++;
                    $consecutiveDuplicates = 0; // إعادة تصفير العداد
                 } elseif ($result === 0) { // 0 = تكرار
                    $consecutiveDuplicates++;
                    if ($consecutiveDuplicates >= $duplicateThreshold) {
                        // error_log("[Transfers Scraper] Reached duplicate threshold ({$duplicateThreshold}) on Page {$page}. Stopping.");
                        break; // ★★★ إيقاف حلقة foreach ★★★
                    }
                 }
                 // ★★★ نهاية التعديل ★★★
            }
            $ajaxHtml->clear(); unset($ajaxHtml);
        } else {
            // error_log("[Transfers Scraper] Failed to parse AJAX response for page {$page}. Response snippet: " . substr(trim($ajaxContent ?? ''), 0, 200));
        }

        usleep(700000); // تأخير 0.7 ثانية بين طلبات AJAX
    } // End for loop

    // error_log("[Transfers Scraper] Finished processing all pages. Total inserted this run: {$totalInsertedThisRun}.");
    return $totalInsertedThisRun; // إرجاع العدد الإجمالي

} // End function scrapeAndStoreTransfers

/**
 * الدالة الرئيسية لتشغيل سكربت جلب الانتقالات
 */
function runTransfersScraper() {
    // error_log("--- Starting Transfers Scraper Run [v1.1 - YallaKora AJAX] ---");
    echo "<h1>Starting Transfers Scraper v1.1 (YallaKora AJAX)...</h1>";

    $db = connectToDB();
    if (!$db) { echo "<p style='color:red;'>FATAL DB Error. Check logs.</p>"; // error_log("[Transfers Scraper] Stopped: DB connection fail."); exit; }

    $transfersTable = DB_PREFIX . 'transfers'; // اسم جدول الانتقالات

    try {
         // استخدام INSERT IGNORE لتجاهل الإدخالات المكررة بناءً على مفتاح فريد محتمل (مثل player_name + transfer_date + to_team_name)
         // لكننا سنستخدم INSERT عادي ونعتمد على معالجة الخطأ 23000 في دالة processAndInsertTransferRow
         $sqlInsert = "
            INSERT INTO {$transfersTable} (
                transfer_date, player_name, player_image_url,
                from_team_name, from_team_image_url,
                to_team_name, to_team_image_url, transfer_details
            ) VALUES (
                :transfer_date, :player_name, :player_image_url,
                :from_team_name, :from_team_image_url,
                :to_team_name, :to_team_image_url, :transfer_details
            )
         ";
         // يمكنك إضافة مفتاح UNIQUE على الأعمدة المناسبة لمنع التكرار بشكل صارم في قاعدة البيانات
         // ALTER TABLE `i4NYZyNZ_transfers` ADD UNIQUE `unique_transfer` (`transfer_date`, `player_name`, `to_team_name`);
         // ثم استخدام INSERT IGNORE ... في $sqlInsert
         $stmtInsert = $db->prepare($sqlInsert);

        echo "<p>Processing transfers pages (up to 10 pages)...</p>";
        flush(); ob_flush(); // Show progress

        $numberOfPagesToFetch = 10; // عدد الصفحات الإجمالي المراد جلبه
        $insertedCount = scrapeAndStoreTransfers($db, $stmtInsert, $numberOfPagesToFetch);

        echo "<p style='color:green;'>Finished processing. Inserted {$insertedCount} new transfers from {$numberOfPagesToFetch} pages.</p>";
        // error_log("[Transfers Scraper] Finished run. Inserted {$insertedCount} new transfers.");


    } catch (Throwable $t) {
        $errorMsg = "[Transfers Scraper] FATAL Error: " . $t->getMessage() . " in " . $t->getFile() . ":" . $t->getLine();
        // error_log($errorMsg); // error_log("Trace: " . $t->getTraceAsString());
        echo "<p style='color:red;'>FATAL Error occurred. Check scraper_errors.log</p>";
        echo "<p>Error: " . htmlspecialchars($t->getMessage()) . "</p>";
     } // End catch

    // error_log("--- Transfers Scraper Run Finished ---");
    echo "<h2>Transfers scraping completed. Check 'scraper_errors.log' for details.</h2>";

} // End function runTransfersScraper


// --- التنفيذ ---
if (basename(__FILE__) == basename($_SERVER["SCRIPT_FILENAME"])) {
    runTransfersScraper();
}

?>