<?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';

// ── Auth ──────────────────────────────────────────────────────────────────────
$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;
$cdentrega  = isset($_GET['cdentrega'])  ? (int)$_GET['cdentrega']  : 0;
$prod       = isset($_GET['prod'])       ? (int)$_GET['prod']       : 0;
$fechaTipo  = (isset($_GET['fecha_tipo']) && $_GET['fecha_tipo'] === 'fechae') ? 'fechae' : 'fechat';

// ── Centros para filtros (tipo 2, 3 + almacenes 8 y 12) ──────────────────────
$centros = $db->query("
    SELECT idusuarios_ci, nombre, tipo_usuario
    FROM usuarios_ci
    WHERE tipo_usuario IN (2, 3)
       OR idusuarios_ci IN (8, 12)
    ORDER BY idusuarios_ci
")->fetchAll(PDO::FETCH_ASSOC);

// Eliminar duplicados
$centrosMap = [];
foreach ($centros as $c) {
    $centrosMap[$c['idusuarios_ci']] = $c;
}
$centros = array_values($centrosMap);

// ── Productos para filtros (activo=SI, tipoprod 1 y 2) ───────────────────────
$productos = $db->query("
    SELECT id_prod, nombreProd, presentacion
    FROM productos
    WHERE activo = 'SI' AND tipoprod IN (1, 2)
    ORDER BY nombreProd
")->fetchAll(PDO::FETCH_ASSOC);

// ── Construir WHERE base ──────────────────────────────────────────────────────
// Para desplazamientos (ventas): tipos 6, 10, 11
// El centro que entrega es t.cdentrega
$where  = "t.tipostr_idtipostr IN (6, 10, 11)
           AND t.{$fechaTipo} BETWEEN ? AND ?";
if ($fechaTipo === 'fechae') {
    $where .= " AND t.statusentrega = 'ENTREGADO'";
}
$params = [$desde . ' 00:00:00', $hasta . ' 23:59:59'];

if ($centro > 0) {
    $where   .= " AND t.usuarios_ci_idusuarios_ci = ?";
    $params[] = $centro;
}
if ($cdentrega > 0) {
    $where   .= " AND t.cdentrega = ?";
    $params[] = $cdentrega;
}
if ($prod > 0) {
    $where   .= " AND p.productos_idprod = ?";
    $params[] = $prod;
}

// ── Consulta principal ────────────────────────────────────────────────────────
$stmtDesp = $db->prepare("
    SELECT
        p.productos_idprod                   AS idprod,
        pr.nombreProd                        AS nombre_prod,
        pr.presentacion,
        pr.tipoprod,
        t.cdentrega                          AS idcd,
        uc.nombre                            AS nombre_centro,
        SUM(p.cant)                          AS unidades,
        COUNT(DISTINCT t.idtransacciones)    AS notas
    FROM transacciones t
    JOIN pedido p     ON p.transacciones_idtransacciones = t.idtransacciones
    JOIN productos pr ON pr.id_prod = p.productos_idprod
    LEFT JOIN usuarios_ci uc ON uc.idusuarios_ci = t.cdentrega
    WHERE {$where}
      AND pr.activo = 'SI'
      AND pr.tipoprod IN (1, 2)
    GROUP BY p.productos_idprod, t.cdentrega
    ORDER BY SUM(p.cant) DESC
");
$stmtDesp->execute($params);
$rows = $stmtDesp->fetchAll(PDO::FETCH_ASSOC);

// ── Construir resumen por producto y por centro ───────────────────────────────
$porProducto = [];
$porCentro   = [];

foreach ($rows as $row) {
    $idprod = (int)$row['idprod'];
    $idcd   = (int)$row['idcd'];
    $unid   = (int)$row['unidades'];
    $notas  = (int)$row['notas'];

    // Agrupado por producto
    if (!isset($porProducto[$idprod])) {
        $porProducto[$idprod] = [
            'idprod'       => $idprod,
            'nombre'       => $row['nombre_prod'],
            'presentacion' => $row['presentacion'],
            'tipoprod'     => (int)$row['tipoprod'],
            'unidades'     => 0,
            'notas'        => 0,
            'por_centro'   => [],
        ];
    }
    $porProducto[$idprod]['unidades']  += $unid;
    $porProducto[$idprod]['notas']     += $notas;
    $porProducto[$idprod]['por_centro'][$idcd] = [
        'idcd'     => $idcd,
        'nombre'   => $row['nombre_centro'] ?? "Centro {$idcd}",
        'unidades' => $unid,
        'notas'    => $notas,
    ];

    // Agrupado por centro
    if (!isset($porCentro[$idcd])) {
        $porCentro[$idcd] = [
            'idcd'      => $idcd,
            'nombre'    => $row['nombre_centro'] ?? "Centro {$idcd}",
            'unidades'  => 0,
            'notas'     => 0,
            'productos' => [],
        ];
    }
    $porCentro[$idcd]['unidades']  += $unid;
    $porCentro[$idcd]['notas']     += $notas;
    $porCentro[$idcd]['productos'][$idprod] = [
        'idprod'   => $idprod,
        'nombre'   => $row['nombre_prod'],
        'unidades' => $unid,
        'notas'    => $notas,
    ];
}

// Ordenar por unidades desc
usort($porProducto, fn($a, $b) => $b['unidades'] - $a['unidades']);
usort($porCentro,   fn($a, $b) => $b['unidades'] - $a['unidades']);

// Convertir sub-arrays asociativos a indexed
foreach ($porProducto as &$pp) {
    $pp['por_centro'] = array_values($pp['por_centro']);
}
foreach ($porCentro as &$pc) {
    $pc['productos'] = array_values($pc['productos']);
}
unset($pp, $pc);

// ── Totales globales ──────────────────────────────────────────────────────────
$totalUnidades = array_sum(array_column($porProducto, 'unidades'));

$stmtNotas = $db->prepare("
    SELECT COUNT(DISTINCT t.idtransacciones) AS total
    FROM transacciones t
    JOIN pedido p ON p.transacciones_idtransacciones = t.idtransacciones
    JOIN productos pr ON pr.id_prod = p.productos_idprod
    WHERE {$where}
      AND pr.activo = 'SI'
      AND pr.tipoprod IN (1, 2)
");
$stmtNotas->execute($params);
$totalNotas = (int)$stmtNotas->fetchColumn();

// ── Comparativa mensual (últimos 6 meses) ─────────────────────────────────────
$comparativa = [];
$year  = (int)date('Y');
$month = (int)date('m');
for ($i = 0; $i < 6; $i++) {
    $m = $month - $i;
    $y = $year;
    while ($m <= 0) { $m += 12; $y--; }
    $mStart = sprintf('%04d-%02d-01 00:00:00', $y, $m);
    $mEnd   = sprintf('%04d-%02d-%02d 23:59:59', $y, $m, (int)date('t', mktime(0,0,0,$m,1,$y)));

    $wParams = [$mStart, $mEnd];
    $wExtra  = "";
    if ($centro > 0)    { $wExtra .= " AND t.usuarios_ci_idusuarios_ci = ?"; $wParams[] = $centro; }
    if ($cdentrega > 0) { $wExtra .= " AND t.cdentrega = ?"; $wParams[] = $cdentrega; }
    if ($prod > 0)      { $wExtra .= " AND p.productos_idprod = ?"; $wParams[] = $prod; }

    $stmtM = $db->prepare("
        SELECT COALESCE(SUM(p.cant), 0) AS unidades,
               COUNT(DISTINCT t.idtransacciones) AS notas
        FROM transacciones t
        JOIN pedido p     ON p.transacciones_idtransacciones = t.idtransacciones
        JOIN productos pr ON pr.id_prod = p.productos_idprod
        WHERE t.tipostr_idtipostr IN (6, 10, 11)
          AND t.{$fechaTipo} BETWEEN ? AND ?
          AND pr.activo = 'SI'
          AND pr.tipoprod IN (1, 2)
          {$wExtra}
    ");
    $stmtM->execute($wParams);
    $mRow = $stmtM->fetch(PDO::FETCH_ASSOC);

    $meses = ['Ene','Feb','Mar','Abr','May','Jun','Jul','Ago','Sep','Oct','Nov','Dic'];
    $comparativa[] = [
        'mes'      => $meses[$m - 1] . ' ' . $y,
        'anio'     => $y,
        'mes_num'  => $m,
        'unidades' => (int)$mRow['unidades'],
        'notas'    => (int)$mRow['notas'],
    ];
}
$comparativa = array_reverse($comparativa); // cronológico

echo json_encode([
    'success'      => true,
    'por_producto' => array_values($porProducto),
    'por_centro'   => array_values($porCentro),
    'centros'      => $centros,
    'productos'    => $productos,
    'comparativa'  => $comparativa,
    'totales' => [
        'unidades' => $totalUnidades,
        'notas'    => $totalNotas,
    ],
    'filtros' => [
        'desde'      => $desde,
        'hasta'      => $hasta,
        'centro'     => $centro,
        'cdentrega'  => $cdentrega,
        'prod'       => $prod,
    ],
], JSON_UNESCAPED_UNICODE);
