<?php
/**
 * POST /api/reception-item.php
 *
 * Operații pe lista unei sesiuni de recepție FBE. Fiecare modificare din UI
 * se salvează imediat (autosave) — cantitatea aparține SESIUNII, nu produsului.
 *
 * Body comun: csrf_token, action, reception_id
 *
 *   action=add       → product_id | ean, qty   (dacă produsul e deja în listă,
 *                      cantitatea se ADUNĂ peste cea existentă)
 *   action=add_bulk  → text (linii „EAN" sau „EAN,qty" / „EAN qty")
 *   action=set_qty   → item_id, qty ('' = fără cantitate)
 *   action=delete    → item_id
 *   action=clear     → golește lista sesiunii
 *
 * Răspuns: { ok, session: {...cu items}, item?: {...} }
 */
require_once __DIR__ . '/../includes/db.php';
require_once __DIR__ . '/../includes/receptions.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      = trim((string)($_POST['action'] ?? ''));
$receptionId = (int)($_POST['reception_id'] ?? 0);

if ($receptionId <= 0) {
    json_response(['ok' => false, 'error' => 'Sesiunea nu e salvată încă.'], 422);
}
if (!db_scalar("SELECT 1 FROM fbe_receptions WHERE id = ?", [$receptionId])) {
    json_response(['ok' => false, 'error' => 'Sesiune inexistentă'], 404);
}

/**
 * Adaugă un produs în listă (sau adună peste cantitatea existentă).
 * Returnează id-ul item-ului atins.
 */
function rec_add_one(int $receptionId, ?int $productId, string $ean, ?int $qty): ?int
{
    $product = null;
    if ($productId > 0) {
        $product = db_select("SELECT id, ean, product_name, custom_name FROM products WHERE id = ?", [$productId])[0] ?? null;
    }
    if (!$product && $ean !== '') {
        // Caută după EAN — preferă produsul din contul FBE (acolo ajunge marfa).
        $product = db_select(
            "SELECT p.id, p.ean, p.product_name, p.custom_name
             FROM products p
             LEFT JOIN emag_accounts a ON a.id = p.emag_account_id
             WHERE p.ean = ?
             ORDER BY COALESCE(a.is_fbe, 0) DESC, p.id ASC
             LIMIT 1",
            [$ean]
        )[0] ?? null;
    }
    if ($product) {
        $productId = (int)$product['id'];
        if ($ean === '') $ean = trim((string)($product['ean'] ?? ''));
    } else {
        $productId = null;
    }
    if ($ean === '' && !$productId) return null;

    $name = $product ? (($product['custom_name'] ?? '') !== '' ? $product['custom_name'] : $product['product_name']) : null;

    // Deja în listă? (același produs, sau același EAN dacă n-avem produs legat)
    $existing = $productId
        ? db_select("SELECT id, qty FROM fbe_reception_items WHERE reception_id = ? AND product_id = ? LIMIT 1", [$receptionId, $productId])
        : db_select("SELECT id, qty FROM fbe_reception_items WHERE reception_id = ? AND ean = ? LIMIT 1", [$receptionId, $ean]);

    if ($existing) {
        $itemId = (int)$existing[0]['id'];
        if ($qty !== null) {
            $current = $existing[0]['qty'];
            $newQty  = ($current === null ? 0 : (int)$current) + $qty;
            if ($newQty > 65535) $newQty = 65535;
            db_exec("UPDATE fbe_reception_items SET qty = ? WHERE id = ?", [$newQty, $itemId]);
        }
        return $itemId;
    }

    $pos = reception_next_position($receptionId);
    db_exec(
        "INSERT INTO fbe_reception_items (reception_id, position, ean, qty, product_id, product_name)
         VALUES (?, ?, ?, ?, ?, ?)",
        [$receptionId, $pos, $ean !== '' ? $ean : null, $qty, $productId, $name]
    );
    return (int)db()->lastInsertId();
}

$touchedId = null;

try {
    switch ($action) {

        case 'add': {
            $productId = (int)($_POST['product_id'] ?? 0);
            $ean       = trim((string)($_POST['ean'] ?? ''));
            $qty       = reception_normalize_qty($_POST['qty'] ?? null);
            if ($productId <= 0 && $ean === '') {
                json_response(['ok' => false, 'error' => 'Lipsește produsul sau EAN-ul.'], 422);
            }
            $touchedId = rec_add_one($receptionId, $productId ?: null, $ean, $qty);
            if (!$touchedId) {
                json_response(['ok' => false, 'error' => 'Produsul nu a putut fi identificat.'], 422);
            }
            break;
        }

        case 'add_bulk': {
            $text  = (string)($_POST['text'] ?? '');
            $lines = preg_split('/\r?\n/', $text) ?: [];
            $added = 0;
            $pdo = db();
            $pdo->beginTransaction();
            foreach ($lines as $line) {
                $line = trim($line);
                if ($line === '') continue;
                // „EAN", „EAN,12", „EAN 12", „EAN;12", „EAN<TAB>12"
                $parts = preg_split('/[\s,;]+/', $line);
                $ean   = trim((string)($parts[0] ?? ''));
                $qty   = isset($parts[1]) ? reception_normalize_qty($parts[1]) : null;
                if ($ean === '') continue;
                if (rec_add_one($receptionId, null, $ean, $qty)) $added++;
            }
            $pdo->commit();
            if ($added === 0) {
                json_response(['ok' => false, 'error' => 'Nicio linie validă de adăugat.'], 422);
            }
            break;
        }

        case 'set_qty': {
            $itemId = (int)($_POST['item_id'] ?? 0);
            $qty    = reception_normalize_qty($_POST['qty'] ?? null);
            if ($itemId <= 0) json_response(['ok' => false, 'error' => 'item_id lipsește'], 422);
            $n = db_exec(
                "UPDATE fbe_reception_items SET qty = ? WHERE id = ? AND reception_id = ?",
                [$qty, $itemId, $receptionId]
            );
            if ($n === 0 && !db_scalar("SELECT 1 FROM fbe_reception_items WHERE id = ? AND reception_id = ?", [$itemId, $receptionId])) {
                json_response(['ok' => false, 'error' => 'Rând inexistent'], 404);
            }
            $touchedId = $itemId;
            break;
        }

        case 'delete': {
            $itemId = (int)($_POST['item_id'] ?? 0);
            if ($itemId <= 0) json_response(['ok' => false, 'error' => 'item_id lipsește'], 422);
            db_exec("DELETE FROM fbe_reception_items WHERE id = ? AND reception_id = ?", [$itemId, $receptionId]);
            break;
        }

        case 'clear': {
            db_exec("DELETE FROM fbe_reception_items WHERE reception_id = ?", [$receptionId]);
            break;
        }

        default:
            json_response(['ok' => false, 'error' => 'Acțiune necunoscută'], 422);
    }

    // Atinge sesiunea ca să se actualizeze updated_at.
    db_exec("UPDATE fbe_receptions SET name = name WHERE id = ?", [$receptionId]);
} catch (Throwable $ex) {
    if (db()->inTransaction()) db()->rollBack();
    error_log('[reception-item] ' . $ex->getMessage());
    json_response(['ok' => false, 'error' => 'Eroare DB: ' . $ex->getMessage()], 500);
}

$session = reception_with_items($receptionId);
$item = null;
if ($touchedId) {
    foreach ($session['items'] as $it) {
        if ((int)$it['id'] === (int)$touchedId) { $item = $it; break; }
    }
}

json_response(['ok' => true, 'session' => $session, 'item' => $item]);
