<?php
/**
 * POST /api/send-session.php
 *
 * Trimite la eMAG titlurile dintr-o sesiune. Body:
 *   session_id = N
 *   limit      = N (opțional, default 10) — câți itemi procesează la acest call
 *
 * Trimite UN item pe call la eMAG (pentru a vedea statusul granular per item).
 * Throttle 400ms între request-uri pentru a sta sub 3 req/sec.
 *
 * Pentru sesiuni mari, frontend-ul re-apelează acest endpoint cu același session_id
 * până când response.has_more === false (similar cu sync-ul).
 *
 * Returnează: stats per call + has_more + remaining
 */
require_once __DIR__ . '/../includes/db.php';
require_once __DIR__ . '/../includes/emag-api.php';
require_once __DIR__ . '/../includes/template-engine.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);
}

$sessionId = (int)($_POST['session_id'] ?? 0);
$limit     = max(1, min(50, (int)($_POST['limit'] ?? 10)));

if ($sessionId <= 0) {
    json_response(['ok' => false, 'error' => 'session_id invalid'], 422);
}

// Încarcă sesiunea
$sessRows = db_select("SELECT * FROM title_sessions WHERE id = ?", [$sessionId]);
if (!$sessRows) {
    json_response(['ok' => false, 'error' => 'Sesiune inexistentă'], 404);
}
$session = $sessRows[0];

// Marchez sesiunea ca sending la primul item în pending
if ($session['status'] === 'draft' || $session['status'] === 'queued') {
    db_exec("UPDATE title_sessions SET status = 'sending' WHERE id = ?", [$sessionId]);
}

// Pentru a determina contul eMAG, iau primul item și produsul lui (toate item-urile
// se presupun a fi pe același cont — în mod normal asta e cazul)
$accountRow = db_select(
    "SELECT DISTINCT p.emag_account_id
     FROM title_session_items i
     LEFT JOIN products p ON p.id = i.product_id
     WHERE i.session_id = ? AND p.emag_account_id IS NOT NULL
     LIMIT 1",
    [$sessionId]
);
if (!$accountRow) {
    json_response(['ok' => false, 'error' => 'Nu s-a găsit un cont eMAG pentru produsele din sesiune'], 400);
}
$accountId = (int)$accountRow[0]['emag_account_id'];
$account = db_select("SELECT * FROM emag_accounts WHERE id = ? AND is_active = 1", [$accountId]);
if (!$account) {
    json_response(['ok' => false, 'error' => 'Contul eMAG nu este activ sau a fost șters'], 400);
}
$account = $account[0];

// Filtru opțional: trimite doar item-ele specificate (pentru single-item send din UI)
// Când item_ids[] sunt furnizate explicit, IGNOR filtrul de status — permitem re-send
// pe success/failed pentru retest sau corectare după update titlu pe eMAG.
$itemIdsFilter = '';
$itemIdsParams = [];
$hasExplicitItemIds = false;
$itemIds = $_POST['item_ids'] ?? null;
if (is_array($itemIds) && $itemIds) {
    $itemIds = array_values(array_filter(array_map('intval', $itemIds), fn($v) => $v > 0));
    if ($itemIds) {
        $ph = implode(',', array_fill(0, count($itemIds), '?'));
        $itemIdsFilter = " AND id IN ($ph)";
        $itemIdsParams = $itemIds;
        $hasExplicitItemIds = true;
    }
}

// Status filter:
//   - Bulk (fără item_ids) = DOAR 'pending'. Asta evită bug-ul „processed > total":
//     itemii marcați 'failed' într-o iterație nu mai sunt re-selectați în iterația
//     următoare (s-ar fi procesat de mai multe ori). Retry-ul pentru failed se face
//     individual via butonul per item (sau prin editare titlu care resetează la pending).
//   - Explicit (item_ids[]) = orice status — permite re-send pe success/failed.
$statusFilter = $hasExplicitItemIds ? '' : " AND sent_status = 'pending'";

// Itemi care încă trebuie trimiși
$items = db_select(
    "SELECT * FROM title_session_items
     WHERE session_id = ?
       AND new_title != ''
       $statusFilter
       $itemIdsFilter
     ORDER BY id ASC
     LIMIT ?",
    array_merge([$sessionId], $itemIdsParams, [$limit])
);

$totalRemaining = (int)db_scalar(
    "SELECT COUNT(*) FROM title_session_items
     WHERE session_id = ?
       AND new_title != ''
       $statusFilter
       $itemIdsFilter",
    array_merge([$sessionId], $itemIdsParams)
);

if (!$items) {
    // Nu mai sunt itemi de trimis — finalizez sesiunea
    finalizeSession($sessionId);
    json_response([
        'ok' => true,
        'processed' => 0,
        'success' => 0,
        'failed' => 0,
        'has_more' => false,
        'remaining' => 0,
        'message' => 'Sesiune finalizată — nu mai sunt itemi de procesat',
    ]);
}

$api = new EmagAPI($account['username'], $account['password'], $account['platform'] ?? 'ro');
$results = [];
$stats = ['success' => 0, 'failed' => 0];

foreach ($items as $idx => $item) {
    // Throttle: după primul item, sleep 400ms (~2.5 req/sec, sub limita de 3)
    if ($idx > 0) usleep(400000);

    // Marchez ca sending
    db_exec("UPDATE title_session_items SET sent_status = 'sending' WHERE id = ?", [$item['id']]);

    // Skip dacă lipsește emag_id (nu putem identifica produsul pe eMAG)
    if (empty($item['emag_id'])) {
        db_exec(
            "UPDATE title_session_items SET sent_status = 'failed', error_message = ?, sent_at = CURRENT_TIMESTAMP WHERE id = ?",
            ['Lipsește emag_id — produsul nu poate fi identificat pe eMAG.', $item['id']]
        );
        $stats['failed']++;
        $results[] = ['id' => $item['id'], 'ok' => false, 'error' => 'Lipsește emag_id'];
        continue;
    }

    // Validare lungime nume (eMAG limit 255)
    $nameLen = mb_strlen($item['new_title']);
    if ($nameLen > EMAG_NAME_MAX_LENGTH) {
        $msg = sprintf('Numele depășește %d caractere (%d). Scurtează-l înainte de trimitere.', EMAG_NAME_MAX_LENGTH, $nameLen);
        db_exec(
            "UPDATE title_session_items SET sent_status = 'failed', error_message = ?, sent_at = CURRENT_TIMESTAMP WHERE id = ?",
            [$msg, $item['id']]
        );
        $stats['failed']++;
        $results[] = ['id' => $item['id'], 'ok' => false, 'error' => $msg];
        continue;
    }

    $payload = [
        'id'          => (int)$item['emag_id'],
        'name'        => $item['new_title'],
        'part_number' => $item['part_number'],
    ];

    $res = $api->updateProductName($payload);
    if ($res['ok']) {
        db_exec(
            "UPDATE title_session_items SET sent_status = 'success', sent_at = CURRENT_TIMESTAMP, error_message = NULL WHERE id = ?",
            [$item['id']]
        );
        // Actualizez și produsul: numele nou devine product_name (sync-area cu eMAG)
        if (!empty($item['product_id'])) {
            db_exec("UPDATE products SET product_name = ? WHERE id = ?", [$item['new_title'], $item['product_id']]);
        }
        $stats['success']++;
        $results[] = ['id' => $item['id'], 'ok' => true];
    } else {
        db_exec(
            "UPDATE title_session_items SET sent_status = 'failed', error_message = ?, sent_at = CURRENT_TIMESTAMP WHERE id = ?",
            [$res['message'], $item['id']]
        );
        $stats['failed']++;
        $results[] = ['id' => $item['id'], 'ok' => false, 'error' => $res['message']];
    }
}

$remainingAfter = $totalRemaining - count($items);
$hasMore = $remainingAfter > 0;

if (!$hasMore) {
    finalizeSession($sessionId);
}

json_response([
    'ok'        => true,
    'processed' => count($items),
    'success'   => $stats['success'],
    'failed'    => $stats['failed'],
    'has_more'  => $hasMore,
    'remaining' => $remainingAfter,
    'results'   => $results,
]);


function finalizeSession(int $sessionId): void
{
    $status = calculate_session_status($sessionId);
    db_exec("UPDATE title_sessions SET status = ?, sent_at = CURRENT_TIMESTAMP WHERE id = ?", [$status, $sessionId]);
}
