<?php
/**
 * POST /api/validation-check.php
 *
 * Extrage de pe eMAG produsele aflate într-un anumit status de validare a
 * documentației (`validation_status`), folosind FILTRUL nativ din
 * product_offer/read — deci NU parcurgem tot catalogul, ci doar produsele
 * care chiar sunt în statusul cerut.
 *
 * Cazul principal: după ce editezi descrierea unui produs deja aprobat, eMAG îl
 * mută în validation_status = 11 („Actualizare în validare"). 12 = „Actualizare
 * respinsă".
 *
 * Acțiuni:
 *   action=reset — șterge statusurile salvate anterior pentru contul dat, doar
 *       pentru valorile pe care urmează să le re-verificăm. Fără asta, un produs
 *       care între timp a fost aprobat (11 → 9) ar rămâne veșnic „în validare"
 *       în DB, pentru că nu mai apare în răspunsul filtrat.
 *       Body: account_id, statuses (CSV, ex: "11,12")
 *
 *   action=page  — citește O pagină filtrată și o salvează în products.
 *       Body: account_id, status (int), page (1..N)
 *       Răspuns: rows[] (pentru afișare) + has_more + next_page.
 *
 * Frontend-ul (validare.php) apelează reset o dată, apoi page în buclă pentru
 * fiecare status selectat, până când has_more devine false.
 */
require_once __DIR__ . '/../includes/db.php';
require_once __DIR__ . '/../includes/emag-api.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);
}

$action    = $_POST['action'] ?? 'page';
$accountId = (int)($_POST['account_id'] ?? 0);
if ($accountId <= 0) {
    json_response(['ok' => false, 'error' => 'account_id lipsește'], 422);
}

$accountRows = db_select("SELECT * FROM emag_accounts WHERE id = ? AND is_active = 1", [$accountId]);
if (!$accountRows) {
    json_response(['ok' => false, 'error' => 'Cont inexistent sau inactiv'], 404);
}
$account = $accountRows[0];

/** Filtrează o listă CSV de statusuri, păstrând doar valorile cunoscute. */
function vc_parse_statuses(string $csv): array
{
    $out = [];
    foreach (explode(',', $csv) as $s) {
        $s = trim($s);
        if ($s === '' || !is_numeric($s)) continue;
        $v = (int)$s;
        if (array_key_exists($v, EmagAPI::VALIDATION_STATUSES)) $out[$v] = $v;
    }
    return array_values($out);
}

// ============================================================
// ACTION: reset — invalidează snapshot-ul anterior pentru statusurile re-verificate
// ============================================================
if ($action === 'reset') {
    $statuses = vc_parse_statuses((string)($_POST['statuses'] ?? ''));
    if (!$statuses) {
        json_response(['ok' => false, 'error' => 'Niciun status valid de verificat'], 422);
    }
    try {
        $ph = implode(',', array_fill(0, count($statuses), '?'));
        $cleared = db_exec(
            "UPDATE products
                SET emag_validation_status = NULL,
                    emag_validation_desc   = NULL,
                    emag_validation_errors = NULL,
                    emag_validation_all    = NULL
              WHERE emag_account_id = ?
                AND emag_validation_status IN ($ph)",
            array_merge([$accountId], $statuses)
        );
        json_response(['ok' => true, 'cleared' => $cleared]);
    } catch (Throwable $e) {
        error_log('[validation/reset] ' . $e->getMessage());
        json_response(['ok' => false, 'error' => $e->getMessage()], 500);
    }
}

// ============================================================
// ACTION: page (default)
// ============================================================
$status = (int)($_POST['status'] ?? EmagAPI::VALIDATION_UPDATE_PENDING);
if (!array_key_exists($status, EmagAPI::VALIDATION_STATUSES)) {
    json_response(['ok' => false, 'error' => "validation_status necunoscut: $status"], 422);
}
$page    = max(1, (int)($_POST['page'] ?? 1));
$perPage = EMAG_PAGE_SIZE;

// Rate limit eMAG pe resurse non-orders: 3 req/sec. Pagina 1 pornește instant.
if ($page > 1) {
    usleep(350000);
}

try {
    $api  = new EmagAPI($account['username'], $account['password'], $account['platform'] ?? 'ro');
    $resp = $api->getProductsByValidationStatus($status, $page, $perPage);
} catch (Throwable $e) {
    error_log('[validation/page] ' . $e->getMessage());
    json_response(['ok' => false, 'error' => $e->getMessage()], 502);
}

$rows    = [];
$saved   = 0;
$unknown = 0; // produse întoarse de eMAG dar care nu există (încă) local

foreach ($resp['results'] as $item) {
    $emagId     = isset($item['id']) ? (string)$item['id'] : null;
    $pnk        = $item['part_number_key'] ?? null;
    $eanRaw     = $item['ean'] ?? null;
    $ean        = is_array($eanRaw) ? ($eanRaw[0] ?? null) : ($eanRaw ?: null);
    $name       = trim((string)($item['name'] ?? ''));
    $partNumber = $item['part_number'] ?? null;

    // `validation_status` e o listă și poate conține mai multe statusuri deodată
    // (ex: 3 „EAN validation pending" + 11 „update în validare"). Produsul a fost
    // citit cu filtrul validation_status=$status, deci ACELA e statusul relevant —
    // îl preferăm ca principal; restul le păstrăm ca statusuri secundare.
    $vs      = EmagAPI::parseValidationStatus($item['validation_status'] ?? null, $status);
    $vsValue = $vs['value'] ?? $status;
    $vsDesc  = $vs['description'];
    $vsErr   = $vs['errors'] ? json_encode($vs['errors'], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) : null;
    $vsAll   = $vs['all'] ? implode(',', $vs['all']) : (string)$vsValue;

    // Status ofertă (1 activ / 0 inactiv / 2 EOL) — util ca să vezi dacă produsul
    // e vandabil în timp ce update-ul așteaptă validarea.
    $offerStatus = isset($item['status']) && $item['status'] !== '' ? (int)$item['status'] : null;

    // Match local: emag_id → EAN → PNK (același criteriu ca la sync-ul general)
    $productId = null;
    if ($emagId) {
        $productId = db_scalar(
            "SELECT id FROM products WHERE emag_id = ? AND emag_account_id = ? LIMIT 1",
            [$emagId, $accountId]
        );
    }
    if (!$productId && $ean) {
        $productId = db_scalar(
            "SELECT id FROM products WHERE ean = ? AND emag_account_id = ? LIMIT 1",
            [$ean, $accountId]
        );
    }
    if (!$productId && $pnk) {
        $productId = db_scalar(
            "SELECT id FROM products WHERE pnk = ? AND emag_account_id = ? LIMIT 1",
            [$pnk, $accountId]
        );
    }

    if ($productId) {
        try {
            db_exec(
                "UPDATE products
                    SET emag_validation_status = ?,
                        emag_validation_desc   = ?,
                        emag_validation_errors = ?,
                        emag_validation_all    = ?,
                        validation_checked_at  = CURRENT_TIMESTAMP,
                        pnk                    = COALESCE(pnk, ?),
                        ean                    = COALESCE(ean, ?)
                  WHERE id = ?",
                [$vsValue, $vsDesc, $vsErr, $vsAll, $pnk, $ean, (int)$productId]
            );
            $saved++;
        } catch (Throwable $e) {
            error_log('[validation/save] ' . $e->getMessage());
        }
    } else {
        // Produs prezent pe eMAG dar nesincronizat local (ex: EAN/categorie exclusă).
        // Îl afișăm oricum în tabel — doar că nu îl persistăm.
        $unknown++;
    }

    $rows[] = [
        'product_id'   => $productId ? (int)$productId : null,
        'account_id'   => $accountId,
        'account_name' => $account['account_name'],
        'emag_id'      => $emagId,
        'pnk'          => $pnk,
        'ean'          => $ean,
        'name'         => $name,
        'part_number'  => $partNumber,
        'status'       => $vsValue,
        'status_label' => EmagAPI::validationLabel($vsValue),
        'status_desc'  => $vsDesc,
        'all_statuses' => $vsAll,
        'offer_status' => $offerStatus,
        'errors'       => $vsErr,
        'in_db'        => $productId ? 1 : 0,
    ];
}

$processed = count($resp['results']);
$hasMore   = $processed >= $perPage;

json_response([
    'ok'          => true,
    'status'      => $status,
    'page'        => $page,
    'processed'   => $processed,
    'saved'       => $saved,
    'unknown'     => $unknown,
    'total_known' => $resp['total'],
    'rows'        => $rows,
    'has_more'    => $hasMore,
    'next_page'   => $page + 1,
]);
