<?php
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(200); exit; }

require_once __DIR__ . '/../../config.php';

// ── Verificar token admin ─────────────────────────────────────────────────────
$headers    = getallheaders();
$authHeader = $headers['Authorization'] ?? $headers['authorization'] ?? '';
$token      = str_replace('Bearer ', '', $authHeader);
if (empty($token)) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'Token requerido']);
    exit;
}

$db  = getDB();
$now = date('Y-m-d H:i:s');
$stmtSess = $db->prepare(
    "SELECT s.idusuarios_sist FROM admin_sessions s
     WHERE s.token = ? AND s.expira > ? LIMIT 1"
);
$stmtSess->execute([$token, $now]);
if (!$stmtSess->fetch()) {
    http_response_code(401);
    echo json_encode(['success' => false, 'message' => 'Sesión inválida']);
    exit;
}

// ── Parámetros ────────────────────────────────────────────────────────────────
$desde  = $_GET['desde']  ?? date('Y-m-01');
$hasta  = $_GET['hasta']  ?? date('Y-m-d');
$centro = isset($_GET['centro']) ? (int)$_GET['centro'] : 0;
$prod   = isset($_GET['prod'])   ? (int)$_GET['prod']   : 0;

// ── Construir WHERE dinámico ──────────────────────────────────────────────────
$where  = "cs.fecha BETWEEN ? AND ?";
$params = [$desde, $hasta];

if ($centro > 0) {
    $where   .= " AND cs.centro = ?";
    $params[] = $centro;
}
if ($prod > 0) {
    $where   .= " AND (cs.prod1 = ? OR cs.prod2 = ?)";
    $params[] = $prod;
    $params[] = $prod;
}

// ── Consulta principal ────────────────────────────────────────────────────────
$stmtMov = $db->prepare("
    SELECT
        cs.id_cstock,
        cs.fecha,
        cs.hora,
        cs.centro,
        uc.nombre                  AS nombre_centro,
        cs.cant_mov,
        cs.prod1,
        p1.nombreProd              AS nombre_prod1,
        cs.quitado,
        cs.prod2,
        p2.nombreProd              AS nombre_prod2,
        cs.agregado
    FROM cambiostock cs
    LEFT JOIN usuarios_ci uc ON uc.idusuarios_ci = cs.centro
    LEFT JOIN productos p1   ON p1.id_prod = cs.prod1
    LEFT JOIN productos p2   ON p2.id_prod = cs.prod2
    WHERE {$where}
    ORDER BY cs.fecha DESC, cs.hora DESC
    LIMIT 2000
");
$stmtMov->execute($params);
$movimientos = $stmtMov->fetchAll(PDO::FETCH_ASSOC);

// ── Totales del período ───────────────────────────────────────────────────────
$totalEntradas = 0;
$totalSalidas  = 0;
foreach ($movimientos as &$mov) {
    $mov['cant_mov'] = (int)$mov['cant_mov'];
    $mov['quitado']  = (int)$mov['quitado'];
    $mov['agregado'] = (int)$mov['agregado'];
    if ($mov['cant_mov'] > 0) $totalEntradas += $mov['cant_mov'];
    else $totalSalidas += abs($mov['cant_mov']);
}
unset($mov);

// ── Centros para el filtro ────────────────────────────────────────────────────
$centros = $db->query("
    SELECT idusuarios_ci, nombre FROM usuarios_ci
    WHERE tipo_usuario = 2 ORDER BY idusuarios_ci
")->fetchAll(PDO::FETCH_ASSOC);
array_unshift($centros, ['idusuarios_ci' => 0, 'nombre' => 'Almacén Principal']);

// ── Productos para el filtro ──────────────────────────────────────────────────
$productos = $db->query("
    SELECT id_prod, nombreProd FROM productos WHERE activo = 'SI' ORDER BY nombreProd
")->fetchAll(PDO::FETCH_ASSOC);

echo json_encode([
    'success'     => true,
    'movimientos' => $movimientos,
    'centros'     => $centros,
    'productos'   => $productos,
    'totales' => [
        'registros' => count($movimientos),
        'entradas'  => $totalEntradas,
        'salidas'   => $totalSalidas,
        'neto'      => $totalEntradas - $totalSalidas,
    ],
], JSON_UNESCAPED_UNICODE);
