<?php
/**
 * POST /api/reorder-goods.php
 *
 * Mută o marfă pe altă poziție în catalog.
 * Body: id, to (poziția-țintă, 1-based), q (filtrul de căutare activ, opțional)
 *
 * `to` e poziția din lista pe care o vede utilizatorul. Dacă e activ un filtru,
 * poziția e relativă la rezultatele filtrate — o traducem în lista completă
 * folosind rândul care ocupă acum poziția-țintă, ca mutarea să fie corectă
 * chiar dacă între rândurile vizibile există altele ascunse de filtru.
 */
require_once __DIR__ . '/../includes/orders.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);
$to     = (int)($_POST['to'] ?? 0);
$search = trim((string)($_POST['q'] ?? ''));

if ($id <= 0) {
    json_response(['ok' => false, 'error' => 'ID lipsă.'], 422);
}
if ($to < 1) {
    json_response(['ok' => false, 'error' => 'Poziția trebuie să fie ≥ 1.'], 422);
}

$order = 'ORDER BY position, name COLLATE NOCASE, id';

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

    // Lista completă, în ordinea curentă.
    $all = $pdo->query("SELECT id FROM goods $order")->fetchAll(PDO::FETCH_COLUMN);
    $all = array_map('intval', $all);

    $from = array_search($id, $all, true);
    if ($from === false) {
        $pdo->rollBack();
        json_response(['ok' => false, 'error' => 'Marfa nu mai există.'], 404);
    }

    // Poziția-țintă în lista completă.
    if ($search === '') {
        $targetIdx = min($to, count($all)) - 1;
    } else {
        $q    = '%' . $search . '%';
        $stmt = $pdo->prepare(
            "SELECT id FROM goods WHERE (name LIKE ? OR sku LIKE ? OR supplier LIKE ?) $order"
        );
        $stmt->execute([$q, $q, $q]);
        $filtered = array_map('intval', $stmt->fetchAll(PDO::FETCH_COLUMN));

        if (!$filtered) {
            $pdo->rollBack();
            json_response(['ok' => false, 'error' => 'Lista filtrată e goală.'], 422);
        }

        $targetId  = $filtered[min($to, count($filtered)) - 1];
        $targetIdx = array_search($targetId, $all, true);
        if ($targetIdx === false) $targetIdx = $from;
    }

    // Scoatem rândul și îl reinserăm relativ la rândul-țintă: mutat în jos ajunge
    // imediat DUPĂ el, mutat în sus imediat ÎNAINTEA lui. După scoatere ambele
    // cazuri dau același index: în jos (targetIdx-1)+1, în sus targetIdx.
    array_splice($all, $from, 1);
    $insert = max(0, min($targetIdx, count($all)));
    array_splice($all, $insert, 0, [$id]);

    $upd = $pdo->prepare("UPDATE goods SET position = ? WHERE id = ?");
    foreach ($all as $i => $gid) {
        $upd->execute([$i + 1, $gid]);
    }

    $pdo->commit();
    json_response(['ok' => true, 'position' => $insert + 1, 'total' => count($all)]);
} catch (Throwable $ex) {
    if (isset($pdo) && $pdo->inTransaction()) $pdo->rollBack();
    error_log('[reorder-goods] ' . $ex->getMessage());
    json_response(['ok' => false, 'error' => $ex->getMessage()], 500);
}
