<?php
/**
 * Extragere recenzii eMAG din pagina PUBLICĂ a produsului.
 *
 * IMPORTANT: numărul de recenzii + ratingul NU vin din Marketplace API. Sunt
 * citite din pagina publică (JSON-LD „aggregateRating"). Asta înseamnă:
 *   - fragil (dacă eMAG schimbă pagina, se strică),
 *   - o cerere HTTP per produs (fără batch),
 *   - de folosit cu throttling, ca să nu fie blocat IP-ul.
 *
 * URL produs: https://www.emag.ro/<slug-nume>/pd/<PNK>
 * (slug-ul e cosmetic — eMAG rezolvă produsul după PNK din /pd/.)
 */

/** Slug eMAG din numele produsului: minuscule, fără diacritice, „-" între cuvinte. */
function emag_review_slug(?string $name): string
{
    $s = (string)$name;
    // normalizează diacriticele → ASCII
    if (function_exists('iconv')) {
        $conv = @iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $s);
        if ($conv !== false) $s = $conv;
    }
    $s = strtolower($s);
    $s = preg_replace('/[^a-z0-9]+/', '-', $s);
    $s = trim($s, '-');
    return $s !== '' ? $s : 'produs';
}

/** URL-ul paginii publice eMAG pentru un produs. */
function emag_product_url(?string $name, string $pnk): string
{
    return 'https://www.emag.ro/' . emag_review_slug($name) . '/pd/' . rawurlencode($pnk);
}

/**
 * Citește recenziile pentru un produs (după PNK).
 *
 * @return array{ok:bool, count:?int, rating:?float, http:int, error:?string}
 *   - ok=true + count=0 → pagina s-a încărcat dar produsul nu are recenzii
 *   - ok=false → eroare rețea / pagină indisponibilă (NU suprascrie valorile vechi)
 */
function emag_fetch_reviews(string $pnk, ?string $name = null, int $timeout = 20): array
{
    $url = emag_product_url($name, $pnk);

    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_TIMEOUT        => $timeout,
        CURLOPT_CONNECTTIMEOUT => 10,
        CURLOPT_SSL_VERIFYPEER => true,
        CURLOPT_SSL_VERIFYHOST => 2,
        CURLOPT_ENCODING       => '', // acceptă gzip
        CURLOPT_HTTPHEADER     => [
            'Accept: text/html,application/xhtml+xml',
            'Accept-Language: ro-RO,ro;q=0.9',
        ],
        CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
    ]);
    $html = curl_exec($ch);
    $err  = curl_error($ch);
    $code = (int)curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($html === false) {
        return ['ok' => false, 'count' => null, 'rating' => null, 'http' => $code, 'error' => 'cURL: ' . ($err ?: 'unknown')];
    }
    if ($code !== 200) {
        return ['ok' => false, 'count' => null, 'rating' => null, 'http' => $code, 'error' => "HTTP $code"];
    }

    // JSON-LD aggregateRating: extragem reviewCount + ratingValue din fereastra
    // imediat după „aggregateRating" (sunt și ratinguri individuale pe pagină —
    // pe acelea le ignorăm fixându-ne pe blocul agregat).
    $count = null; $rating = null;
    if (preg_match('/aggregateRating.{0,500}/is', $html, $m)) {
        $blk = $m[0];
        if (preg_match('/"reviewCount"\s*:\s*"?(\d+)/i', $blk, $c)) $count = (int)$c[1];
        if (preg_match('/"ratingValue"\s*:\s*"?([0-9]+(?:[.,][0-9]+)?)/i', $blk, $r)) {
            $rating = (float)str_replace(',', '.', $r[1]);
        }
    }
    // Pagina s-a încărcat, dar fără bloc agregat → produs fără recenzii.
    if ($count === null) $count = 0;

    return ['ok' => true, 'count' => $count, 'rating' => $rating, 'http' => 200, 'error' => null];
}
