<?php
// leagues_api.php (v5.0 - نسخة نظيفة وموحدة)

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
ini_set('log_errors', 1);
ini_set('error_log', __DIR__ . '/scraper_errors.log'); // سجل موحد

header('Content-Type: application/json; charset=utf-8'); // الافتراضي
header("Access-Control-Allow-Origin: *");

require __DIR__ . '/config.php';



// --- دوال الأمان والاتصال (كما هي) ---
function connectToDB() {
    if (!defined('DB_HOST') || !defined('DB_NAME') || !defined('DB_USER') || !defined('DB_PASS')) {
        error_log("API DB Connection Error: Database constants not defined.");
        echo json_encode(['success' => false, 'message' => 'خطأ في إعدادات الاتصال.'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); exit;
    }
    $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); return $db;
    } catch (PDOException $e) {
         error_log("API DB Connection Error: " . $e->getMessage());
         echo json_encode(['success' => false, 'message' => 'خطأ في الاتصال بقاعدة البيانات.'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); exit;
    }
}

function isValidToken($token, $request_domain) {
    if (empty($token) || empty($request_domain)) { return false; }
    $db = connectToDB(); if (!$db) { exit; }
    try {
        $stmt = $db->prepare("SELECT user_domain FROM api_tokens WHERE token = ? LIMIT 1");
        $stmt->execute([$token]); $result = $stmt->fetch(PDO::FETCH_ASSOC);
        if ($result && isset($result['user_domain'])) {
            $db_domain = preg_replace('#^www\.#', '', trim($result['user_domain']));
            $normalized_request_domain = preg_replace('#^https?://#', '', trim($request_domain));
            $normalized_request_domain = rtrim($normalized_request_domain, '/');
            $normalized_request_domain = preg_replace('#^www\.#', '', $normalized_request_domain);
            return ($db_domain === $normalized_request_domain);
        } return false;
    } catch (PDOException $e) { error_log("API Token Validation DB Error: " . $e->getMessage()); return false; }
}
// --- نهاية دوال الأمان ---


/**
 * دالة جلب الترتيب المحدث لبطولة (للـ SSE)
 * @param PDO $db
 * @param int $leagueId
 * @param string|null $lastUpdate
 * @return array|null [standings_data, last_scraped_timestamp]
 */
function getUpdatedStandings($db, $leagueId, $lastUpdate) {
    try {
        $standingsTable = DB_PREFIX . 'league_standings';
        $sql = "SELECT standings_json, last_scraped
                FROM {$standingsTable}
                WHERE league_id = :league_id";
        // إضافة شرط التحديث فقط إذا كان lastUpdate موجوداً
        if ($lastUpdate) {
            $sql .= " AND last_scraped > :last_update";
        }
        $sql .= " LIMIT 1"; // نحتاج فقط لأحدث سجل لهذه البطولة

        $stmt = $db->prepare($sql);
        $stmt->bindParam(':league_id', $leagueId, PDO::PARAM_INT);
        if ($lastUpdate) {
            $stmt->bindParam(':last_update', $lastUpdate, PDO::PARAM_STR);
        }
        $stmt->execute();
        $result = $stmt->fetch();

        if ($result) {
            $standingsData = json_decode($result['standings_json'] ?? '[]', true);
            if (json_last_error() === JSON_ERROR_NONE) {
                return [$standingsData, $result['last_scraped']];
            } else {
                error_log("[SSE Standings L{$leagueId}] JSON Decode Error: " . json_last_error_msg());
            }
        }
        return null; // لا يوجد تحديث أو خطأ

    } catch (PDOException $e) {
        error_log("[SSE Standings L{$leagueId}] DB Error: " . $e->getMessage());
        return null;
    }
}

/**
 * دالة جلب الهدافين المحدثين لبطولة (للـ SSE)
 * @param PDO $db
 * @param int $leagueId
 * @param string|null $lastUpdate
 * @return array|null [scorers_data, last_scraped_timestamp]
 */
function getUpdatedTopScorers($db, $leagueId, $lastUpdate) {
    try {
        $topScorersTable = DB_PREFIX . 'league_top_scorers';
         $sql = "SELECT top_scorers_json, last_scraped
                 FROM {$topScorersTable}
                 WHERE league_id = :league_id";
         if ($lastUpdate) {
             $sql .= " AND last_scraped > :last_update";
         }
         $sql .= " LIMIT 1";

        $stmt = $db->prepare($sql);
        $stmt->bindParam(':league_id', $leagueId, PDO::PARAM_INT);
         if ($lastUpdate) {
             $stmt->bindParam(':last_update', $lastUpdate, PDO::PARAM_STR);
         }
        $stmt->execute();
        $result = $stmt->fetch();

        if ($result) {
            $scorersData = json_decode($result['top_scorers_json'] ?? '[]', true);
             if (json_last_error() === JSON_ERROR_NONE) {
                 return [$scorersData, $result['last_scraped']];
             } else {
                 error_log("[SSE Scorers L{$leagueId}] JSON Decode Error: " . json_last_error_msg());
             }
        }
        return null;

    } catch (PDOException $e) {
        error_log("[SSE Scorers L{$leagueId}] DB Error: " . $e->getMessage());
        return null;
    }
}


// --- ★★★ دالة SSE جديدة للانتقالات ★★★ ---
/**
 * دالة جلب الانتقالات الجديدة (للـ SSE)
 * @param PDO $db
 * @param int|null $lastTransferId - آخر ID انتقال تم إرساله للعميل
 * @return array|null - مصفوفة بالانتقالات الجديدة أو null
 */
function getNewTransfers($db, $lastTransferId) {
    try {
        $transfersTable = DB_PREFIX . 'transfers';
        $sql = "SELECT
                    transfer_id, transfer_date, player_name, player_image_url,
                    from_team_name, from_team_image_url,
                    to_team_name, to_team_image_url, transfer_details,
                    scraped_at
                FROM {$transfersTable}";

        // جلب فقط الأحدث من آخر ID معروف (إذا تم توفيره)
        if ($lastTransferId !== null && $lastTransferId > 0) {
            $sql .= " WHERE transfer_id > :last_id";
        }
        // الترتيب مهم للحصول على الأحدث وتحديد الـ ID التالي
        $sql .= " ORDER BY transfer_id ASC"; // ترتيب تصاعدي لجلب الأحدث بعد last_id
        // يمكن تحديد حد أقصى لعدد النتائج المرسلة في كل مرة إذا كان هناك تدفق كبير
        // $sql .= " LIMIT 10";

        $stmt = $db->prepare($sql);
        if ($lastTransferId !== null && $lastTransferId > 0) {
            $stmt->bindParam(':last_id', $lastTransferId, PDO::PARAM_INT);
        }
        $stmt->execute();
        $newTransfers = $stmt->fetchAll();

        return !empty($newTransfers) ? $newTransfers : null;

    } catch (PDOException $e) {
        error_log("[SSE Transfers] DB Error: " . $e->getMessage());
        return null;
    }
}

// --- بداية منطق API الموحد ---
// 1. التحقق من التوكن والنطاق (يتم مرة واحدة)
$token = $_GET['token'] ?? ''; $requested_domain = $_GET['domain'] ?? '';
if (!isValidToken($token, $requested_domain)) {
     http_response_code(403);
     echo json_encode(["success" => false, "message" => "التوكن أو النطاق غير صالح."], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); exit;
}

// 2. الاتصال بقاعدة البيانات (يتم مرة واحدة)
$db = connectToDB(); if (!$db) { exit; }

// 3. جلب جميع البارامترات المطلوبة
$action = $_GET['action'] ?? null;
$leagueIdParam = $_GET['league_id'] ?? null;
$lastEventId = $_SERVER['HTTP_LAST_EVENT_ID'] ?? ($_GET['last_id'] ?? null);
$lastTransferId = ($lastEventId !== null && is_numeric($lastEventId)) ? (int)$lastEventId : null;

// 4. تعريف خيارات JSON
$json_options_sse = JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES; // أصغر حجمًا للـ SSE
$json_options_api = JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT; // مقروء للـ API العادي


// --- ★★★ نقطة النهاية الجديدة SSE (للبطولات) ★★★ ---
if ($action === 'sse' && isset($leagueIdParam)) {
    $leagueId = (int)$leagueIdParam;
    if ($leagueId <= 0) { http_response_code(400); echo json_encode(['success' => false, 'message' => 'معرف بطولة غير صالح.'], $json_options_sse); exit; }

    // التحقق من وجود البطولة أولاً (اختياري لكن جيد)
    try {
        $listTable = DB_PREFIX . 'leagues_list';
        $stmtCheck = $db->prepare("SELECT league_id FROM {$listTable} WHERE league_id = :league_id");
        $stmtCheck->bindParam(':league_id', $leagueId, PDO::PARAM_INT); $stmtCheck->execute();
        if (!$stmtCheck->fetch()) { http_response_code(404); echo json_encode(['success' => false, 'message' => 'البطولة غير موجودة.'], $json_options_sse); exit; }
    } catch (PDOException $e) { /* ... handle DB error ... */ }


    // إعداد ترويسات SSE
    header('Content-Type: text/event-stream');
    header('Cache-Control: no-cache');
    header('X-Accel-Buffering: no'); // مهم لـ Nginx
    header('Connection: keep-alive');

    $lastStandingsUpdate = null;
    $lastScorersUpdate = null;
    $pollingInterval = 10; // ثواني بين كل فحص (يمكن تعديلها)

    while (true) {
        if (connection_aborted()) break; // إيقاف إذا أغلق المستخدم الاتصال

        // 1. فحص الترتيب
        $standingsResult = getUpdatedStandings($db, $leagueId, $lastStandingsUpdate);
        if ($standingsResult) {
            list($standingsData, $timestamp) = $standingsResult;
            echo "event: standings_update\n";
            echo "data: " . json_encode(['league_id' => $leagueId, 'standings' => $standingsData], $json_options_sse) . "\n\n";
            $lastStandingsUpdate = $timestamp; // تحديث آخر وقت تم الإرسال فيه
             if (ob_get_level() > 0) @ob_flush(); @flush(); // إرسال فوري
        }

        // 2. فحص الهدافين
        $scorersResult = getUpdatedTopScorers($db, $leagueId, $lastScorersUpdate);
        if ($scorersResult) {
            list($scorersData, $timestamp) = $scorersResult;
            echo "event: scorers_update\n";
            echo "data: " . json_encode(['league_id' => $leagueId, 'top_scorers' => $scorersData], $json_options_sse) . "\n\n";
            $lastScorersUpdate = $timestamp;
             if (ob_get_level() > 0) @ob_flush(); @flush();
        }

        // 3. رسالة Keep-alive إذا لم يكن هناك تحديثات
        if (!$standingsResult && !$scorersResult) {
            echo ": keep-alive\n\n";
             if (ob_get_level() > 0) @ob_flush(); @flush();
        }

        // 4. الانتظار قبل الفحص التالي
        sleep($pollingInterval);

    } // نهاية while
    exit; // إنهاء السكربت عند إغلاق الاتصال
}

// --- نقطة النهاية: جلب كل البطولات ---
if ($action === 'get_all_leagues') {
    try {
        $tableName = DB_PREFIX . 'leagues_list';
        $stmt = $db->query("SELECT league_id, league_name, league_slug, league_url, league_logo FROM {$tableName} ORDER BY league_name ASC");
        $leagues = $stmt->fetchAll();
        echo json_encode(['success' => true, 'data' => $leagues], $json_options_api); exit;
    } catch (PDOException $e) { /* ... handling ... */ }
}

// --- نقطة النهاية: جلب مباريات بطولة محددة (مجمعة) ---
elseif ($action === 'get_league_fixtures' && isset($leagueIdParam)) {
    $leagueId = (int)$leagueIdParam;
    if ($leagueId <= 0) { /* ... handling ... */ http_response_code(400); echo json_encode(['success' => false, 'message' => 'معرف بطولة غير صالح.'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); exit; }
    try {
        $fixtureWeeksTable = DB_PREFIX . 'league_fixture_weeks'; $listTable = DB_PREFIX . 'leagues_list';
        $stmtCheck = $db->prepare("SELECT league_name FROM {$listTable} WHERE league_id = :league_id");
        $stmtCheck->bindParam(':league_id', $leagueId, PDO::PARAM_INT); $stmtCheck->execute();
        $leagueInfo = $stmtCheck->fetch();
        if (!$leagueInfo) { /* ... handling ... */ http_response_code(404); echo json_encode(['success' => false, 'message' => 'البطولة غير موجودة.'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); exit; }

        $stmtWeeks = $db->prepare("SELECT week_name, matches_json, last_scraped FROM {$fixtureWeeksTable} WHERE league_id = :league_id ORDER BY week_name");
        $stmtWeeks->bindParam(':league_id', $leagueId, PDO::PARAM_INT); $stmtWeeks->execute();
        $weeksData = $stmtWeeks->fetchAll();
        $fixturesByWeek = []; $lastUpdateTimestamp = null;
        foreach ($weeksData as $weekRow) {
            $weekName = $weekRow['week_name'] ?? 'بيانات غير مكتملة';
            $matches = json_decode($weekRow['matches_json'] ?? '[]', true);
            if (json_last_error() !== JSON_ERROR_NONE) { $fixturesByWeek[$weekName] = ['error' => 'Failed decode']; } else { $fixturesByWeek[$weekName] = $matches; }
            if ($weekRow['last_scraped'] && (!$lastUpdateTimestamp || $weekRow['last_scraped'] > $lastUpdateTimestamp)) { $lastUpdateTimestamp = $weekRow['last_scraped']; }
        }
        $responseData = ['league_info' => ['id' => $leagueId, 'name' => $leagueInfo['league_name']], 'fixtures_by_week' => $fixturesByWeek, 'last_updated' => $lastUpdateTimestamp ];
        echo json_encode(['success' => true, 'data' => $responseData], $json_options_api); exit;
    } catch (PDOException $e) { /* ... handling ... */ error_log("API Error fetching league fixtures (ID: $leagueId): " . $e->getMessage()); http_response_code(500); echo json_encode(['success' => false, 'message' => 'فشل جلب مباريات البطولة.'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); exit; }
}



// --- ★★★ نقطة النهاية الجديدة: جلب ترتيب بطولة محددة ★★★ ---
elseif ($action === 'get_league_standings' && isset($leagueIdParam)) {
    $leagueId = (int)$leagueIdParam;
    if ($leagueId <= 0) {
        http_response_code(400);
        echo json_encode(['success' => false, 'message' => 'معرف بطولة غير صالح.'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); exit;
    }

    try {
        $standingsTable = DB_PREFIX . 'league_standings'; // الجدول الجديد
        $listTable = DB_PREFIX . 'leagues_list';

        // جلب اسم البطولة وبيانات الترتيب JSON
        $stmt = $db->prepare("
            SELECT
                l.league_name,
                s.standings_json,
                s.last_scraped
            FROM {$listTable} l
            LEFT JOIN {$standingsTable} s ON l.league_id = s.league_id
            WHERE l.league_id = :league_id
        ");
        $stmt->bindParam(':league_id', $leagueId, PDO::PARAM_INT);
        $stmt->execute();
        $result = $stmt->fetch();

        if (!$result) {
            http_response_code(404);
            echo json_encode(['success' => false, 'message' => 'البطولة غير موجودة.'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); exit;
        }

        // فك ترميز JSON
        $standingsData = json_decode($result['standings_json'] ?? '[]', true);

        // التحقق من خطأ فك الترميز
        if (json_last_error() !== JSON_ERROR_NONE) {
            error_log("API JSON Decode Error for standings league {$leagueId}: " . json_last_error_msg());
            // قد نرجع مصفوفة فارغة أو خطأ حسب الحاجة
            $standingsData = ['error' => 'Failed to decode standings data'];
            // أو يمكنك إرجاع خطأ 500
            // http_response_code(500);
            // echo json_encode(['success' => false, 'message' => 'خطأ في بيانات الترتيب المخزنة.'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); exit;
        }

        $responseData = [
            'league_info' => ['id' => $leagueId, 'name' => $result['league_name']],
            'standings' => $standingsData, // مصفوفة الترتيب
            'last_updated' => $result['last_scraped']
        ];

        echo json_encode(['success' => true, 'data' => $responseData], $json_options_api);
        exit;

    } catch (PDOException $e) {
        error_log("API Error fetching league standings (ID: $leagueId): " . $e->getMessage());
        http_response_code(500);
        echo json_encode(['success' => false, 'message' => 'فشل جلب ترتيب البطولة.'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); exit;
    }
}


// --- ★★★ نقطة النهاية الجديدة: جلب هدافي بطولة محددة ★★★ ---
elseif ($action === 'get_league_top_scorers' && isset($leagueIdParam)) {
    $leagueId = (int)$leagueIdParam;
    if ($leagueId <= 0) {
        http_response_code(400);
        echo json_encode(['success' => false, 'message' => 'معرف بطولة غير صالح.'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); exit;
    }

    try {
        $topScorersTable = DB_PREFIX . 'league_top_scorers'; // الجدول الجديد
        $listTable = DB_PREFIX . 'leagues_list';

        // جلب اسم البطولة وبيانات الهدافين JSON
        $stmt = $db->prepare("
            SELECT
                l.league_name,
                ts.top_scorers_json,
                ts.last_scraped
            FROM {$listTable} l
            LEFT JOIN {$topScorersTable} ts ON l.league_id = ts.league_id
            WHERE l.league_id = :league_id
        ");
        $stmt->bindParam(':league_id', $leagueId, PDO::PARAM_INT);
        $stmt->execute();
        $result = $stmt->fetch();

        if (!$result) {
            http_response_code(404);
            echo json_encode(['success' => false, 'message' => 'البطولة غير موجودة.'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); exit;
        }

        // فك ترميز JSON
        $topScorersData = json_decode($result['top_scorers_json'] ?? '[]', true);

        // التحقق من خطأ فك الترميز
        if (json_last_error() !== JSON_ERROR_NONE) {
            error_log("API JSON Decode Error for top scorers league {$leagueId}: " . json_last_error_msg());
            $topScorersData = ['error' => 'Failed to decode top scorers data'];
            // أو يمكنك إرجاع خطأ 500 إذا أردت
        }

        $responseData = [
            'league_info' => ['id' => $leagueId, 'name' => $result['league_name']],
            'top_scorers' => $topScorersData, // مصفوفة الهدافين
            'last_updated' => $result['last_scraped']
        ];

        echo json_encode(['success' => true, 'data' => $responseData], $json_options_api);
        exit;

    } catch (PDOException $e) {
        error_log("API Error fetching league top scorers (ID: $leagueId): " . $e->getMessage());
        http_response_code(500);
        echo json_encode(['success' => false, 'message' => 'فشل جلب هدافي البطولة.'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); exit;
    }
}


// --- ★★★ نقطة النهاية الجديدة SSE للانتقالات (نسخة معدلة) ★★★ ---
elseif ($action === 'sse_transfers') {
    // إعداد ترويسات SSE
    header('Content-Type: text/event-stream');
    header('Cache-Control: no-cache');
    header('X-Accel-Buffering: no');
    header('Connection: keep-alive');

    $pollingInterval = 20; // ثواني بين كل فحص (الانتقالات أقل تواتراً)
    $currentLastTransferId = $lastTransferId; // استخدام الـ ID المستلم (إن وجد)

    // ★★★ بداية التعديل: تجهيز الـ ID للاتصال الأول ★★★
    // إذا كان هذا هو الاتصال الأول (لا يوجد last_id من العميل)
    // قم بضبط الـ ID الحالي على آخر ID في قاعدة البيانات (دون إرسال أي شيء)
    // لمنع إرسال "كل" الانتقالات عند بدء الاتصال.
    if ($currentLastTransferId === null) {
        try {
            $transfersTable = DB_PREFIX . 'transfers';
            // جلب أعلى/آخر ID موجود حالياً
            $stmt = $db->query("SELECT MAX(transfer_id) FROM {$transfersTable}");
            $latestId = $stmt->fetchColumn();
            
            if ($latestId) {
                $currentLastTransferId = (int)$latestId;
                error_log("[SSE Transfers] Connection opened. No last_id. Primed with latest ID: " . $currentLastTransferId);
            } else {
                // لا توجد انتقالات على الإطلاق في قاعدة البيانات
                error_log("[SSE Transfers] Connection opened. No last_id. No transfers in DB. Starting from 0.");
                $currentLastTransferId = 0; // سيبدأ البحث من بعد 0
            }
        } catch (PDOException $e) {
            error_log("[SSE Transfers] DB Error priming latest ID: " . $e->getMessage());
            // لا يمكن المتابعة بأمان، أغلق الاتصال
            exit; 
        }
    } else {
         error_log("[SSE Transfers] Connection opened. Starting check from ID: " . ($currentLastTransferId ?? 'N/A'));
    }
    // ★★★ نهاية التعديل ★★★

    while (true) {
        if (connection_aborted()) {
             error_log("[SSE Transfers] Connection aborted by client.");
             break;
        }

        // 1. فحص الانتقالات الجديدة
        // الآن $currentLastTransferId لن يكون null أبداً هنا
        $newTransfers = getNewTransfers($db, $currentLastTransferId);

        if ($newTransfers) {
            // تحديث آخر ID بناءً على أعلى ID تم جلبه
            $highestId = $currentLastTransferId; // ابدأ من الـ ID الحالي
            foreach ($newTransfers as $transfer) {
                if (isset($transfer['transfer_id']) && $transfer['transfer_id'] > $highestId) {
                    $highestId = $transfer['transfer_id'];
                }
            }
             $currentLastTransferId = $highestId; // تحديث للتحقق التالي

            // إرسال البيانات كحدث مخصص (مثلاً: new_transfers)
            echo "event: new_transfers\n";
            // إرسال آخر ID تم جلبه ليستخدمه العميل في الطلب التالي إذا انقطع الاتصال
            echo "id: " . $currentLastTransferId . "\n";
            echo "data: " . json_encode($newTransfers, $json_options_sse) . "\n\n"; // استخدم خيارات SSE

            error_log("[SSE Transfers] Sent " . count($newTransfers) . " new transfers. Last ID sent: " . $currentLastTransferId);

            // إرسال فوري
            if (ob_get_level() > 0) @ob_flush(); @flush();
        } else {
            // لا توجد انتقالات جديدة، أرسل keep-alive
            echo ": keep-alive\n\n";
            if (ob_get_level() > 0) @ob_flush(); @flush();
        }

        // 2. الانتظار قبل الفحص التالي
        sleep($pollingInterval);

    } // نهاية while
    exit; // إنهاء السكربت عند إغلاق الاتصال
}

// [ملف: leagues_api.php]

// --- ★★★ نقطة النهاية الصحيحة: جلب آخر الانتقالات (مع ترقيم الصفحات) ★★★ ---
elseif ($action === 'get_transfers') {
    // 1. تحديد قيم افتراضية لترقيم الصفحات
    $page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
    // 2. قراءة الحد (limit) القادم من الجافاسكربت (سيكون 10)
    $limit = isset($_GET['limit']) ? (int)$_GET['limit'] : 20; // الافتراضي 20 إذا لم يرسل

    // التأكد من أن القيم موجبة
    if ($page < 1) { $page = 1; }
    if ($limit < 1) { $limit = 10; } // احتياطي

    // 3. حساب الإزاحة (offset)
    $offset = ($page - 1) * $limit;

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

        // الاستعلام لجلب العدد الإجمالي للانتقالات (لترقيم الصفحات)
        $countStmt = $db->query("SELECT COUNT(*) FROM {$transfersTable}");
        $totalTransfers = $countStmt->fetchColumn();
        $totalPages = ceil($totalTransfers / $limit);

        // 4. الاستعلام لجلب الانتقالات باستخدام LIMIT و OFFSET
        $stmt = $db->prepare("
            SELECT
                transfer_id, transfer_date, player_name, player_image_url,
                from_team_name, from_team_image_url,
                to_team_name, to_team_image_url, transfer_details,
                scraped_at
            FROM {$transfersTable}
            ORDER BY transfer_date DESC, transfer_id ASC 
            LIMIT :limit OFFSET :offset -- ★★★ هذا السطر يضمن 10 فقط ★★★
        ");

        // 5. ربط المتغيرات كأعداد صحيحة
        $stmt->bindParam(':limit', $limit, PDO::PARAM_INT);
        $stmt->bindParam(':offset', $offset, PDO::PARAM_INT);
        $stmt->execute();
        $transfers = $stmt->fetchAll();

        // 6. تجهيز بيانات الاستجابة (ستحتوي على 10 فقط)
        $responseData = [
            'pagination' => [
                'current_page' => $page,
                'per_page' => $limit,
                'total_pages' => (int)$totalPages,
                'total_transfers' => (int)$totalTransfers
            ],
            'transfers' => $transfers
        ];

        // إرجاع البيانات بتنسيق JSON
        echo json_encode(['success' => true, 'data' => $responseData], $json_options_api);
        exit;

    } catch (PDOException $e) {
        error_log("API Error fetching transfers: " . $e->getMessage());
        http_response_code(500);
        echo json_encode(['success' => false, 'message' => 'فشل جلب بيانات الانتقالات.'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
        exit;
    }
}

// --- إذا لم يتم تحديد action صالح ---
http_response_code(404);
echo json_encode(['success' => false, 'message' => 'نقطة نهاية API غير صالحة أو ينقصها parameters.'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); exit;

?>