<?php
/**
 * Reporte Consolidado de Inventarios Desglosado con Valoración de Costos Dinámica (Dual DB)
 * 
 * Muestra el resumen global o por sucursal desglosado en:
 * - Con Factura (Unidades y Valor Q)
 * - Sin Factura (Unidades y Valor Q)
 * - Dorados (Unidades y Valor Q)
 * - Combinados (Facturados + Dorados)
 * - COSTO PROMEDIO PONDERADO (CPP) Y VALORACIÓN DINÁMICA SEGÚN EL FILTRO SELECCIONADO
 * - Filtro Especial: SOLO PRODUCTOS FÍSICAMENTE CONTADOS POR EL TRABAJADOR
 * 
 * Incluye EXPORTACIÓN COMPLETA A EXCEL (.XLSX) Y PDF ajustado DINÁMICAMENTE a los filtros seleccionados.
 */

// 1. Cargar Configuración de Base de Datos y Conexión Dual
$configPath = file_exists(__DIR__ . '/db_config.php') ? __DIR__ . '/db_config.php' : __DIR__ . '/../db_config.php';
$dualPdoPath = file_exists(__DIR__ . '/dual_pdo.php') ? __DIR__ . '/dual_pdo.php' : __DIR__ . '/../dual_pdo.php';

if (!file_exists($configPath) || !file_exists($dualPdoPath)) {
    die(json_encode([
        'success' => false,
        'error' => 'Error de configuración: No se encontraron los archivos db_config.php o dual_pdo.php.'
    ]));
}

$config = require $configPath;
require_once $dualPdoPath;

// Instanciar la conexión dual
$pdo = getDualConnection($config);

// Definir nombres de bases de datos para visualización
$db_principal = $config['db1']['dbname'] ?? 'Principal';
$db_secundaria = $config['db2']['dbname'] ?? 'Secundaria';

// Obtener listado de sucursales para el selector y nombres
$sucursales = [];
$sucursalesMap = ['all' => '🌐 TODAS LAS SUCURSALES (Consolidado Global)'];
try {
    $sucRows = $pdo->query("SELECT id, nombre FROM sucursales ORDER BY id ASC")->fetchAll(PDO::FETCH_ASSOC);
    foreach ($sucRows as $s) {
        $sucursales[] = $s;
        $sucursalesMap[$s['id']] = $s['nombre'];
    }
} catch (Exception $e) {
    $sucursales = [];
}

// Helper para SQL de Filtros
function getConsolidadoSqlConditions($sucursalId, $tipoFilter, $q, $estadoConteo = 'only_contados') {
    $where = [];
    $params = [];

    if (!empty($q)) {
        $where[] = "(p.NombreComercial LIKE ? OR p.NombreGenerico LIKE ? OR p.CodigoInterno LIKE ? OR p.CodigoBarra LIKE ? OR p.laboratorio LIKE ?)";
        $params[] = "%$q%";
        $params[] = "%$q%";
        $params[] = "%$q%";
        $params[] = "%$q%";
        $params[] = "%$q%";
    }

    $whereSql = !empty($where) ? "WHERE " . implode(" AND ", $where) : "";

    $icmSucCond = ($sucursalId !== 'all') ? "WHERE sucursal_id = " . intval($sucursalId) : "";
    $isuSucCond = ($sucursalId !== 'all') ? "WHERE sucursal_id = " . intval($sucursalId) : "";

    // Filtro estricto por productos contados vs todos los productos
    if ($estadoConteo === 'only_contados') {
        if ($tipoFilter === 'facturado') {
            $havingCond = "(total_facturado > 0)";
        } elseif ($tipoFilter === 'no_facturado') {
            $havingCond = "(total_no_facturado > 0)";
        } elseif ($tipoFilter === 'dorado') {
            $havingCond = "(total_dorado > 0)";
        } elseif ($tipoFilter === 'facturado_dorado') {
            $havingCond = "(total_facturado > 0 OR total_dorado > 0)";
        } else {
            $havingCond = "(total_contado > 0)";
        }
    } else {
        if ($tipoFilter === 'facturado') {
            $havingCond = "(total_facturado > 0 OR stock_facturado_pos > 0)";
        } elseif ($tipoFilter === 'no_facturado') {
            $havingCond = "(total_no_facturado > 0 OR stock_no_facturado_pos > 0)";
        } elseif ($tipoFilter === 'dorado') {
            $havingCond = "(total_dorado > 0)";
        } elseif ($tipoFilter === 'facturado_dorado') {
            $havingCond = "(total_facturado > 0 OR total_dorado > 0 OR stock_facturado_pos > 0)";
        } else {
            $havingCond = "(total_contado > 0 OR stock_total_pos > 0)";
        }
    }

    return [
        'whereSql' => $whereSql,
        'params' => $params,
        'icmSucCond' => $icmSucCond,
        'isuSucCond' => $isuSucCond,
        'havingCond' => $havingCond
    ];
}

// Expression SQL reutilizable para buscar el verdadero costo CPP omitiendo ceros
$costoSqlExpr = "COALESCE(
    NULLIF(pcp.costo_promedio_unidad_base, 0),
    NULLIF(isu_sub.costo_promedio_local, 0),
    NULLIF(plc_sub.costo_compra, 0),
    0.00
)";

// 2. Rutas de API internas y Exportaciones
$action = $_GET['action'] ?? '';

// API: Obtener Datos Consolidados JSON con Costo CPP
if ($action === 'fetch_consolidado') {
    header('Content-Type: application/json; charset=utf-8');
    
    $sucursalId = trim($_GET['sucursal_id'] ?? 'all');
    $tipoFilter = trim($_GET['tipo_filter'] ?? 'all');
    $estadoConteo = trim($_GET['estado_conteo'] ?? 'only_contados');
    $q = trim($_GET['q'] ?? '');
    $page = max(1, intval($_GET['page'] ?? 1));
    $limit = max(5, min(100, intval($_GET['limit'] ?? 15)));
    $offset = ($page - 1) * $limit;

    try {
        $conds = getConsolidadoSqlConditions($sucursalId, $tipoFilter, $q, $estadoConteo);
        $whereSql = $conds['whereSql'];
        $params = $conds['params'];
        $icmSucCond = $conds['icmSucCond'];
        $isuSucCond = $conds['isuSucCond'];
        $havingCond = $conds['havingCond'];

        $sql = "SELECT SQL_CALC_FOUND_ROWS 
                    p.id,
                    p.CodigoInterno,
                    p.CodigoBarra,
                    p.NombreComercial,
                    p.NombreGenerico,
                    p.laboratorio,
                    COALESCE(icm_sub.total_facturado, 0) as total_facturado,
                    COALESCE(icm_sub.total_no_facturado, 0) as total_no_facturado,
                    COALESCE(icm_sub.total_dorado, 0) as total_dorado,
                    COALESCE(icm_sub.total_contado, 0) as total_contado,
                    icm_sub.fecha_conteo_formatted,
                    COALESCE(isu_sub.stock_total_pos, 0) as stock_total_pos,
                    COALESCE(isu_sub.stock_facturado_pos, 0) as stock_facturado_pos,
                    COALESCE(isu_sub.stock_no_facturado_pos, 0) as stock_no_facturado_pos,
                    $costoSqlExpr as costo_promedio
                FROM productos p
                LEFT JOIN productos_costo_promedio pcp ON p.id = pcp.producto_id
                LEFT JOIN (
                    SELECT 
                        producto_id, 
                        SUM(cantidad) as total_contado,
                        SUM(cantidad_facturado) as total_facturado,
                        SUM(cantidad_no_facturado) as total_no_facturado,
                        SUM(cantidad_dorado) as total_dorado,
                        DATE_FORMAT(MAX(fecha_registro), '%d/%m/%Y %H:%i:%s') as fecha_conteo_formatted
                    FROM inventario_conteos_manuales
                    $icmSucCond
                    GROUP BY producto_id
                ) icm_sub ON p.id = icm_sub.producto_id
                LEFT JOIN (
                    SELECT 
                        producto_id, 
                        SUM(stock_total) as stock_total_pos, 
                        SUM(stock_facturado) as stock_facturado_pos, 
                        SUM(stock_no_facturado) as stock_no_facturado_pos,
                        MAX(costo_promedio_local) as costo_promedio_local
                    FROM inventario_sucursal
                    $isuSucCond
                    GROUP BY producto_id
                ) isu_sub ON p.id = isu_sub.producto_id
                LEFT JOIN (
                    SELECT producto_id, MAX(costo_compra) as costo_compra
                    FROM producto_lugares_compra
                    WHERE costo_compra > 0
                    GROUP BY producto_id
                ) plc_sub ON p.id = plc_sub.producto_id
                $whereSql
                GROUP BY p.id
                HAVING $havingCond
                ORDER BY p.id DESC 
                LIMIT $offset, $limit";

        $stmt = $pdo->prepare($sql);
        $stmt->execute($params);
        $productos = $stmt->fetchAll(PDO::FETCH_ASSOC);

        $total = $pdo->query("SELECT FOUND_ROWS()")->fetchColumn();
        $totalPages = ceil($total / $limit);

        // Calcular valorización financiera por producto desglosada y filtrada
        foreach ($productos as &$prod) {
            $cpp = floatval($prod['costo_promedio']);
            $prod['valor_facturado'] = floatval($prod['total_facturado']) * $cpp;
            $prod['valor_no_facturado'] = floatval($prod['total_no_facturado']) * $cpp;
            $prod['valor_dorado'] = floatval($prod['total_dorado']) * $cpp;
            $prod['valor_total_contado'] = floatval($prod['total_contado']) * $cpp;

            // Valor filtrado según el tipo seleccionado
            if ($tipoFilter === 'facturado') {
                $prod['valor_filtrado'] = $prod['valor_facturado'];
                $prod['unidades_filtradas'] = $prod['total_facturado'];
            } elseif ($tipoFilter === 'no_facturado') {
                $prod['valor_filtrado'] = $prod['valor_no_facturado'];
                $prod['unidades_filtradas'] = $prod['total_no_facturado'];
            } elseif ($tipoFilter === 'dorado') {
                $prod['valor_filtrado'] = $prod['valor_dorado'];
                $prod['unidades_filtradas'] = $prod['total_dorado'];
            } elseif ($tipoFilter === 'facturado_dorado') {
                $prod['valor_filtrado'] = $prod['valor_facturado'] + $prod['valor_dorado'];
                $prod['unidades_filtradas'] = $prod['total_facturado'] + $prod['total_dorado'];
            } else {
                $prod['valor_filtrado'] = $prod['valor_total_contado'];
                $prod['unidades_filtradas'] = $prod['total_contado'];
            }
        }

        // KPIs Globales acumulados
        $kpiSql = "SELECT 
                    COUNT(DISTINCT p.id) as total_productos,
                    SUM(COALESCE(isu_sub.stock_total_pos, 0)) as kpi_stock_total,
                    SUM(COALESCE(icm_sub.total_facturado, 0)) as kpi_stock_facturado,
                    SUM(COALESCE(icm_sub.total_no_facturado, 0)) as kpi_stock_no_facturado,
                    SUM(COALESCE(icm_sub.total_dorado, 0)) as kpi_stock_dorado,
                    SUM(COALESCE(icm_sub.total_contado, 0)) as kpi_stock_contado,
                    SUM(COALESCE(icm_sub.total_contado, 0) * $costoSqlExpr) as kpi_valor_total,
                    SUM(COALESCE(icm_sub.total_facturado, 0) * $costoSqlExpr) as kpi_valor_facturado,
                    SUM(COALESCE(icm_sub.total_no_facturado, 0) * $costoSqlExpr) as kpi_valor_no_facturado,
                    SUM(COALESCE(icm_sub.total_dorado, 0) * $costoSqlExpr) as kpi_valor_dorado
                   FROM productos p
                   LEFT JOIN productos_costo_promedio pcp ON p.id = pcp.producto_id
                   LEFT JOIN (
                       SELECT producto_id, 
                              SUM(cantidad) as total_contado,
                              SUM(cantidad_facturado) as total_facturado,
                              SUM(cantidad_no_facturado) as total_no_facturado,
                              SUM(cantidad_dorado) as total_dorado
                       FROM inventario_conteos_manuales
                       $icmSucCond
                       GROUP BY producto_id
                   ) icm_sub ON p.id = icm_sub.producto_id
                   LEFT JOIN (
                       SELECT producto_id, 
                              SUM(stock_total) as stock_total_pos, 
                              SUM(stock_facturado) as stock_facturado_pos, 
                              SUM(stock_no_facturado) as stock_no_facturado_pos,
                              MAX(costo_promedio_local) as costo_promedio_local
                       FROM inventario_sucursal
                       $isuSucCond
                       GROUP BY producto_id
                   ) isu_sub ON p.id = isu_sub.producto_id
                   LEFT JOIN (
                       SELECT producto_id, MAX(costo_compra) as costo_compra
                       FROM producto_lugares_compra
                       WHERE costo_compra > 0
                       GROUP BY producto_id
                   ) plc_sub ON p.id = plc_sub.producto_id
                   $whereSql
                   " . (!empty($whereSql) ? " AND " : " WHERE ") . " $havingCond";
        
        $stmtKpi = $pdo->prepare($kpiSql);
        $stmtKpi->execute($params);
        $kpis = $stmtKpi->fetch(PDO::FETCH_ASSOC);

        // Valor del filtro activo
        if ($tipoFilter === 'facturado') {
            $kpis['kpi_valor_filtrado'] = floatval($kpis['kpi_valor_facturado']);
            $kpis['kpi_unidades_filtradas'] = intval($kpis['kpi_stock_facturado']);
            $kpis['filtro_label'] = '🟢 SOLO FACTURADO';
        } elseif ($tipoFilter === 'no_facturado') {
            $kpis['kpi_valor_filtrado'] = floatval($kpis['kpi_valor_no_facturado']);
            $kpis['kpi_unidades_filtradas'] = intval($kpis['kpi_stock_no_facturado']);
            $kpis['filtro_label'] = '🔵 SOLO SIN FACTURA';
        } elseif ($tipoFilter === 'dorado') {
            $kpis['kpi_valor_filtrado'] = floatval($kpis['kpi_valor_dorado']);
            $kpis['kpi_unidades_filtradas'] = intval($kpis['kpi_stock_dorado']);
            $kpis['filtro_label'] = '⭐ SOLO DORADOS';
        } elseif ($tipoFilter === 'facturado_dorado') {
            $kpis['kpi_valor_filtrado'] = floatval($kpis['kpi_valor_facturado']) + floatval($kpis['kpi_valor_dorado']);
            $kpis['kpi_unidades_filtradas'] = intval($kpis['kpi_stock_facturado']) + intval($kpis['kpi_stock_dorado']);
            $kpis['filtro_label'] = '🟢 FACTURADOS + ⭐ DORADOS';
        } else {
            $kpis['kpi_valor_filtrado'] = floatval($kpis['kpi_valor_total']);
            $kpis['kpi_unidades_filtradas'] = intval($kpis['kpi_stock_contado']);
            $kpis['filtro_label'] = '🌐 CONSOLIDADO GLOBAL';
        }

        echo json_encode([
            'success' => true,
            'data' => $productos,
            'kpis' => $kpis,
            'pagination' => [
                'total' => $total,
                'page' => $page,
                'limit' => $limit,
                'total_pages' => $totalPages
            ]
        ]);
        exit;
    } catch (Exception $e) {
        http_response_code(500);
        echo json_encode(['success' => false, 'error' => $e->getMessage()]);
        exit;
    }
}

// EXPORTACIÓN A EXCEL (.XLS) AJUSTADO DINÁMICAMENTE AL FILTRO
if ($action === 'export_excel') {
    $sucursalId = trim($_GET['sucursal_id'] ?? 'all');
    $tipoFilter = trim($_GET['tipo_filter'] ?? 'all');
    $estadoConteo = trim($_GET['estado_conteo'] ?? 'only_contados');
    $q = trim($_GET['q'] ?? '');

    $conds = getConsolidadoSqlConditions($sucursalId, $tipoFilter, $q, $estadoConteo);
    $whereSql = $conds['whereSql'];
    $params = $conds['params'];
    $icmSucCond = $conds['icmSucCond'];
    $isuSucCond = $conds['isuSucCond'];
    $havingCond = $conds['havingCond'];

    $sql = "SELECT 
                p.CodigoInterno,
                p.CodigoBarra,
                p.NombreComercial,
                p.NombreGenerico,
                p.laboratorio,
                COALESCE(icm_sub.total_facturado, 0) as total_facturado,
                COALESCE(icm_sub.total_no_facturado, 0) as total_no_facturado,
                COALESCE(icm_sub.total_dorado, 0) as total_dorado,
                COALESCE(icm_sub.total_contado, 0) as total_contado,
                icm_sub.fecha_conteo_formatted,
                COALESCE(isu_sub.stock_total_pos, 0) as stock_total_pos,
                $costoSqlExpr as costo_promedio
            FROM productos p
            LEFT JOIN productos_costo_promedio pcp ON p.id = pcp.producto_id
            LEFT JOIN (
                SELECT 
                    producto_id, 
                    SUM(cantidad) as total_contado,
                    SUM(cantidad_facturado) as total_facturado,
                    SUM(cantidad_no_facturado) as total_no_facturado,
                    SUM(cantidad_dorado) as total_dorado,
                    DATE_FORMAT(MAX(fecha_registro), '%d/%m/%Y %H:%i:%s') as fecha_conteo_formatted
                FROM inventario_conteos_manuales
                $icmSucCond
                GROUP BY producto_id
            ) icm_sub ON p.id = icm_sub.producto_id
            LEFT JOIN (
                SELECT 
                    producto_id, 
                    SUM(stock_total) as stock_total_pos,
                    MAX(costo_promedio_local) as costo_promedio_local
                FROM inventario_sucursal
                $isuSucCond
                GROUP BY producto_id
            ) isu_sub ON p.id = isu_sub.producto_id
            LEFT JOIN (
                SELECT producto_id, MAX(costo_compra) as costo_compra
                FROM producto_lugares_compra
                WHERE costo_compra > 0
                GROUP BY producto_id
            ) plc_sub ON p.id = plc_sub.producto_id
            $whereSql
            GROUP BY p.id
            HAVING $havingCond
            ORDER BY p.NombreComercial ASC";

    $stmt = $pdo->prepare($sql);
    $stmt->execute($params);
    $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

    $nombreSucursalLabel = $sucursalesMap[$sucursalId] ?? 'TODAS LAS SUCURSALES';

    // Determinar visibilidad de columnas según el filtro activo
    $showFact = ($tipoFilter === 'all' || $tipoFilter === 'facturado' || $tipoFilter === 'facturado_dorado');
    $showNoFact = ($tipoFilter === 'all' || $tipoFilter === 'no_facturado');
    $showDorado = ($tipoFilter === 'all' || $tipoFilter === 'dorado' || $tipoFilter === 'facturado_dorado');

    if ($tipoFilter === 'facturado') {
        $valTitle = 'VALOR FACTURADO (Q)';
    } elseif ($tipoFilter === 'no_facturado') {
        $valTitle = 'VALOR SIN FACTURA (Q)';
    } elseif ($tipoFilter === 'dorado') {
        $valTitle = 'VALOR DORADO (Q)';
    } elseif ($tipoFilter === 'facturado_dorado') {
        $valTitle = 'VALOR (FACTURADO + DORADO) (Q)';
    } else {
        $valTitle = 'VALOR TOTAL (Q)';
    }

    header("Content-Type: application/vnd.ms-excel; charset=utf-8");
    header("Content-Disposition: attachment; filename=Consolidado_Inventario_Filtrado_" . date('Y-m-d_His') . ".xls");
    header("Pragma: no-cache");
    header("Expires: 0");

    echo "\xEF\xBB\xBF"; // UTF-8 BOM para Excel
    ?>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <table border="1">
        <thead>
            <tr style="background-color: #10b981; color: #ffffff; font-weight: bold; font-size: 14px;">
                <th colspan="12" style="text-align: center; height: 35px;">REPORTE DE INVENTARIO CONSOLIDADO Y VALORIZACIÓN - <?= mb_strtoupper($nombreSucursalLabel) ?></th>
            </tr>
            <tr style="background-color: #1e293b; color: #94a3b8; font-weight: bold;">
                <th>CÓDIGO INTERNO</th>
                <th>CÓDIGO BARRAS</th>
                <th>NOMBRE COMERCIAL</th>
                <th>NOMBRE GENÉRICO</th>
                <th>LABORATORIO</th>
                <?php if ($showFact): ?><th style="background-color: #065f46; color: #ffffff;">CONTEO FACTURADO</th><?php endif; ?>
                <?php if ($showNoFact): ?><th style="background-color: #1e40af; color: #ffffff;">CONTEO SIN FACTURA</th><?php endif; ?>
                <?php if ($showDorado): ?><th style="background-color: #92400e; color: #ffffff;">CONTEO DORADO</th><?php endif; ?>
                <th style="background-color: #047857; color: #ffffff;">TOTAL FILTRADO</th>
                <th>COSTO CPP (Q)</th>
                <th style="background-color: #047857; color: #ffffff;"><?= $valTitle ?></th>
                <th>FECHA ÚLTIMO CONTEO</th>
            </tr>
        </thead>
        <tbody>
            <?php 
            $sumFact = 0; $sumNoFact = 0; $sumDorado = 0; $sumTotFiltrado = 0; $valTotFiltrado = 0;

            foreach ($rows as $r): 
                $cpp = floatval($r['costo_promedio']);
                $vFact = $r['total_facturado'] * $cpp;
                $vNoFact = $r['total_no_facturado'] * $cpp;
                $vDorado = $r['total_dorado'] * $cpp;

                if ($tipoFilter === 'facturado') {
                    $uFiltradas = $r['total_facturado'];
                    $vFiltrado = $vFact;
                } elseif ($tipoFilter === 'no_facturado') {
                    $uFiltradas = $r['total_no_facturado'];
                    $vFiltrado = $vNoFact;
                } elseif ($tipoFilter === 'dorado') {
                    $uFiltradas = $r['total_dorado'];
                    $vFiltrado = $vDorado;
                } elseif ($tipoFilter === 'facturado_dorado') {
                    $uFiltradas = $r['total_facturado'] + $r['total_dorado'];
                    $vFiltrado = $vFact + $vDorado;
                } else {
                    $uFiltradas = $r['total_contado'];
                    $vFiltrado = $r['total_contado'] * $cpp;
                }

                $sumFact += $r['total_facturado'];
                $sumNoFact += $r['total_no_facturado'];
                $sumDorado += $r['total_dorado'];
                $sumTotFiltrado += $uFiltradas;
                $valTotFiltrado += $vFiltrado;
            ?>
            <tr>
                <td><?= htmlspecialchars($r['CodigoInterno']) ?></td>
                <td>'<?= htmlspecialchars($r['CodigoBarra']) ?></td>
                <td><?= htmlspecialchars($r['NombreComercial']) ?></td>
                <td><?= htmlspecialchars($r['NombreGenerico']) ?></td>
                <td><?= htmlspecialchars($r['laboratorio']) ?></td>
                <?php if ($showFact): ?><td style="text-align: center; font-weight: bold;"><?= $r['total_facturado'] ?></td><?php endif; ?>
                <?php if ($showNoFact): ?><td style="text-align: center; font-weight: bold;"><?= $r['total_no_facturado'] ?></td><?php endif; ?>
                <?php if ($showDorado): ?><td style="text-align: center; font-weight: bold;"><?= $r['total_dorado'] ?></td><?php endif; ?>
                <td style="text-align: center; font-weight: bold; background-color: #d1fae5;"><?= $uFiltradas ?></td>
                <td style="text-align: right; font-weight: bold; color: #38bdf8;">Q <?= number_format($cpp, 4) ?></td>
                <td style="text-align: right; font-weight: bold; background-color: #d1fae5; color: #047857;">Q <?= number_format($vFiltrado, 2) ?></td>
                <td style="text-align: center;"><?= $r['fecha_conteo_formatted'] ?: 'Sin fecha' ?></td>
            </tr>
            <?php endforeach; ?>
        </tbody>
        <tfoot>
            <tr style="background-color: #0f172a; color: #ffffff; font-weight: bold;">
                <td colspan="5" style="text-align: right;">TOTALES ACUMULADOS:</td>
                <?php if ($showFact): ?><td style="text-align: center;"><?= $sumFact ?></td><?php endif; ?>
                <?php if ($showNoFact): ?><td style="text-align: center;"><?= $sumNoFact ?></td><?php endif; ?>
                <?php if ($showDorado): ?><td style="text-align: center;"><?= $sumDorado ?></td><?php endif; ?>
                <td style="text-align: center; background-color: #059669; color: #ffffff;"><?= $sumTotFiltrado ?></td>
                <td>-</td>
                <td style="text-align: right; background-color: #059669; color: #ffffff;">Q <?= number_format($valTotFiltrado, 2) ?></td>
                <td></td>
            </tr>
        </tfoot>
    </table>
    <?php
    exit;
}

// EXPORTACIÓN A PDF (IMPRESIÓN OPTIMIZADA Y DINÁMICA SEGÚN EL FILTRO)
if ($action === 'export_pdf') {
    $sucursalId = trim($_GET['sucursal_id'] ?? 'all');
    $tipoFilter = trim($_GET['tipo_filter'] ?? 'all');
    $estadoConteo = trim($_GET['estado_conteo'] ?? 'only_contados');
    $q = trim($_GET['q'] ?? '');

    $conds = getConsolidadoSqlConditions($sucursalId, $tipoFilter, $q, $estadoConteo);
    $whereSql = $conds['whereSql'];
    $params = $conds['params'];
    $icmSucCond = $conds['icmSucCond'];
    $isuSucCond = $conds['isuSucCond'];
    $havingCond = $conds['havingCond'];

    $sql = "SELECT 
                p.CodigoInterno,
                p.CodigoBarra,
                p.NombreComercial,
                p.laboratorio,
                COALESCE(icm_sub.total_facturado, 0) as total_facturado,
                COALESCE(icm_sub.total_no_facturado, 0) as total_no_facturado,
                COALESCE(icm_sub.total_dorado, 0) as total_dorado,
                COALESCE(icm_sub.total_contado, 0) as total_contado,
                icm_sub.fecha_conteo_formatted,
                $costoSqlExpr as costo_promedio
            FROM productos p
            LEFT JOIN productos_costo_promedio pcp ON p.id = pcp.producto_id
            LEFT JOIN (
                SELECT 
                    producto_id, 
                    SUM(cantidad) as total_contado,
                    SUM(cantidad_facturado) as total_facturado,
                    SUM(cantidad_no_facturado) as total_no_facturado,
                    SUM(cantidad_dorado) as total_dorado,
                    DATE_FORMAT(MAX(fecha_registro), '%d/%m/%Y %H:%i:%s') as fecha_conteo_formatted
                FROM inventario_conteos_manuales
                $icmSucCond
                GROUP BY producto_id
            ) icm_sub ON p.id = icm_sub.producto_id
            LEFT JOIN (
                SELECT 
                    producto_id, 
                    SUM(stock_total) as stock_total_pos,
                    MAX(costo_promedio_local) as costo_promedio_local
                FROM inventario_sucursal
                $isuSucCond
                GROUP BY producto_id
            ) isu_sub ON p.id = isu_sub.producto_id
            LEFT JOIN (
                SELECT producto_id, MAX(costo_compra) as costo_compra
                FROM producto_lugares_compra
                WHERE costo_compra > 0
                GROUP BY producto_id
            ) plc_sub ON p.id = plc_sub.producto_id
            $whereSql
            GROUP BY p.id
            HAVING $havingCond
            ORDER BY p.NombreComercial ASC";

    $stmt = $pdo->prepare($sql);
    $stmt->execute($params);
    $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

    $nombreSucursalLabel = $sucursalesMap[$sucursalId] ?? 'TODAS LAS SUCURSALES';

    // Determinar visibilidad de columnas según el filtro activo
    $showFact = ($tipoFilter === 'all' || $tipoFilter === 'facturado' || $tipoFilter === 'facturado_dorado');
    $showNoFact = ($tipoFilter === 'all' || $tipoFilter === 'no_facturado');
    $showDorado = ($tipoFilter === 'all' || $tipoFilter === 'dorado' || $tipoFilter === 'facturado_dorado');

    if ($tipoFilter === 'facturado') {
        $valTitle = 'VALOR FACTURADO (Q)';
        $subHeaderLabel = '🟢 SOLO FACTURADOS';
    } elseif ($tipoFilter === 'no_facturado') {
        $valTitle = 'VALOR SIN FACTURA (Q)';
        $subHeaderLabel = '🔵 SOLO SIN FACTURA';
    } elseif ($tipoFilter === 'dorado') {
        $valTitle = 'VALOR DORADO (Q)';
        $subHeaderLabel = '⭐ SOLO DORADOS';
    } elseif ($tipoFilter === 'facturado_dorado') {
        $valTitle = 'VALOR (FACT + DORADO) (Q)';
        $subHeaderLabel = '🟢 FACTURADOS + ⭐ DORADOS';
    } else {
        $valTitle = 'VALOR TOTAL (Q)';
        $subHeaderLabel = '🌐 CONSOLIDADO GLOBAL';
    }
    ?>
    <!DOCTYPE html>
    <html lang="es">
    <head>
        <meta charset="UTF-8">
        <title>Informe Consolidado Valorizado</title>
        <style>
            @page { size: letter landscape; margin: 10mm; }
            body { font-family: Arial, sans-serif; font-size: 11px; color: #1e293b; margin: 0; }
            .header { text-align: center; border-bottom: 2px solid #10b981; padding-bottom: 8px; margin-bottom: 15px; }
            .header h2 { margin: 0; color: #0f172a; font-size: 18px; text-transform: uppercase; }
            .header p { margin: 3px 0 0 0; color: #64748b; font-size: 11px; }
            table { width: 100%; border-collapse: collapse; margin-top: 10px; }
            th, td { border: 1px solid #cbd5e1; padding: 6px 8px; text-align: left; }
            th { background-color: #0f172a; color: #ffffff; font-size: 10px; text-transform: uppercase; }
            .text-center { text-align: center; }
            .text-right { text-align: right; }
            .fw-bold { font-weight: bold; }
            .bg-total { background-color: #e2e8f0; font-weight: bold; }
            .badge-fact { color: #059669; font-weight: bold; }
            .badge-nofact { color: #0284c7; font-weight: bold; }
            .badge-dorado { color: #d97706; font-weight: bold; }
        </style>
    </head>
    <body onload="window.print();">
        <div class="header">
            <h2>Reporte de Inventario Físico - <?= $subHeaderLabel ?></h2>
            <p>Sucursal: <strong><?= htmlspecialchars($nombreSucursalLabel) ?></strong> | Generado: <strong><?= date('d/m/Y H:i:s') ?></strong></p>
        </div>

        <table>
            <thead>
                <tr>
                    <th style="width: 8%;">Código</th>
                    <th style="width: 11%;">Barras</th>
                    <th style="width: 30%;">Producto / Comercial</th>
                    <th style="width: 15%;">Laboratorio</th>
                    <?php if ($showFact): ?><th style="width: 7%;" class="text-center">FACT</th><?php endif; ?>
                    <?php if ($showNoFact): ?><th style="width: 7%;" class="text-center">SINFACT</th><?php endif; ?>
                    <?php if ($showDorado): ?><th style="width: 7%;" class="text-center">DORADO</th><?php endif; ?>
                    <th style="width: 7%;" class="text-center">TOTAL</th>
                    <th style="width: 8%;" class="text-right">CPP (Q)</th>
                    <th style="width: 10%;" class="text-right"><?= $valTitle ?></th>
                </tr>
            </thead>
            <tbody>
                <?php 
                $sumFact = 0; $sumNoFact = 0; $sumDorado = 0; $sumTotFiltrado = 0; $valTotFiltrado = 0;
                foreach ($rows as $r): 
                    $cpp = floatval($r['costo_promedio']);
                    $vFact = $r['total_facturado'] * $cpp;
                    $vNoFact = $r['total_no_facturado'] * $cpp;
                    $vDorado = $r['total_dorado'] * $cpp;

                    if ($tipoFilter === 'facturado') {
                        $uFiltradas = $r['total_facturado'];
                        $vFiltrado = $vFact;
                    } elseif ($tipoFilter === 'no_facturado') {
                        $uFiltradas = $r['total_no_facturado'];
                        $vFiltrado = $vNoFact;
                    } elseif ($tipoFilter === 'dorado') {
                        $uFiltradas = $r['total_dorado'];
                        $vFiltrado = $vDorado;
                    } elseif ($tipoFilter === 'facturado_dorado') {
                        $uFiltradas = $r['total_facturado'] + $r['total_dorado'];
                        $vFiltrado = $vFact + $vDorado;
                    } else {
                        $uFiltradas = $r['total_contado'];
                        $vFiltrado = $r['total_contado'] * $cpp;
                    }

                    $sumFact += $r['total_facturado'];
                    $sumNoFact += $r['total_no_facturado'];
                    $sumDorado += $r['total_dorado'];
                    $sumTotFiltrado += $uFiltradas;
                    $valTotFiltrado += $vFiltrado;
                ?>
                <tr>
                    <td class="fw-bold"><?= htmlspecialchars($r['CodigoInterno'] ?: '-') ?></td>
                    <td><?= htmlspecialchars($r['CodigoBarra'] ?: '-') ?></td>
                    <td class="fw-bold"><?= htmlspecialchars($r['NombreComercial']) ?></td>
                    <td><?= htmlspecialchars($r['laboratorio'] ?: '-') ?></td>
                    <?php if ($showFact): ?><td class="text-center badge-fact"><?= $r['total_facturado'] ?></td><?php endif; ?>
                    <?php if ($showNoFact): ?><td class="text-center badge-nofact"><?= $r['total_no_facturado'] ?></td><?php endif; ?>
                    <?php if ($showDorado): ?><td class="text-center badge-dorado"><?= $r['total_dorado'] ?></td><?php endif; ?>
                    <td class="text-center fw-bold bg-total"><?= $uFiltradas ?></td>
                    <td class="text-right">Q <?= number_format($cpp, 4) ?></td>
                    <td class="text-right fw-bold" style="color: #047857;">Q <?= number_format($vFiltrado, 2) ?></td>
                </tr>
                <?php endforeach; ?>
            </tbody>
            <tfoot>
                <tr class="bg-total">
                    <td colspan="4" class="text-right">TOTALES ACUMULADOS:</td>
                    <?php if ($showFact): ?><td class="text-center badge-fact"><?= $sumFact ?></td><?php endif; ?>
                    <?php if ($showNoFact): ?><td class="text-center badge-nofact"><?= $sumNoFact ?></td><?php endif; ?>
                    <?php if ($showDorado): ?><td class="text-center badge-dorado"><?= $sumDorado ?></td><?php endif; ?>
                    <td class="text-center fw-bold"><?= $sumTotFiltrado ?></td>
                    <td class="text-right">-</td>
                    <td class="text-right fw-bold" style="background-color: #10b981; color: white;">Q <?= number_format($valTotFiltrado, 2) ?></td>
                </tr>
            </tfoot>
        </table>
    </body>
    </html>
    <?php
    exit;
}
?>
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Consolidado de Inventarios</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
    <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
    <link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap" rel="stylesheet">
    <style>
        :root {
            --primary: #0b0f19;
            --primary-light: #151f32;
            --accent: #10b981;
            --surface: rgba(21, 31, 50, 0.85);
            --border: rgba(255, 255, 255, 0.12);
            --text: #ffffff;
            --text-secondary: #cbd5e1;
        }

        body {
            background-color: var(--primary);
            background-image: 
                radial-gradient(circle at 10% 20%, rgba(16, 185, 129, 0.08) 0%, transparent 40%),
                radial-gradient(circle at 90% 80%, rgba(59, 130, 246, 0.05) 0%, transparent 40%);
            color: var(--text);
            font-family: 'Plus Jakarta Sans', sans-serif;
            min-height: 100vh;
        }

        .glass-card {
            background: var(--surface);
            backdrop-filter: blur(20px);
            border: 1px solid var(--border);
            border-radius: 1.25rem;
            box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
        }

        .search-input {
            background: rgba(15, 23, 42, 0.7) !important;
            border: 1px solid var(--border) !important;
            color: white !important;
            border-radius: 0.75rem !important;
            padding: 0.75rem 1.25rem !important;
            font-weight: 500;
        }

        .filter-select {
            background: rgba(15, 23, 42, 0.7) !important;
            border: 1px solid var(--border) !important;
            color: white !important;
            border-radius: 0.75rem !important;
            padding: 0.75rem 1.25rem !important;
            font-weight: 600;
            cursor: pointer;
        }
        .filter-select option {
            background-color: #0f172a !important;
            color: #ffffff !important;
        }

        .kpi-card {
            background: rgba(15, 23, 42, 0.6);
            border: 1px solid var(--border);
            border-radius: 1rem;
            padding: 1rem 1.25rem;
            transition: all 0.2s;
        }
        .kpi-card:hover {
            transform: translateY(-2px);
            border-color: rgba(16, 185, 129, 0.4);
        }

        .table-custom {
            --bs-table-bg: transparent;
            --bs-table-color: var(--text);
            --bs-table-border-color: var(--border);
            margin-bottom: 0;
        }

        .table-custom th {
            font-weight: 700;
            text-transform: uppercase;
            font-size: 0.8rem;
            letter-spacing: 0.75px;
            color: #94a3b8;
            padding: 1.2rem 1rem;
            background: rgba(15, 23, 42, 0.4);
        }

        .table-custom td {
            padding: 1rem;
            vertical-align: middle;
            border-bottom: 1px solid var(--border);
        }

        .tr-product { transition: background-color 0.2s; }
        .tr-product:hover { background-color: rgba(255, 255, 255, 0.02); }

        .pagination-custom .page-link {
            background: rgba(21, 31, 50, 0.7);
            border: 1px solid var(--border);
            color: var(--text-secondary);
            padding: 0.6rem 1rem;
        }

        .pagination-custom .page-item.active .page-link {
            background: var(--accent);
            border-color: var(--accent);
            color: white;
            font-weight: 700;
        }

        .color-nombre-comercial { color: #ffffff; font-weight: 700; font-size: 1rem; }
        .color-nombre-generico { color: #cbd5e1; font-size: 0.85rem; }
        .color-laboratorio { color: #fbbf24; font-weight: 700; font-size: 0.775rem; text-transform: uppercase; }
        .color-codigo-interno { color: #38bdf8; font-weight: 700; font-size: 0.875rem; }

        .conteo-box-total {
            background: rgba(15, 23, 42, 0.9);
            border: 1px solid var(--border);
            border-radius: 0.5rem;
            padding: 0.4rem 0.8rem;
            display: inline-block;
        }
    </style>
</head>
<body class="py-5">

<div class="container">
    <!-- Header -->
    <div class="glass-card p-4 mb-4 text-center">
        <h2 class="fw-bold text-white mb-2"><i class="fa-solid fa-chart-pie text-success me-2"></i> Consolidado General de Inventarios</h2>
        <p class="text-secondary mb-3"><span class="badge bg-success me-1">Dual DB</span> Informe unificado de existencias en <code><?= htmlspecialchars($db_principal) ?></code> y <code><?= htmlspecialchars($db_secundaria) ?></code></p>
        
        <!-- Botones de Exportación -->
        <div class="d-flex justify-content-center align-items-center flex-wrap gap-2 pt-2 border-top border-secondary">
            <button class="btn btn-success fw-bold px-4 py-2 shadow" onclick="triggerExport('excel')">
                <i class="fa-solid fa-file-excel me-2"></i> Exportar a Excel (.XLSX)
            </button>
            <button class="btn btn-danger fw-bold px-4 py-2 shadow" onclick="triggerExport('pdf')">
                <i class="fa-solid fa-file-pdf me-2"></i> Imprimir / Guardar PDF
            </button>
        </div>
    </div>

    <!-- KPIs de Unidades y Valorización Financiera Desglosada -->
    <div class="row g-3 mb-4" id="kpiContainer">
        <!-- 🟢 Facturado -->
        <div class="col-md-3">
            <div class="kpi-card text-center border-success" style="border-color: rgba(16, 185, 129, 0.3) !important;">
                <div class="text-success small fw-bold text-uppercase mb-1">🟢 Total Facturado</div>
                <div class="fs-4 fw-bold text-success mb-1" id="kpi_val_fact">Q 0.00</div>
                <div class="small text-secondary" style="font-size: 0.775rem;"><span id="kpi_stock_fact" class="fw-bold text-white">0</span> unidades contadas</div>
            </div>
        </div>

        <!-- 🔵 Sin Factura -->
        <div class="col-md-3">
            <div class="kpi-card text-center border-info" style="border-color: rgba(56, 189, 248, 0.3) !important;">
                <div class="text-info small fw-bold text-uppercase mb-1">🔵 Total Sin Factura</div>
                <div class="fs-4 fw-bold text-info mb-1" id="kpi_val_nofact">Q 0.00</div>
                <div class="small text-secondary" style="font-size: 0.775rem;"><span id="kpi_stock_nofact" class="fw-bold text-white">0</span> unidades contadas</div>
            </div>
        </div>

        <!-- ⭐ Dorados -->
        <div class="col-md-3">
            <div class="kpi-card text-center border-warning" style="border-color: rgba(251, 191, 36, 0.3) !important;">
                <div class="text-warning small fw-bold text-uppercase mb-1">⭐ Total Dorados</div>
                <div class="fs-4 fw-bold text-warning mb-1" id="kpi_val_dorado">Q 0.00</div>
                <div class="small text-secondary" style="font-size: 0.775rem;"><span id="kpi_stock_dorado" class="fw-bold text-white">0</span> unidades contadas</div>
            </div>
        </div>

        <!-- 💰 Valor Financiero según Filtro Activo -->
        <div class="col-md-3">
            <div class="kpi-card text-center border-emerald" style="border-color: #10b981 !important; background: rgba(16, 185, 129, 0.15);">
                <div class="text-success small fw-bold text-uppercase mb-1" id="kpi_valor_title"><i class="fa-solid fa-sack-dollar me-1"></i> VALOR INVENTARIO FILTRADO</div>
                <div class="fs-3 fw-bold text-success mb-1" id="kpi_valor_filtrado">Q 0.00</div>
                <div class="small text-secondary" style="font-size: 0.775rem;"><span id="kpi_unidades_filtradas" class="fw-bold text-white">0</span> unids | <span id="kpi_total_prods" class="fw-bold text-info">0</span> prods</div>
            </div>
        </div>
    </div>

    <!-- Filtros de Búsqueda -->
    <div class="glass-card p-4 mb-4" id="filterContainer">
        <div class="row g-3">
            <div class="col-md-4">
                <label class="form-label text-secondary small fw-bold mb-1">Filtrar por Sucursal</label>
                <select id="sucursalSelect" class="form-select filter-select">
                    <?php foreach ($sucursalesMap as $id => $nombre): ?>
                        <option value="<?= $id ?>"><?= htmlspecialchars($nombre) ?></option>
                    <?php endforeach; ?>
                </select>
            </div>

            <div class="col-md-4">
                <label class="form-label text-secondary small fw-bold mb-1">Clasificación de Inventario</label>
                <select id="tipoFilterSelect" class="form-select filter-select">
                    <option value="all">🌐 Todos (Facturados + Sin Factura + Dorados)</option>
                    <option value="facturado">🟢 Solo Facturados</option>
                    <option value="no_facturado">🔵 Solo Sin Factura</option>
                    <option value="dorado">⭐ Solo Dorados</option>
                    <option value="facturado_dorado">🟢 Facturados y ⭐ Dorados (Combinado)</option>
                </select>
            </div>

            <div class="col-md-4">
                <label class="form-label text-success small fw-bold mb-1"><i class="fa-solid fa-filter me-1"></i> Estado del Conteo Físico</label>
                <select id="estadoConteoSelect" class="form-select filter-select border-success">
                    <option value="only_contados" selected>📋 SOLO PRODUCTOS CONTADOS POR TRABAJADOR</option>
                    <option value="all_products">🌐 TODOS LOS PRODUCTOS (INCLUIR PENDIENTES)</option>
                </select>
            </div>
        </div>

        <div class="row g-3 mt-1">
            <div class="col-md-9">
                <input type="text" id="searchInput" class="form-control search-input" placeholder="Escriba para buscar por nombre comercial, genérico, código o laboratorio...">
            </div>
            <div class="col-md-3">
                <button id="btnSearch" class="btn btn-success w-100 py-3 rounded-3 fw-bold"><i class="fa-solid fa-magnifying-glass me-2"></i> Buscar</button>
            </div>
        </div>
    </div>

    <!-- Grid de Resultados -->
    <div class="glass-card p-4 mb-4" id="resultsContainer">
        <div class="table-responsive">
            <table class="table table-custom align-middle">
                <thead>
                    <tr>
                        <th style="width: 14%">Códigos</th>
                        <th style="width: 23%">Producto / Laboratorio</th>
                        <th style="width: 27%">Conteo Físico Desglosado</th>
                        <th style="width: 14%">Costo CPP (Unidad)</th>
                        <th style="width: 22%" id="th_valor_total">Valor Total Inv. (Q)</th>
                    </tr>
                </thead>
                <tbody id="consolidadoTableBody">
                    <!-- Dinámico -->
                </tbody>
            </table>
        </div>

        <!-- Paginación -->
        <div class="d-flex justify-content-between align-items-center mt-4 flex-wrap gap-3">
            <div class="text-secondary small" id="paginationInfo">Mostrando 0 de 0 productos</div>
            <nav>
                <ul class="pagination pagination-custom mb-0" id="paginationList">
                    <!-- Dinámico -->
                </ul>
            </nav>
        </div>
    </div>
</div>

<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>

<script>
    let currentPage = 1;
    let currentLimit = 15;
    let searchDebounceTimeout = null;

    document.addEventListener('DOMContentLoaded', () => {
        loadConsolidado(1);

        document.getElementById('searchInput').addEventListener('input', () => {
            clearTimeout(searchDebounceTimeout);
            searchDebounceTimeout = setTimeout(() => {
                loadConsolidado(1);
            }, 300);
        });

        document.getElementById('sucursalSelect').addEventListener('change', () => loadConsolidado(1));
        document.getElementById('tipoFilterSelect').addEventListener('change', () => loadConsolidado(1));
        document.getElementById('estadoConteoSelect').addEventListener('change', () => loadConsolidado(1));
        document.getElementById('btnSearch').addEventListener('click', () => loadConsolidado(1));
    });

    // Cargar datos vía AJAX
    async function loadConsolidado(page = 1) {
        currentPage = page;
        const sucursalId = document.getElementById('sucursalSelect').value;
        const tipoFilter = document.getElementById('tipoFilterSelect').value;
        const estadoConteo = document.getElementById('estadoConteoSelect').value;
        const q = document.getElementById('searchInput').value.trim();
        const tbody = document.getElementById('consolidadoTableBody');

        tbody.innerHTML = `
            <tr>
                <td colspan="5" class="text-center py-5 text-secondary">
                    <div class="spinner-border text-success mb-3" role="status"></div>
                    <div>Cargando informe consolidado valorizado...</div>
                </td>
            </tr>
        `;

        try {
            const url = `?action=fetch_consolidado&sucursal_id=${sucursalId}&tipo_filter=${tipoFilter}&estado_conteo=${estadoConteo}&q=${encodeURIComponent(q)}&page=${page}&limit=${currentLimit}`;
            const res = await fetch(url);
            const json = await res.json();

            if (!json.success) {
                tbody.innerHTML = `<tr><td colspan="5" class="text-center text-danger py-4"><i class="fa-solid fa-circle-exclamation me-2"></i> Error: ${json.error}</td></tr>`;
                return;
            }

            renderKPIs(json.kpis, tipoFilter);
            renderTable(json.data, tipoFilter);
            renderPagination(json.pagination);
        } catch (err) {
            tbody.innerHTML = `<tr><td colspan="5" class="text-center text-danger py-4"><i class="fa-solid fa-circle-exclamation me-2"></i> Error: ${err.message}</td></tr>`;
        }
    }

    // Renderizar KPIs incluyendo la Valoración Financiera Desglosada
    function renderKPIs(kpis, tipoFilter) {
        if (!kpis) return;

        const elTotalProds = document.getElementById('kpi_total_prods');
        const elStockFact = document.getElementById('kpi_stock_fact');
        const elStockNoFact = document.getElementById('kpi_stock_nofact');
        const elStockDorado = document.getElementById('kpi_stock_dorado');

        const elValFact = document.getElementById('kpi_val_fact');
        const elValNoFact = document.getElementById('kpi_val_nofact');
        const elValDorado = document.getElementById('kpi_val_dorado');

        const elValFiltrado = document.getElementById('kpi_valor_filtrado');
        const elUnidadesFiltradas = document.getElementById('kpi_unidades_filtradas');
        const elValTitle = document.getElementById('kpi_valor_title');

        if (elTotalProds) elTotalProds.textContent = kpis.total_productos || 0;
        if (elStockFact) elStockFact.textContent = kpis.kpi_stock_facturado || 0;
        if (elStockNoFact) elStockNoFact.textContent = kpis.kpi_stock_no_facturado || 0;
        if (elStockDorado) elStockDorado.textContent = kpis.kpi_stock_dorado || 0;

        const vFact = parseFloat(kpis.kpi_valor_facturado) || 0;
        const vNoFact = parseFloat(kpis.kpi_valor_no_facturado) || 0;
        const vDorado = parseFloat(kpis.kpi_valor_dorado) || 0;
        const vFiltrado = parseFloat(kpis.kpi_valor_filtrado) || 0;

        if (elValFact) elValFact.textContent = `Q ${vFact.toLocaleString('es-GT', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;
        if (elValNoFact) elValNoFact.textContent = `Q ${vNoFact.toLocaleString('es-GT', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;
        if (elValDorado) elValDorado.textContent = `Q ${vDorado.toLocaleString('es-GT', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;

        if (elValFiltrado) elValFiltrado.textContent = `Q ${vFiltrado.toLocaleString('es-GT', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;
        if (elUnidadesFiltradas) elUnidadesFiltradas.textContent = kpis.kpi_unidades_filtradas || 0;
        if (elValTitle) elValTitle.innerHTML = `<i class="fa-solid fa-sack-dollar me-1"></i> ${kpis.filtro_label || 'VALOR FILTRADO'}`;
    }

    // Renderizar Tabla con Costo CPP y Valoración Total según el Filtro Activo
    function renderTable(data, tipoFilter) {
        const tbody = document.getElementById('consolidadoTableBody');
        const thValor = document.getElementById('th_valor_total');
        tbody.innerHTML = '';

        // Título dinámico de la columna de valorización
        if (tipoFilter === 'facturado') {
            if (thValor) thValor.textContent = 'Valor Facturado (Q)';
        } else if (tipoFilter === 'no_facturado') {
            if (thValor) thValor.textContent = 'Valor Sin Factura (Q)';
        } else if (tipoFilter === 'dorado') {
            if (thValor) thValor.textContent = 'Valor Dorado (Q)';
        } else if (tipoFilter === 'facturado_dorado') {
            if (thValor) thValor.textContent = 'Valor (Facturado + Dorado) (Q)';
        } else {
            if (thValor) thValor.textContent = 'Valor Total Inv. (Q)';
        }

        if (!data || data.length === 0) {
            tbody.innerHTML = '<tr><td colspan="5" class="text-center py-5 text-secondary">No se encontraron productos con los filtros seleccionados.</td></tr>';
            return;
        }

        data.forEach(p => {
            const tr = document.createElement('tr');
            tr.className = 'tr-product';

            const cpp = parseFloat(p.costo_promedio) || 0;
            const valFiltrado = parseFloat(p.valor_filtrado) || 0;
            const valFact = parseFloat(p.valor_facturado) || 0;
            const valNoFact = parseFloat(p.valor_no_facturado) || 0;
            const valDorado = parseFloat(p.valor_dorado) || 0;

            const cellCodigos = `
                <div class="color-codigo-interno font-monospace mb-1">${escapeHtml(p.CodigoInterno || 'S/C')}</div>
                <div class="small text-secondary font-monospace">${escapeHtml(p.CodigoBarra || '-')}</div>
            `;

            const cellProducto = `
                <div class="color-nombre-comercial mb-1">${escapeHtml(p.NombreComercial)}</div>
                <div class="color-nombre-generico mb-1">${escapeHtml(p.NombreGenerico || '')}</div>
                <div class="color-laboratorio">${escapeHtml(p.laboratorio || '')}</div>
            `;

            const cellConteo = `
                <div class="d-flex flex-column gap-1">
                    <div class="d-flex align-items-center gap-2 flex-wrap">
                        <span class="badge bg-success-subtle text-success border border-success px-2 py-1">🟢 ${p.total_facturado}</span>
                        <span class="badge bg-info-subtle text-info border border-info px-2 py-1">🔵 ${p.total_no_facturado}</span>
                        <span class="badge bg-warning-subtle text-warning border border-warning px-2 py-1">⭐ ${p.total_dorado}</span>
                    </div>
                    <div class="mt-2">
                        <span class="conteo-box-total fw-bold text-white fs-6">Total: ${p.total_contado}</span>
                    </div>
                    <div class="small text-secondary mt-1">
                        ${p.fecha_conteo_formatted ? `<i class="fa-solid fa-clock text-success me-1"></i> ${p.fecha_conteo_formatted}` : '<span class="italic text-muted">Sin fecha</span>'}
                    </div>
                </div>
            `;

            const cellCpp = `
                <div class="fw-bold text-info font-monospace fs-6">
                    Q ${cpp.toFixed(4)}
                </div>
                <div class="small text-secondary" style="font-size: 0.725rem;">CPP / Unidad</div>
            `;

            const cellValorTotal = `
                <div class="d-flex flex-column align-items-start">
                    <div class="badge bg-success text-white border border-success fs-6 px-3 py-2 mb-1">
                        Q ${valFiltrado.toLocaleString('es-GT', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}
                    </div>
                    <div class="small text-secondary" style="font-size: 0.725rem;">
                        Fact: <strong class="text-success">Q ${valFact.toFixed(2)}</strong> | SinFact: <strong class="text-info">Q ${valNoFact.toFixed(2)}</strong>
                    </div>
                </div>
            `;

            tr.innerHTML = `
                <td>${cellCodigos}</td>
                <td>${cellProducto}</td>
                <td>${cellConteo}</td>
                <td>${cellCpp}</td>
                <td>${cellValorTotal}</td>
            `;
            tbody.appendChild(tr);
        });
    }

    // Paginación
    function renderPagination(info) {
        const infoSpan = document.getElementById('paginationInfo');
        const list = document.getElementById('paginationList');
        list.innerHTML = '';

        const start = (info.page - 1) * info.limit + 1;
        const end = Math.min(info.total, info.page * info.limit);
        infoSpan.textContent = `Mostrando ${info.total > 0 ? start : 0} a ${end} de ${info.total} productos`;

        if (info.total_pages <= 1) return;

        const prevLi = document.createElement('li');
        prevLi.className = `page-item ${info.page === 1 ? 'disabled' : ''}`;
        prevLi.innerHTML = `<a class="page-link" href="#" onclick="loadConsolidado(${info.page - 1}); return false;"><i class="fa-solid fa-chevron-left"></i></a>`;
        list.appendChild(prevLi);

        let startPage = Math.max(1, info.page - 2);
        let endPage = Math.min(info.total_pages, startPage + 4);
        if (endPage - startPage < 4) {
            startPage = Math.max(1, endPage - 4);
        }

        for (let i = startPage; i <= endPage; i++) {
            const li = document.createElement('li');
            li.className = `page-item ${info.page === i ? 'active' : ''}`;
            li.innerHTML = `<a class="page-link" href="#" onclick="loadConsolidado(${i}); return false;">${i}</a>`;
            list.appendChild(li);
        }

        const nextLi = document.createElement('li');
        nextLi.className = `page-item ${info.page === info.total_pages ? 'disabled' : ''}`;
        nextLi.innerHTML = `<a class="page-link" href="#" onclick="loadConsolidado(${info.page + 1}); return false;"><i class="fa-solid fa-chevron-right"></i></a>`;
        list.appendChild(nextLi);
    }

    // Disparar exportación respetando todos los filtros activos
    function triggerExport(type) {
        const sucursalId = document.getElementById('sucursalSelect').value;
        const tipoFilter = document.getElementById('tipoFilterSelect').value;
        const estadoConteo = document.getElementById('estadoConteoSelect').value;
        const q = document.getElementById('searchInput').value.trim();

        const url = `?action=export_${type}&sucursal_id=${sucursalId}&tipo_filter=${tipoFilter}&estado_conteo=${estadoConteo}&q=${encodeURIComponent(q)}`;
        window.open(url, '_blank');
    }

    function escapeHtml(str) {
        if (!str) return '';
        return str.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;");
    }
</script>
</body>
</html>
