<?php
/**
 * POST /api/reviews-sync.php
 *
 * Extrage recenziile (rating + nr.) de pe paginile PUBLICE eMAG, în loturi mici,
 * cu throttling. Frontend-ul (products.php) re-apelează endpointul până când
 * has_more === false (la fel ca sync-ul / send-session).
 *
 * NU folosește API-ul eMAG — citește pagina publică a produsului. Vezi
 * includes/emag-reviews.php pentru limitări (fragil, 1 request/produs).
 *
 * Body:
 *   run_start = 'Y-m-d H:i:s' (UTC) — opțional la primul call; serverul îl
 *               generează și îl întoarce, iar frontend-ul îl trimite înapoi
 *               la call-urile următoare (ca să nu reprocesăm același produs).
 *   limit     = câte PNK-uri procesează acest call (default 3, max 8)
 *
 * Deduplicare după PNK: recenziile sunt la nivel de produs de catalog, deci
 * un singur fetch actualizează toate conturile cu același PNK.
 */
require_once __DIR__ . '/../includes/db.php';
require_once __DIR__ . '/../includes/emag-reviews.php';

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    json_response(['ok' => false, 'error' => 'Doar POST'], 405);
}
if (!csrf_check($_POST['csrf_token'] ?? null)) {
    json_response(['ok' => false, 'error' => 'CSRF invalid'], 403);
}

$limit = max(1, min(8, (int)($_POST['limit'] ?? 3)));

// run_start: fix pe durata unei rulări. Format SQLite-comparabil (UTC).
$runStart = (string)($_POST['run_start'] ?? '');
if (!preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', $runStart)) {
    $runStart = gmdate('Y-m-d H:i:s');
}

// Condiția „mai trebuie verificat" (PNK needuit în această rulare)
$needSql = "pnk IS NOT NULL AND TRIM(pnk) != '' AND (reviews_checked_at IS NULL OR reviews_checked_at < ?)";

// Total rămas (distinct PNK) ÎNAINTE de acest lot — pentru estimare în UI
$totalRemaining = (int)db_scalar(
    "SELECT COUNT(*) FROM (SELECT pnk FROM products WHERE $needSql GROUP BY pnk)",
    [$runStart]
);

// Lotul curent: PNK-uri distincte + un nume reprezentativ (pentru slug-ul URL)
$batch = db_select(
    "SELECT pnk, product_name
     FROM products
     WHERE $needSql
     GROUP BY pnk
     ORDER BY (reviews_checked_at IS NOT NULL) ASC, MIN(id) ASC
     LIMIT ?",
    [$runStart, $limit]
);

$stats   = ['updated' => 0, 'with_reviews' => 0, 'failed' => 0];
$results = [];

foreach ($batch as $i => $row) {
    if ($i > 0) usleep(1500000); // throttle: ~1.5s între produse (anti-blocare)

    $pnk  = (string)$row['pnk'];
    $name = $row['product_name'] ?? null;

    $r = emag_fetch_reviews($pnk, $name);

    if ($r['ok']) {
        db_exec(
            "UPDATE products
             SET emag_reviews_count = ?, emag_rating = ?, reviews_checked_at = CURRENT_TIMESTAMP
             WHERE pnk = ?",
            [$r['count'], $r['rating'], $pnk]
        );
        $stats['updated']++;
        if ((int)$r['count'] > 0) $stats['with_reviews']++;
        $results[] = ['pnk' => $pnk, 'ok' => true, 'count' => $r['count'], 'rating' => $r['rating']];
    } else {
        // Avansăm timestamp-ul ca să nu blocăm rularea, dar NU ștergem valorile vechi.
        db_exec("UPDATE products SET reviews_checked_at = CURRENT_TIMESTAMP WHERE pnk = ?", [$pnk]);
        $stats['failed']++;
        $results[] = ['pnk' => $pnk, 'ok' => false, 'error' => $r['error'], 'http' => $r['http']];
    }
}

$processed      = count($batch);
$remainingAfter = max(0, $totalRemaining - $processed);
$hasMore        = $remainingAfter > 0 && $processed > 0;

json_response([
    'ok'        => true,
    'run_start' => $runStart,
    'processed' => $processed,
    'stats'     => $stats,
    'results'   => $results,
    'remaining' => $remainingAfter,
    'has_more'  => $hasMore,
]);
