<?php
/**
 * POST /api/save-reception.php
 *
 * Salvează metadata unei sesiuni de recepție FBE (creare sau editare).
 * Lista de produse se gestionează separat, item cu item, prin
 * /api/reception-item.php (autosave), ca fiecare sesiune să aibă propriile
 * cantități.
 *
 * Body:
 *   - id               (opțional — dacă > 0, actualizează sesiunea existentă)
 *   - name             (obligatoriu)
 *   - reception_number (opțional — nr. recepție)
 *   - account_id       (opțional — contextul de cont)
 *   - items            (OPȚIONAL, JSON: [{ean, qty, product_id, product_name}, ...])
 *                      Dacă e trimis, ÎNLOCUIEȘTE lista sesiunii. Dacă lipsește,
 *                      lista rămâne neatinsă. Se acceptă și listă goală
 *                      (sesiune nouă, fără produse încă).
 */
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);
}

$id        = (int)($_POST['id'] ?? 0);
$name      = trim((string)($_POST['name'] ?? ''));
$recNumber = trim((string)($_POST['reception_number'] ?? '')) ?: null;
$accountId = (int)($_POST['account_id'] ?? 0) ?: null;
$hasItems  = array_key_exists('items', $_POST);
$itemsRaw  = $_POST['items'] ?? '';

if ($name === '') {
    json_response(['ok' => false, 'error' => 'Numele sesiunii este obligatoriu.'], 422);
}

$items = [];
if ($hasItems) {
    $decoded = json_decode((string)$itemsRaw, true);
    if (!is_array($decoded)) {
        json_response(['ok' => false, 'error' => 'Lista de produse e invalidă.'], 422);
    }
    $items = $decoded;
}

try {
    $pdo = db();
    $pdo->beginTransaction();

    if ($id > 0) {
        $exists = db_scalar("SELECT 1 FROM fbe_receptions WHERE id = ?", [$id]);
        if (!$exists) {
            $pdo->rollBack();
            json_response(['ok' => false, 'error' => 'Sesiune inexistentă'], 404);
        }
        db_exec("UPDATE fbe_receptions SET name = ?, reception_number = ?, emag_account_id = ? WHERE id = ?",
            [$name, $recNumber, $accountId, $id]);
        $savedId = $id;
    } else {
        $savedId = db_exec("INSERT INTO fbe_receptions (name, reception_number, emag_account_id) VALUES (?, ?, ?)",
            [$name, $recNumber, $accountId]);
    }

    // Lista se rescrie doar dacă a fost trimisă explicit.
    if ($hasItems) {
        db_exec("DELETE FROM fbe_reception_items WHERE reception_id = ?", [$savedId]);
        $stmt = $pdo->prepare(
            "INSERT INTO fbe_reception_items (reception_id, position, ean, qty, product_id, product_name)
             VALUES (?, ?, ?, ?, ?, ?)"
        );
        foreach ($items as $i => $it) {
            $ean = trim((string)($it['ean'] ?? ''));
            if ($ean === '') continue;
            $qtyVal = $it['qty'] ?? null;
            $qty = ($qtyVal === null || $qtyVal === '') ? null : (int)$qtyVal;
            $pid = (int)($it['product_id'] ?? 0) ?: null;
            $pname = isset($it['product_name']) ? (string)$it['product_name'] : null;
            $stmt->execute([$savedId, $i, $ean, $qty, $pid, $pname]);
        }
    }

    $pdo->commit();
} catch (Throwable $ex) {
    if (db()->inTransaction()) db()->rollBack();
    error_log('[save-reception] ' . $ex->getMessage());
    json_response(['ok' => false, 'error' => 'Eroare DB: ' . $ex->getMessage()], 500);
}

// Returnează sesiunea salvată cu items, ca UI-ul să o adauge fără reload.
json_response(['ok' => true, 'session' => reception_with_items($savedId)]);
