<?php
/**
 * POST /api/set-primary.php
 *
 * Setează rolul în comparație pentru un grup de produse comparate:
 *   - produsul ales (primary_id) devine 'principal'
 *   - celelalte produse din grup (ids[]) devin 'secundar'
 *   - primary_id <= 0  → toate produsele implicate revin la NULL (resetare)
 *
 * PROPAGARE pe modelul principal de telefon (phone_series_id):
 *   Variantele aceluiași model (ex: „1 buc" și „2 buc", care au același
 *   phone_series_id) primesc ACELAȘI rol. Astfel, când marchezi favoritul la
 *   varianta cu 1 buc, varianta cu 2 buc (același model) devine și ea favorită.
 *   Produsele fără model de telefon afectează doar propriul rând.
 *
 * Body:
 *   - primary_id (id-ul produsului principal; 0/gol = resetare)  — MANDATORY
 *   - ids[]      (toate id-urile din comparație)                 — MANDATORY
 *
 * Răspuns: include `affected` = [{id, role}] pentru ca UI-ul să se sincronizeze.
 */
require_once __DIR__ . '/../includes/db.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);
}

$primaryId = (int)($_POST['primary_id'] ?? 0);
$ids       = $_POST['ids'] ?? [];
if (!is_array($ids)) $ids = [];
$ids = array_values(array_filter(array_map('intval', $ids), fn($v) => $v > 0));

if (!$ids) {
    json_response(['ok' => false, 'error' => 'Lista de produse (ids) lipsește'], 422);
}
if ($primaryId > 0 && !in_array($primaryId, $ids, true)) {
    json_response(['ok' => false, 'error' => 'primary_id nu este în grupul comparat'], 422);
}

/** Toate id-urile produselor care au un anumit phone_series_id (modelul principal). */
function ids_for_series(int $seriesId): array
{
    if ($seriesId <= 0) return [];
    return array_map('intval', array_column(
        db_select("SELECT id FROM products WHERE phone_series_id = ?", [$seriesId]),
        'id'
    ));
}

// phone_series_id pentru fiecare produs comparat
$ph = implode(',', array_fill(0, count($ids), '?'));
$seriesById = [];
foreach (db_select("SELECT id, phone_series_id FROM products WHERE id IN ($ph)", $ids) as $r) {
    $seriesById[(int)$r['id']] = $r['phone_series_id'] !== null ? (int)$r['phone_series_id'] : 0;
}

// Construiește harta id → rol (propagând pe model). Principalul are prioritate.
$roleById = [];

if ($primaryId <= 0) {
    // Resetare: toate produsele implicate (comparate + variantele lor de model) → NULL
    $targets = $ids;
    foreach ($ids as $id) {
        foreach (ids_for_series($seriesById[$id] ?? 0) as $sid) $targets[] = $sid;
    }
    foreach (array_unique($targets) as $id) $roleById[$id] = null;
} else {
    $pSeries = $seriesById[$primaryId] ?? 0;

    // Grupul PRINCIPAL: produsul + toate variantele aceluiași model
    $principalIds = $pSeries > 0 ? ids_for_series($pSeries) : [$primaryId];
    if (!in_array($primaryId, $principalIds, true)) $principalIds[] = $primaryId;
    foreach ($principalIds as $id) $roleById[$id] = 'principal';

    // Grupurile SECUNDARE: celelalte produse comparate + variantele lor de model,
    // dar fără a suprascrie principalul (dacă împart același model).
    foreach ($ids as $id) {
        if ($id === $primaryId) continue;
        $qSeries = $seriesById[$id] ?? 0;
        if ($qSeries > 0 && $qSeries === $pSeries) continue; // același model ca principalul → rămâne principal
        $secIds = $qSeries > 0 ? ids_for_series($qSeries) : [$id];
        if (!in_array($id, $secIds, true)) $secIds[] = $id;
        foreach ($secIds as $sid) {
            if (!isset($roleById[$sid])) $roleById[$sid] = 'secundar';
        }
    }
}

$pdo = db();
$pdo->beginTransaction();
try {
    foreach ($roleById as $id => $role) {
        db_exec("UPDATE products SET compare_role = ? WHERE id = ?", [$role, $id]);
    }
    $pdo->commit();
} catch (Throwable $e) {
    $pdo->rollBack();
    error_log('[set-primary] ' . $e->getMessage());
    json_response(['ok' => false, 'error' => $e->getMessage()], 500);
}

$affected = [];
foreach ($roleById as $id => $role) {
    $affected[] = ['id' => (int)$id, 'role' => $role];
}

json_response(['ok' => true, 'primary_id' => $primaryId, 'affected' => $affected]);
