<?php
/**
 * Sistema de Conteo Manual de Inventario Desglosado por Fila (Dual DB)
 * 
 * Configurado para trabajar directamente con la Sucursal Central / Fija.
 * Permite ingresar la cantidad Con Factura, Sin Factura y Dorado, editar código de barras,
 * crear nuevos productos, recibir/enviar traslados entre sucursales y registrar nuevos ingresos.
 */

// =========================================================================
// ⚙️ CONFIGURACIÓN DE SUCURSAL FIJA DE TRABAJO
// Cambie el valor de $CONFIG_SUCURSAL_ID según la sucursal que desee utilizar:
// Ejemplos: 5 = (Centro) FARMACIAS SUFARMA | 1 = BodegaCentral | 2 = Sanfe
// =========================================================================
$CONFIG_SUCURSAL_ID = 2; 

// 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);

// Auto-creación, alteración de tablas y self-healing de AUTO_INCREMENT para Web Hosting
try {
    $createTableSql = "CREATE TABLE IF NOT EXISTS `inventario_conteos_manuales` (
        `id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        `sucursal_id` INT NOT NULL,
        `producto_id` BIGINT UNSIGNED NOT NULL,
        `cantidad` INT NOT NULL DEFAULT 0,
        `cantidad_facturado` INT NOT NULL DEFAULT 0,
        `cantidad_no_facturado` INT NOT NULL DEFAULT 0,
        `cantidad_dorado` INT NOT NULL DEFAULT 0,
        `tipo_conteo` VARCHAR(20) NOT NULL DEFAULT 'facturado',
        `fecha_registro` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
        UNIQUE KEY `idx_sucursal_producto` (`sucursal_id`, `producto_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;";
    $pdo->exec($createTableSql);

    // Asegurar columnas desglosadas en inventario_conteos_manuales
    foreach (['cantidad_facturado', 'cantidad_no_facturado', 'cantidad_dorado', 'tipo_conteo'] as $col) {
        try {
            $pdo->exec("ALTER TABLE `inventario_conteos_manuales` ADD COLUMN `$col` INT NOT NULL DEFAULT 0");
        } catch (Exception $ex) {}
    }

    // Asegurar columna es_dorado en producto_lugares_compra
    try {
        $pdo->exec("ALTER TABLE `producto_lugares_compra` ADD COLUMN `es_dorado` TINYINT(1) DEFAULT 0");
    } catch (Exception $ex) {}

    // Self-healing: Asegurar AUTO_INCREMENT en traslados, detalle_traslados e ingresos_sucursal
    foreach (['traslados', 'detalle_traslados', 'ingresos_sucursal'] as $tFix) {
        try {
            $pdo->exec("ALTER TABLE `$tFix` MODIFY COLUMN `id` BIGINT UNSIGNED AUTO_INCREMENT");
        } catch (Exception $ex) {}
    }
} catch (Exception $e) {
    error_log("Error en auto-creación/alteración de esquemas: " . $e->getMessage());
}

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

// Obtener listado de presentaciones del sistema
$listaPresentaciones = [];
try {
    $listaPresentaciones = $pdo->query("SELECT id, nombre FROM presentaciones ORDER BY nombre ASC")->fetchAll(PDO::FETCH_ASSOC);
} catch (Exception $e) {
    $listaPresentaciones = [
        ['id' => 1, 'nombre' => 'UNIDAD'],
        ['id' => 2, 'nombre' => 'BLISTER'],
        ['id' => 3, 'nombre' => 'CAJA'],
        ['id' => 7, 'nombre' => 'BOLSA']
    ];
}

// Obtener listado de sucursales para traslados
$listaSucursales = [];
$nombreSucursalFija = "Sucursal ID $CONFIG_SUCURSAL_ID";
try {
    $listaSucursales = $pdo->query("SELECT id, nombre FROM sucursales ORDER BY id ASC")->fetchAll(PDO::FETCH_ASSOC);
    foreach ($listaSucursales as $s) {
        if ($s['id'] == $CONFIG_SUCURSAL_ID) {
            $nombreSucursalFija = $s['nombre'];
        }
    }
} catch (Exception $e) {}

// Obtener lugares de compra para ingresos
$listaLugaresCompra = [];
try {
    $listaLugaresCompra = $pdo->query("SELECT id_lugarCompra as id, NombreLugar as nombre FROM lugarcompra ORDER BY id_lugarCompra ASC")->fetchAll(PDO::FETCH_ASSOC);
} catch (Exception $e) {
    $listaLugaresCompra = [['id' => 1, 'nombre' => 'General']];
}

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

// API: Búsqueda rápida de productos para selector de modales
if ($action === 'search_products_modal') {
    header('Content-Type: application/json; charset=utf-8');
    $q = trim($_GET['q'] ?? '');
    if (empty($q)) {
        echo json_encode(['success' => true, 'data' => []]);
        exit;
    }
    try {
        $stmt = $pdo->prepare("SELECT id, CodigoInterno, CodigoBarra, NombreComercial, laboratorio FROM productos WHERE NombreComercial LIKE ? OR CodigoInterno LIKE ? OR CodigoBarra LIKE ? ORDER BY NombreComercial ASC LIMIT 15");
        $stmt->execute(["%$q%", "%$q%", "%$q%"]);
        $prods = $stmt->fetchAll(PDO::FETCH_ASSOC);
        echo json_encode(['success' => true, 'data' => $prods]);
        exit;
    } catch (Exception $e) {
        echo json_encode(['success' => false, 'error' => $e->getMessage()]);
        exit;
    }
}

// API: Buscar productos y traer sus conteos desglosados
if ($action === 'search') {
    header('Content-Type: application/json; charset=utf-8');
    
    $sucursalId = intval($_GET['sucursal_id'] ?? $CONFIG_SUCURSAL_ID);
    if ($sucursalId <= 0) $sucursalId = $CONFIG_SUCURSAL_ID;

    $q = trim($_GET['q'] ?? '');
    $filter = trim($_GET['filter'] ?? 'all');
    $page = max(1, intval($_GET['page'] ?? 1));
    $limit = max(5, min(100, intval($_GET['limit'] ?? 15)));
    $offset = ($page - 1) * $limit;

    try {
        $where = [];
        $params = [];

        if (!empty($q)) {
            if ($filter === 'name') {
                $where[] = "(p.NombreComercial LIKE ? OR p.NombreGenerico LIKE ?)";
                $params[] = "%$q%";
                $params[] = "%$q%";
            } elseif ($filter === 'code') {
                $where[] = "(p.CodigoInterno LIKE ? OR p.CodigoBarra LIKE ?)";
                $params[] = "%$q%";
                $params[] = "%$q%";
            } elseif ($filter === 'lab') {
                $where[] = "p.laboratorio LIKE ?";
                $params[] = "%$q%";
            } else {
                $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) : "";
        
        $sql = "SELECT SQL_CALC_FOUND_ROWS p.* FROM `productos` p $whereSql 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);

        $stmtBaseUnit = $pdo->prepare("
            SELECT pr.nombre AS presentacion_nombre 
            FROM `producto_presentaciones` pp
            INNER JOIN `presentaciones` pr ON pp.presentacion_id = pr.id
            WHERE pp.producto_id = ? AND pp.activo = 1
            ORDER BY pp.es_unidad_base DESC, pp.factor_conversion ASC
            LIMIT 1
        ");

        $stmtConteo = $pdo->prepare("
            SELECT cantidad, cantidad_facturado, cantidad_no_facturado, cantidad_dorado, DATE_FORMAT(fecha_registro, '%d/%m/%Y %H:%i:%s') as fecha_registro_formatted 
            FROM `inventario_conteos_manuales` 
            WHERE sucursal_id = ? AND producto_id = ?
            LIMIT 1
        ");

        foreach ($productos as &$p) {
            $stmtBaseUnit->execute([$p['id']]);
            $baseUnit = $stmtBaseUnit->fetch(PDO::FETCH_ASSOC);
            $p['unidad_base'] = $baseUnit ? $baseUnit['presentacion_nombre'] : 'UNIDAD';

            $stmtConteo->execute([$sucursalId, $p['id']]);
            $conteo = $stmtConteo->fetch(PDO::FETCH_ASSOC);
            
            $p['cantidad_contada'] = $conteo ? intval($conteo['cantidad']) : 0;
            $p['cantidad_facturado'] = $conteo ? intval($conteo['cantidad_facturado']) : 0;
            $p['cantidad_no_facturado'] = $conteo ? intval($conteo['cantidad_no_facturado']) : 0;
            $p['cantidad_dorado'] = $conteo ? intval($conteo['cantidad_dorado']) : 0;
            $p['fecha_conteo'] = $conteo ? $conteo['fecha_registro_formatted'] : null;
        }

        echo json_encode([
            'success' => true,
            'data' => $productos,
            '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;
    }
}

// API: Registrar Nuevo Producto (Dual DB)
if ($action === 'create_new_product' && $_SERVER['REQUEST_METHOD'] === 'POST') {
    header('Content-Type: application/json; charset=utf-8');
    
    $input = json_decode(file_get_contents('php://input'), true);
    
    $nombreComercial = trim($input['nombre_comercial'] ?? '');
    $nombreGenerico = trim($input['nombre_generico'] ?? '');
    $laboratorio = trim($input['laboratorio'] ?? '');
    $codigoBarra = trim($input['codigo_barra'] ?? '');
    $presentacionId = max(1, intval($input['presentacion_id'] ?? 1));
    $lugarCompraId = 1; // Fijo a General (ID: 1)
    
    $qtyFacturado = max(0, intval($input['cantidad_facturado'] ?? 0));
    $qtyNoFacturado = max(0, intval($input['cantidad_no_facturado'] ?? 0));
    $qtyDorado = max(0, intval($input['cantidad_dorado'] ?? 0));
    $totalCantidad = $qtyFacturado + $qtyNoFacturado + $qtyDorado;

    if (empty($nombreComercial)) {
        echo json_encode(['success' => false, 'error' => 'El Nombre Comercial del producto es obligatorio.']);
        exit;
    }

    try {
        $pdo->beginTransaction();

        $prefijo = strtoupper(mb_substr($nombreComercial, 0, 1));
        if (!preg_match('/^[A-Z]$/', $prefijo)) {
            $prefijo = 'P';
        }
        
        $stmtMax = $pdo->prepare("SELECT CodigoInterno FROM productos 
                                 WHERE CodigoInterno LIKE :pref 
                                 AND CodigoInterno REGEXP :regex
                                 ORDER BY CAST(SUBSTRING(CodigoInterno, 2) AS UNSIGNED) DESC LIMIT 1");
        $stmtMax->execute([':pref' => $prefijo . '%', ':regex' => '^' . $prefijo . '[0-9]+$']);
        $ultimo = $stmtMax->fetch(PDO::FETCH_ASSOC);
        
        if ($ultimo && !empty($ultimo['CodigoInterno'])) {
            $numero = intval(substr($ultimo['CodigoInterno'], 1));
            $nuevoCodigo = $prefijo . str_pad($numero + 1, 4, '0', STR_PAD_LEFT);
        } else {
            $nuevoCodigo = $prefijo . "0001";
        }

        $sqlProd = "INSERT INTO productos 
                    (CodigoInterno, CodigoBarra, NombreComercial, NombreGenerico, laboratorio, exento_iva, estado, receta_controlada, requiere_receta, receta_requerida) 
                    VALUES (?, ?, ?, ?, ?, 0, 1, 0, 0, 0)";
        $stmtProd = $pdo->prepare($sqlProd);
        $stmtProd->execute([$nuevoCodigo, $codigoBarra, $nombreComercial, $nombreGenerico, $laboratorio]);
        
        $productoId = $pdo->lastInsertId();

        $sqlPres = "INSERT INTO producto_presentaciones 
                    (producto_id, presentacion_id, factor_conversion, activo, es_unidad_base, precio_venta, es_facturable, es_comprable, es_vendible, fecha_creacion, orden) 
                    VALUES (?, ?, 1, 1, 1, 0.00, 1, 1, 1, NOW(), 1)";
        $stmtPres = $pdo->prepare($sqlPres);
        $stmtPres->execute([$productoId, $presentacionId]);

        $conFactura = ($qtyFacturado > 0 || $qtyDorado > 0) ? 1 : 0;
        $esDorado = ($qtyDorado > 0) ? 1 : 0;

        $sqlLugar = "INSERT INTO producto_lugares_compra 
                    (producto_id, lugar_compra_id, con_factura, es_dorado, activo) 
                    VALUES (?, 1, ?, ?, 1)";
        $stmtLugar = $pdo->prepare($sqlLugar);
        $stmtLugar->execute([$productoId, $conFactura, $esDorado]);

        if ($totalCantidad > 0) {
            $sucursalId = $CONFIG_SUCURSAL_ID;

            $sqlConteo = "INSERT INTO `inventario_conteos_manuales` 
                         (`sucursal_id`, `producto_id`, `cantidad`, `cantidad_facturado`, `cantidad_no_facturado`, `cantidad_dorado`, `tipo_conteo`) 
                         VALUES (?, ?, ?, ?, ?, ?, 'desglosado')
                         ON DUPLICATE KEY UPDATE 
                         `cantidad` = VALUES(`cantidad`),
                         `cantidad_facturado` = VALUES(`cantidad_facturado`),
                         `cantidad_no_facturado` = VALUES(`cantidad_no_facturado`),
                         `cantidad_dorado` = VALUES(`cantidad_dorado`),
                         `tipo_conteo` = 'desglosado'";
            $stmtConteo = $pdo->prepare($sqlConteo);
            $stmtConteo->execute([$sucursalId, $productoId, $totalCantidad, $qtyFacturado, $qtyNoFacturado, $qtyDorado]);

            $stockFacturado = $qtyFacturado + $qtyDorado;
            $stockNoFacturado = $qtyNoFacturado;

            $sqlStock = "INSERT INTO `inventario_sucursal` 
                        (`producto_id`, `sucursal_id`, `stock_total`, `stock_facturado`, `stock_no_facturado`) 
                        VALUES (?, ?, ?, ?, ?)
                        ON DUPLICATE KEY UPDATE 
                        `stock_total` = VALUES(`stock_total`),
                        `stock_facturado` = VALUES(`stock_facturado`),
                        `stock_no_facturado` = VALUES(`stock_no_facturado`)";
            $stmtStock = $pdo->prepare($sqlStock);
            $stmtStock->execute([$productoId, $sucursalId, $totalCantidad, $stockFacturado, $stockNoFacturado]);
        }

        $pdo->commit();

        echo json_encode([
            'success' => true,
            'message' => "Producto registrado exitosamente con código $nuevoCodigo.",
            'producto' => [
                'id' => $productoId,
                'CodigoInterno' => $nuevoCodigo,
                'NombreComercial' => $nombreComercial
            ]
        ]);
        exit;
    } catch (Exception $e) {
        if ($pdo->inTransaction()) {
            $pdo->rollBack();
        }
        http_response_code(500);
        echo json_encode(['success' => false, 'error' => $e->getMessage()]);
        exit;
    }
}

// API: Procesar Recibir Traslado (Suma a sucursal activa, resta a sucursal origen)
if ($action === 'process_receive_transfer' && $_SERVER['REQUEST_METHOD'] === 'POST') {
    header('Content-Type: application/json; charset=utf-8');
    $input = json_decode(file_get_contents('php://input'), true);

    $productoId = intval($input['producto_id'] ?? 0);
    $sucursalOrigenId = intval($input['sucursal_origen_id'] ?? 0);
    $clasificacion = trim($input['clasificacion'] ?? 'facturado');
    $cantidad = max(1, intval($input['cantidad'] ?? 0));
    $observaciones = trim($input['observaciones'] ?? '');
    $sucursalDestinoId = $CONFIG_SUCURSAL_ID;

    if ($productoId <= 0 || $sucursalOrigenId <= 0 || $cantidad <= 0) {
        echo json_encode(['success' => false, 'error' => 'Debe seleccionar el producto, la sucursal de origen y una cantidad mayor a 0.']);
        exit;
    }

    if ($sucursalOrigenId === $sucursalDestinoId) {
        echo json_encode(['success' => false, 'error' => 'La sucursal de origen debe ser diferente a la sucursal activa de trabajo.']);
        exit;
    }

    try {
        $pdo->beginTransaction();

        $stmtC = $pdo->prepare("SELECT cantidad, cantidad_facturado, cantidad_no_facturado, cantidad_dorado FROM `inventario_conteos_manuales` WHERE sucursal_id = ? AND producto_id = ? LIMIT 1");
        $stmtC->execute([$sucursalDestinoId, $productoId]);
        $conteoActual = $stmtC->fetch(PDO::FETCH_ASSOC) ?: ['cantidad' => 0, 'cantidad_facturado' => 0, 'cantidad_no_facturado' => 0, 'cantidad_dorado' => 0];

        $cFact = intval($conteoActual['cantidad_facturado']);
        $cNoFact = intval($conteoActual['cantidad_no_facturado']);
        $cDorado = intval($conteoActual['cantidad_dorado']);

        if ($clasificacion === 'facturado') $cFact += $cantidad;
        elseif ($clasificacion === 'no_facturado') $cNoFact += $cantidad;
        elseif ($clasificacion === 'dorado') $cDorado += $cantidad;

        $cTotal = $cFact + $cNoFact + $cDorado;

        $stmtUpdC = $pdo->prepare("INSERT INTO `inventario_conteos_manuales` (`sucursal_id`, `producto_id`, `cantidad`, `cantidad_facturado`, `cantidad_no_facturado`, `cantidad_dorado`, `tipo_conteo`) VALUES (?, ?, ?, ?, ?, ?, 'desglosado') ON DUPLICATE KEY UPDATE `cantidad` = VALUES(`cantidad`), `cantidad_facturado` = VALUES(`cantidad_facturado`), `cantidad_no_facturado` = VALUES(`cantidad_no_facturado`), `cantidad_dorado` = VALUES(`cantidad_dorado`)");
        $stmtUpdC->execute([$sucursalDestinoId, $productoId, $cTotal, $cFact, $cNoFact, $cDorado]);

        $sFact = $cFact + $cDorado;
        $sNoFact = $cNoFact;
        $stmtUpdS = $pdo->prepare("INSERT INTO `inventario_sucursal` (`producto_id`, `sucursal_id`, `stock_total`, `stock_facturado`, `stock_no_facturado`) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE `stock_total` = VALUES(`stock_total`), `stock_facturado` = VALUES(`stock_facturado`), `stock_no_facturado` = VALUES(`stock_no_facturado`)");
        $stmtUpdS->execute([$productoId, $sucursalDestinoId, $cTotal, $sFact, $sNoFact]);

        if ($clasificacion === 'no_facturado') {
            $pdo->prepare("UPDATE `inventario_sucursal` SET stock_total = GREATEST(0, CAST(stock_total AS SIGNED) - ?), stock_no_facturado = GREATEST(0, CAST(stock_no_facturado AS SIGNED) - ?) WHERE producto_id = ? AND sucursal_id = ?")->execute([$cantidad, $cantidad, $productoId, $sucursalOrigenId]);
        } else {
            $pdo->prepare("UPDATE `inventario_sucursal` SET stock_total = GREATEST(0, CAST(stock_total AS SIGNED) - ?), stock_facturado = GREATEST(0, CAST(stock_facturado AS SIGNED) - ?) WHERE producto_id = ? AND sucursal_id = ?")->execute([$cantidad, $cantidad, $productoId, $sucursalOrigenId]);
        }

        $stmtT = $pdo->prepare("INSERT INTO `traslados` (fecha_traslado, fecha_recepcion, sucursal_origen, sucursal_destino, estado, observaciones) VALUES (NOW(), NOW(), ?, ?, 'completado', ?)");
        $stmtT->execute([$sucursalOrigenId, $sucursalDestinoId, "Recepción en Conteo: " . $observaciones]);
        $trasladoId = $pdo->lastInsertId();

        $stmtDT = $pdo->prepare("INSERT INTO `detalle_traslados` (traslado_id, producto_id, presentacion_id, cantidad, cantidad_unidades_base, es_facturado) VALUES (?, ?, 1, ?, ?, ?)");
        $stmtDT->execute([$trasladoId, $productoId, $cantidad, $cantidad, ($clasificacion === 'no_facturado' ? 0 : 1)]);

        $pdo->commit();
        echo json_encode(['success' => true, 'message' => "Traslado recibido exitosamente. Se sumaron $cantidad unidades."]);
        exit;
    } catch (Exception $e) {
        if ($pdo->inTransaction()) $pdo->rollBack();
        http_response_code(500);
        echo json_encode(['success' => false, 'error' => $e->getMessage()]);
        exit;
    }
}

// API: Procesar Enviar Traslado (Resta a sucursal activa, suma a sucursal destino)
if ($action === 'process_send_transfer' && $_SERVER['REQUEST_METHOD'] === 'POST') {
    header('Content-Type: application/json; charset=utf-8');
    $input = json_decode(file_get_contents('php://input'), true);

    $productoId = intval($input['producto_id'] ?? 0);
    $sucursalDestinoId = intval($input['sucursal_destino_id'] ?? 0);
    $clasificacion = trim($input['clasificacion'] ?? 'facturado');
    $cantidad = max(1, intval($input['cantidad'] ?? 0));
    $observaciones = trim($input['observaciones'] ?? '');
    $sucursalOrigenId = $CONFIG_SUCURSAL_ID;

    if ($productoId <= 0 || $sucursalDestinoId <= 0 || $cantidad <= 0) {
        echo json_encode(['success' => false, 'error' => 'Debe seleccionar el producto, la sucursal de destino y una cantidad mayor a 0.']);
        exit;
    }

    if ($sucursalOrigenId === $sucursalDestinoId) {
        echo json_encode(['success' => false, 'error' => 'La sucursal de destino debe ser diferente a la sucursal activa de trabajo.']);
        exit;
    }

    try {
        $pdo->beginTransaction();

        $stmtC = $pdo->prepare("SELECT cantidad, cantidad_facturado, cantidad_no_facturado, cantidad_dorado FROM `inventario_conteos_manuales` WHERE sucursal_id = ? AND producto_id = ? LIMIT 1");
        $stmtC->execute([$sucursalOrigenId, $productoId]);
        $conteoActual = $stmtC->fetch(PDO::FETCH_ASSOC) ?: ['cantidad' => 0, 'cantidad_facturado' => 0, 'cantidad_no_facturado' => 0, 'cantidad_dorado' => 0];

        $cFact = intval($conteoActual['cantidad_facturado']);
        $cNoFact = intval($conteoActual['cantidad_no_facturado']);
        $cDorado = intval($conteoActual['cantidad_dorado']);

        if ($clasificacion === 'facturado') $cFact = max(0, $cFact - $cantidad);
        elseif ($clasificacion === 'no_facturado') $cNoFact = max(0, $cNoFact - $cantidad);
        elseif ($clasificacion === 'dorado') $cDorado = max(0, $cDorado - $cantidad);

        $cTotal = $cFact + $cNoFact + $cDorado;

        $stmtUpdC = $pdo->prepare("INSERT INTO `inventario_conteos_manuales` (`sucursal_id`, `producto_id`, `cantidad`, `cantidad_facturado`, `cantidad_no_facturado`, `cantidad_dorado`, `tipo_conteo`) VALUES (?, ?, ?, ?, ?, ?, 'desglosado') ON DUPLICATE KEY UPDATE `cantidad` = VALUES(`cantidad`), `cantidad_facturado` = VALUES(`cantidad_facturado`), `cantidad_no_facturado` = VALUES(`cantidad_no_facturado`), `cantidad_dorado` = VALUES(`cantidad_dorado`)");
        $stmtUpdC->execute([$sucursalOrigenId, $productoId, $cTotal, $cFact, $cNoFact, $cDorado]);

        $sFact = $cFact + $cDorado;
        $sNoFact = $cNoFact;
        $stmtUpdS = $pdo->prepare("INSERT INTO `inventario_sucursal` (`producto_id`, `sucursal_id`, `stock_total`, `stock_facturado`, `stock_no_facturado`) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE `stock_total` = VALUES(`stock_total`), `stock_facturado` = VALUES(`stock_facturado`), `stock_no_facturado` = VALUES(`stock_no_facturado`)");
        $stmtUpdS->execute([$productoId, $sucursalOrigenId, $cTotal, $sFact, $sNoFact]);

        if ($clasificacion === 'no_facturado') {
            $pdo->prepare("INSERT INTO `inventario_sucursal` (`producto_id`, `sucursal_id`, `stock_total`, `stock_facturado`, `stock_no_facturado`) VALUES (?, ?, ?, 0, ?) ON DUPLICATE KEY UPDATE stock_total = stock_total + ?, stock_no_facturado = stock_no_facturado + ?")->execute([$productoId, $sucursalDestinoId, $cantidad, $cantidad, $cantidad, $cantidad]);
        } else {
            $pdo->prepare("INSERT INTO `inventario_sucursal` (`producto_id`, `sucursal_id`, `stock_total`, `stock_facturado`, `stock_no_facturado`) VALUES (?, ?, ?, ?, 0) ON DUPLICATE KEY UPDATE stock_total = stock_total + ?, stock_facturado = stock_facturado + ?")->execute([$productoId, $sucursalDestinoId, $cantidad, $cantidad, $cantidad, $cantidad]);
        }

        $stmtT = $pdo->prepare("INSERT INTO `traslados` (fecha_traslado, fecha_recepcion, sucursal_origen, sucursal_destino, estado, observaciones) VALUES (NOW(), NOW(), ?, ?, 'completado', ?)");
        $stmtT->execute([$sucursalOrigenId, $sucursalDestinoId, "Envío desde Conteo: " . $observaciones]);
        $trasladoId = $pdo->lastInsertId();

        $stmtDT = $pdo->prepare("INSERT INTO `detalle_traslados` (traslado_id, producto_id, presentacion_id, cantidad, cantidad_unidades_base, es_facturado) VALUES (?, ?, 1, ?, ?, ?)");
        $stmtDT->execute([$trasladoId, $productoId, $cantidad, $cantidad, ($clasificacion === 'no_facturado' ? 0 : 1)]);

        $pdo->commit();
        echo json_encode(['success' => true, 'message' => "Traslado enviado exitosamente. Se descontaron $cantidad unidades."]);
        exit;
    } catch (Exception $e) {
        if ($pdo->inTransaction()) $pdo->rollBack();
        http_response_code(500);
        echo json_encode(['success' => false, 'error' => $e->getMessage()]);
        exit;
    }
}

// API: Procesar Recibir Nuevo Ingreso (Suma directa a la sucursal activa)
if ($action === 'process_new_entry' && $_SERVER['REQUEST_METHOD'] === 'POST') {
    header('Content-Type: application/json; charset=utf-8');
    $input = json_decode(file_get_contents('php://input'), true);

    $productoId = intval($input['producto_id'] ?? 0);
    $lugarCompraId = intval($input['lugar_compra_id'] ?? 1);
    $clasificacion = trim($input['clasificacion'] ?? 'facturado');
    $cantidad = max(1, intval($input['cantidad'] ?? 0));
    $observaciones = trim($input['observaciones'] ?? '');
    $sucursalId = $CONFIG_SUCURSAL_ID;

    if ($productoId <= 0 || $cantidad <= 0) {
        echo json_encode(['success' => false, 'error' => 'Debe seleccionar un producto y especificar una cantidad mayor a 0.']);
        exit;
    }

    try {
        $pdo->beginTransaction();

        $stmtC = $pdo->prepare("SELECT cantidad, cantidad_facturado, cantidad_no_facturado, cantidad_dorado FROM `inventario_conteos_manuales` WHERE sucursal_id = ? AND producto_id = ? LIMIT 1");
        $stmtC->execute([$sucursalId, $productoId]);
        $conteoActual = $stmtC->fetch(PDO::FETCH_ASSOC) ?: ['cantidad' => 0, 'cantidad_facturado' => 0, 'cantidad_no_facturado' => 0, 'cantidad_dorado' => 0];

        $cFact = intval($conteoActual['cantidad_facturado']);
        $cNoFact = intval($conteoActual['cantidad_no_facturado']);
        $cDorado = intval($conteoActual['cantidad_dorado']);

        if ($clasificacion === 'facturado') $cFact += $cantidad;
        elseif ($clasificacion === 'no_facturado') $cNoFact += $cantidad;
        elseif ($clasificacion === 'dorado') $cDorado += $cantidad;

        $cTotal = $cFact + $cNoFact + $cDorado;

        $stmtUpdC = $pdo->prepare("INSERT INTO `inventario_conteos_manuales` (`sucursal_id`, `producto_id`, `cantidad`, `cantidad_facturado`, `cantidad_no_facturado`, `cantidad_dorado`, `tipo_conteo`) VALUES (?, ?, ?, ?, ?, ?, 'desglosado') ON DUPLICATE KEY UPDATE `cantidad` = VALUES(`cantidad`), `cantidad_facturado` = VALUES(`cantidad_facturado`), `cantidad_no_facturado` = VALUES(`cantidad_no_facturado`), `cantidad_dorado` = VALUES(`cantidad_dorado`)");
        $stmtUpdC->execute([$sucursalId, $productoId, $cTotal, $cFact, $cNoFact, $cDorado]);

        $sFact = $cFact + $cDorado;
        $sNoFact = $cNoFact;
        $stmtUpdS = $pdo->prepare("INSERT INTO `inventario_sucursal` (`producto_id`, `sucursal_id`, `stock_total`, `stock_facturado`, `stock_no_facturado`) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE `stock_total` = VALUES(`stock_total`), `stock_facturado` = VALUES(`stock_facturado`), `stock_no_facturado` = VALUES(`stock_no_facturado`)");
        $stmtUpdS->execute([$productoId, $sucursalId, $cTotal, $sFact, $sNoFact]);

        $stmtI = $pdo->prepare("INSERT INTO `ingresos_sucursal` (producto_id, sucursal_id, cantidad_ingresada, observaciones, fecha_ingreso) VALUES (?, ?, ?, ?, NOW())");
        $stmtI->execute([$productoId, $sucursalId, $cantidad, "Nuevo Ingreso: " . $observaciones]);

        $pdo->commit();
        echo json_encode(['success' => true, 'message' => "Nuevo Ingreso registrado exitosamente. Se sumaron $cantidad unidades."]);
        exit;
    } catch (Exception $e) {
        if ($pdo->inTransaction()) $pdo->rollBack();
        http_response_code(500);
        echo json_encode(['success' => false, 'error' => $e->getMessage()]);
        exit;
    }
}

// API: Guardar o editar Código de Barras en tiempo real (Dual DB)
if ($action === 'save_barcode' && $_SERVER['REQUEST_METHOD'] === 'POST') {
    header('Content-Type: application/json; charset=utf-8');
    $input = json_decode(file_get_contents('php://input'), true);
    $productoId = intval($input['producto_id'] ?? 0);
    $codigoBarra = trim($input['codigo_barra'] ?? '');

    if ($productoId <= 0) {
        echo json_encode(['success' => false, 'error' => 'ID de producto inválido.']);
        exit;
    }

    try {
        $pdo->beginTransaction();
        $stmt = $pdo->prepare("UPDATE `productos` SET `CodigoBarra` = ? WHERE `id` = ?");
        $stmt->execute([$codigoBarra, $productoId]);
        $pdo->commit();
        echo json_encode(['success' => true, 'message' => 'Código de barras actualizado exitosamente.']);
        exit;
    } catch (Exception $e) {
        if ($pdo->inTransaction()) $pdo->rollBack();
        http_response_code(500);
        echo json_encode(['success' => false, 'error' => $e->getMessage()]);
        exit;
    }
}

// API: Guardar conteo físico desglosado (Facturado, Sin Factura, Dorado)
if ($action === 'save_conteo' && $_SERVER['REQUEST_METHOD'] === 'POST') {
    header('Content-Type: application/json; charset=utf-8');
    
    $input = json_decode(file_get_contents('php://input'), true);
    $sucursalId = intval($input['sucursal_id'] ?? $CONFIG_SUCURSAL_ID);
    if ($sucursalId <= 0) $sucursalId = $CONFIG_SUCURSAL_ID;

    $productoId = intval($input['producto_id'] ?? 0);
    $qtyFacturado = max(0, intval($input['cantidad_facturado'] ?? 0));
    $qtyNoFacturado = max(0, intval($input['cantidad_no_facturado'] ?? 0));
    $qtyDorado = max(0, intval($input['cantidad_dorado'] ?? 0));

    $totalCantidad = $qtyFacturado + $qtyNoFacturado + $qtyDorado;

    if ($productoId <= 0) {
        echo json_encode(['success' => false, 'error' => 'Datos inválidos para registrar el conteo.']);
        exit;
    }

    try {
        $pdo->beginTransaction();

        $sql1 = "INSERT INTO `inventario_conteos_manuales` 
                (`sucursal_id`, `producto_id`, `cantidad`, `cantidad_facturado`, `cantidad_no_facturado`, `cantidad_dorado`, `tipo_conteo`) 
                VALUES (?, ?, ?, ?, ?, ?, 'desglosado')
                ON DUPLICATE KEY UPDATE 
                `cantidad` = VALUES(`cantidad`),
                `cantidad_facturado` = VALUES(`cantidad_facturado`),
                `cantidad_no_facturado` = VALUES(`cantidad_no_facturado`),
                `cantidad_dorado` = VALUES(`cantidad_dorado`),
                `tipo_conteo` = 'desglosado'";
        $stmt1 = $pdo->prepare($sql1);
        $stmt1->execute([$sucursalId, $productoId, $totalCantidad, $qtyFacturado, $qtyNoFacturado, $qtyDorado]);

        $conFactura = ($qtyFacturado > 0 || $qtyDorado > 0) ? 1 : 0;
        $esDorado = ($qtyDorado > 0) ? 1 : 0;

        $stmtCheckLugar = $pdo->prepare("SELECT id FROM `producto_lugares_compra` WHERE `producto_id` = ? LIMIT 1");
        $stmtCheckLugar->execute([$productoId]);
        $hasLugar = $stmtCheckLugar->fetchColumn();

        if ($hasLugar) {
            $stmtUpdLugar = $pdo->prepare("UPDATE `producto_lugares_compra` SET `con_factura` = ?, `es_dorado` = ? WHERE `producto_id` = ?");
            $stmtUpdLugar->execute([$conFactura, $esDorado, $productoId]);
        } else {
            $stmtInsLugar = $pdo->prepare("INSERT INTO `producto_lugares_compra` (`producto_id`, `lugar_compra_id`, `con_factura`, `es_dorado`, `activo`) VALUES (?, 1, ?, ?, 1)");
            $stmtInsLugar->execute([$productoId, $conFactura, $esDorado]);
        }

        $stockFacturado = $qtyFacturado + $qtyDorado;
        $stockNoFacturado = $qtyNoFacturado;

        $sql3 = "INSERT INTO `inventario_sucursal` 
                (`producto_id`, `sucursal_id`, `stock_total`, `stock_facturado`, `stock_no_facturado`) 
                VALUES (?, ?, ?, ?, ?)
                ON DUPLICATE KEY UPDATE 
                `stock_total` = VALUES(`stock_total`),
                `stock_facturado` = VALUES(`stock_facturado`),
                `stock_no_facturado` = VALUES(`stock_no_facturado`)";
        $stmt3 = $pdo->prepare($sql3);
        $stmt3->execute([$productoId, $sucursalId, $totalCantidad, $stockFacturado, $stockNoFacturado]);

        $pdo->commit();

        $stmtDate = $pdo->prepare("SELECT DATE_FORMAT(fecha_registro, '%d/%m/%Y %H:%i:%s') as fecha_registro_formatted FROM `inventario_conteos_manuales` WHERE sucursal_id = ? AND producto_id = ?");
        $stmtDate->execute([$sucursalId, $productoId]);
        $fecha = $stmtDate->fetchColumn() ?: date('d/m/Y H:i:s');

        echo json_encode([
            'success' => true, 
            'message' => 'Conteo desglosado guardado exitosamente.',
            'total_cantidad' => $totalCantidad,
            'fecha_conteo' => $fecha
        ]);
        exit;
    } catch (Exception $e) {
        if ($pdo->inTransaction()) $pdo->rollBack();
        http_response_code(500);
        echo json_encode(['success' => false, 'error' => $e->getMessage()]);
        exit;
    }
}

// API: Reiniciar/Inicializar todo el inventario a cero
if ($action === 'reset_inventory' && $_SERVER['REQUEST_METHOD'] === 'POST') {
    header('Content-Type: application/json; charset=utf-8');
    try {
        $pdo->beginTransaction();
        $pdo->exec("UPDATE `inventario_sucursal` SET `stock_total` = 0, `stock_facturado` = 0, `stock_no_facturado` = 0");
        $pdo->exec("DELETE FROM `inventario_conteos_manuales`");
        $pdo->commit();
        echo json_encode(['success' => true, 'message' => 'Inventario inicializado a CERO en ambas bases de datos.']);
        exit;
    } catch (Exception $e) {
        if ($pdo->inTransaction()) $pdo->rollBack();
        http_response_code(500);
        echo json_encode(['success' => false, 'error' => $e->getMessage()]);
        exit;
    }
}
?>
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Conteo Manual de Inventario</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;
            --surface: #1e293b;
            --surface-card: #0f172a;
            --border: rgba(255, 255, 255, 0.15);
            --text-main: #f8fafc;
            --text-muted: #94a3b8;
        }

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

        .glass-card {
            background: rgba(30, 41, 59, 0.95);
            backdrop-filter: blur(16px);
            border: 1px solid var(--border);
            border-radius: 1.25rem;
            box-shadow: 0 20px 40px -15px rgba(0, 0, 0, 0.6);
        }

        /* Estilizado de Botones de Cabecera */
        .btn-action-custom {
            font-weight: 700 !important;
            border-radius: 0.65rem !important;
            padding: 0.65rem 1.15rem !important;
            transition: all 0.2s ease-in-out !important;
            font-size: 0.875rem !important;
            display: inline-flex;
            align-items: center;
            gap: 0.4rem;
        }
        .btn-action-custom:hover {
            transform: translateY(-2px);
            box-shadow: 0 8px 20px rgba(0,0,0,0.4);
        }

        .btn-green { background: #10b981 !important; color: #ffffff !important; border: 1px solid #059669 !important; }
        .btn-green:hover { background: #059669 !important; }

        .btn-cyan { background: #06b6d4 !important; color: #ffffff !important; border: 1px solid #0891b2 !important; }
        .btn-cyan:hover { background: #0891b2 !important; }

        .btn-amber { background: #f59e0b !important; color: #0f172a !important; border: 1px solid #d97706 !important; }
        .btn-amber:hover { background: #d97706 !important; color: #ffffff !important; }

        .btn-purple { background: #8b5cf6 !important; color: #ffffff !important; border: 1px solid #7c3aed !important; }
        .btn-purple:hover { background: #7c3aed !important; }

        /* Estilizado de Búsqueda y Filtros */
        .search-input {
            background: #0f172a !important;
            border: 1px solid rgba(255, 255, 255, 0.2) !important;
            color: #ffffff !important;
            border-radius: 0.75rem !important;
            padding: 0.75rem 1.25rem !important;
            font-weight: 500;
        }
        .search-input::placeholder {
            color: #64748b !important;
        }
        .search-input:focus {
            border-color: #10b981 !important;
            box-shadow: 0 0 0 4px rgba(16, 185, 129, 0.25) !important;
        }

        .filter-select {
            background: #0f172a !important;
            border: 1px solid rgba(255, 255, 255, 0.2) !important;
            color: #ffffff !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;
        }

        /* Estilizado de Tabla */
        .table-custom {
            --bs-table-bg: transparent;
            --bs-table-color: var(--text-main);
            --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.5);
        }
        .table-custom td {
            padding: 0.8rem 1rem;
            vertical-align: middle;
            border-bottom: 1px solid var(--border);
        }
        .tr-product:hover { background-color: rgba(255, 255, 255, 0.03); }

        .pagination-custom .page-link {
            background: #0f172a;
            border: 1px solid var(--border);
            color: #cbd5e1;
            padding: 0.6rem 1rem;
        }
        .pagination-custom .page-item.active .page-link {
            background: #10b981;
            border-color: #10b981;
            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; }

        .barcode-edit-input {
            background: #0f172a !important;
            border: 1px dashed rgba(255, 255, 255, 0.3) !important;
            color: #38bdf8 !important;
            font-size: 0.85rem !important;
            padding: 0.3rem 0.5rem !important;
            border-radius: 0.4rem !important;
            width: 100% !important;
        }
        .barcode-edit-input:focus {
            border: 1px solid #38bdf8 !important;
            box-shadow: 0 0 0 2px rgba(56, 189, 248, 0.3) !important;
            outline: none !important;
        }

        .box-conteo-type {
            background: #0f172a !important;
            border: 1px solid var(--border) !important;
            font-weight: 800 !important;
            font-size: 1rem !important;
            text-align: center;
            border-radius: 0.48rem;
            padding: 0.35rem 0.4rem;
            width: 70px;
        }
        .box-facturado { color: #34d399 !important; border-color: rgba(16, 185, 129, 0.5) !important; }
        .box-nofacturado { color: #38bdf8 !important; border-color: rgba(56, 189, 248, 0.5) !important; }
        .box-dorado { color: #fbbf24 !important; border-color: rgba(251, 191, 36, 0.5) !important; }

        .badge-base-unit {
            background: #334155; color: white; font-weight: 700; font-size: 0.75rem; padding: 0.35rem 0.65rem; border-radius: 0.4rem; border: 1px solid rgba(255, 255, 255, 0.15); text-transform: uppercase;
        }

        .sucursal-banner-card { background: rgba(16, 185, 129, 0.1); border: 1px solid rgba(16, 185, 129, 0.4); border-radius: 1rem; }

        /* =========================================================================
         * 🎨 DISEÑO ALTA VISIBILIDAD PARA MODALES (HIGH-CONTRAST DARK MODE)
         * ========================================================================= */
        .modal-content-custom {
            background-color: #0f172a !important;
            border: 2px solid var(--modal-border-color, #334155) !important;
            border-radius: 1.25rem !important;
            box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.9) !important;
            color: #ffffff !important;
        }
        .modal-header-custom {
            background-color: #1e293b !important;
            border-bottom: 1px solid rgba(255, 255, 255, 0.15) !important;
            padding: 1.25rem 1.5rem !important;
        }
        .modal-body-custom {
            background-color: #0f172a !important;
            padding: 1.5rem !important;
        }
        .modal-footer-custom {
            background-color: #1e293b !important;
            border-top: 1px solid rgba(255, 255, 255, 0.15) !important;
            padding: 1rem 1.5rem !important;
        }
        .modal-label-high-contrast {
            color: #f8fafc !important;
            font-weight: 700 !important;
            font-size: 0.875rem !important;
            margin-bottom: 0.4rem !important;
            display: block;
        }
        .modal-input-custom {
            background-color: #1e293b !important;
            border: 1px solid #475569 !important;
            color: #ffffff !important;
            font-weight: 600 !important;
            border-radius: 0.65rem !important;
            padding: 0.7rem 1rem !important;
        }
        .modal-input-custom::placeholder {
            color: #94a3b8 !important;
        }
        .modal-input-custom:focus {
            background-color: #0f172a !important;
            color: #ffffff !important;
            border-color: #38bdf8 !important;
            box-shadow: 0 0 0 3px rgba(56, 189, 248, 0.3) !important;
        }
        .modal-select-custom {
            background-color: #1e293b !important;
            border: 1px solid #475569 !important;
            color: #ffffff !important;
            font-weight: 600 !important;
            border-radius: 0.65rem !important;
            padding: 0.7rem 1rem !important;
        }
        .modal-select-custom option {
            background-color: #0f172a !important;
            color: #ffffff !important;
            padding: 0.5rem;
        }
        .modal-select-list-custom {
            background-color: #1e293b !important;
            border: 1px solid #475569 !important;
            color: #ffffff !important;
            border-radius: 0.65rem !important;
            font-weight: 600 !important;
        }
        .modal-select-list-custom option {
            background-color: #0f172a !important;
            color: #ffffff !important;
            padding: 0.6rem 0.8rem !important;
            border-bottom: 1px solid rgba(255, 255, 255, 0.05);
        }
        .modal-select-list-custom option:checked {
            background-color: #0284c7 !important;
            color: #ffffff !important;
            font-weight: 800 !important;
        }
        .alert-high-contrast {
            border-radius: 0.75rem;
            padding: 0.85rem 1.15rem;
            font-weight: 600;
            font-size: 0.875rem;
        }
    </style>
</head>
<body class="py-5">

<div class="container">
    <!-- Header con Botones de Acción -->
    <div class="glass-card p-4 mb-4 text-center">
        <h2 class="fw-bold text-white mb-2"><i class="fa-solid fa-list-check text-success me-2"></i> Conteo Manual de Inventario</h2>
        <p class="text-secondary mb-3">
            <span class="badge bg-success px-2 py-1 me-1 fs-7"><i class="fa-solid fa-database me-1"></i> Dual DB</span> 
            Sincroniza al instante en <span class="badge bg-primary text-white"><?= htmlspecialchars($db_principal) ?></span> y <span class="badge bg-info text-white"><?= htmlspecialchars($db_secundaria) ?></span>
        </p>
        
        <!-- Botones de Acción Rápidos -->
        <div class="d-flex justify-content-center align-items-center flex-wrap gap-2 pt-3 border-top border-secondary">
            <button type="button" class="btn btn-action-custom btn-green shadow" data-bs-toggle="modal" data-bs-target="#newProductModal">
                <i class="fa-solid fa-plus-circle"></i> Nuevo Producto
            </button>
            <button type="button" class="btn btn-action-custom btn-cyan shadow" data-bs-toggle="modal" data-bs-target="#receiveTransferModal">
                <i class="fa-solid fa-right-to-bracket"></i> Recibir Traslado
            </button>
            <button type="button" class="btn btn-action-custom btn-amber shadow" data-bs-toggle="modal" data-bs-target="#sendTransferModal">
                <i class="fa-solid fa-right-from-bracket"></i> Enviar Traslado
            </button>
            <button type="button" class="btn btn-action-custom btn-purple shadow" data-bs-toggle="modal" data-bs-target="#newEntryModal">
                <i class="fa-solid fa-boxes-packing"></i> Recibir Ingreso
            </button>
            
        </div>
    </div>

    <!-- Banner Informativo de Sucursal Activa Fija -->
    <div class="glass-card p-3 mb-4 sucursal-banner-card text-center">
        <div class="d-flex align-items-center justify-content-center flex-wrap gap-2">
            <i class="fa-solid fa-building-circle-check text-success fs-4 me-1"></i>
            <span class="text-white fw-bold fs-6">Sucursal de Trabajo Fija:</span>
            <span class="badge bg-success text-white px-3 py-2 fs-6 fw-bold"><i class="fa-solid fa-store me-1"></i> <?= htmlspecialchars($nombreSucursalFija) ?> (ID: <?= $CONFIG_SUCURSAL_ID ?>)</span>
        </div>
    </div>

    <!-- Zona de Búsqueda -->
    <div class="glass-card p-4 mb-4" id="searchContainer">
        <div class="row g-3">
            <div class="col-md-7">
                <input type="text" id="searchInput" class="form-control search-input" placeholder="Escriba para buscar por nombre, código o laboratorio...">
            </div>
            <div class="col-md-3">
                <select id="filterSelect" class="form-select filter-select">
                    <option value="all">🔍 Buscar en Todo</option>
                    <option value="name">📦 Nombre Comercial/Genérico</option>
                    <option value="code">🔑 Código Interno/Barras</option>
                    <option value="lab">🧪 Laboratorio</option>
                </select>
            </div>
            <div class="col-md-2">
                <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 / Resultados -->
    <div class="glass-card p-4 mb-4" id="resultsContainer">
        <div class="table-responsive" id="tableWrapper">
            <table class="table table-custom align-middle">
                <thead>
                    <tr>
                        <th style="width: 16%">Códigos (Interno / Barras)</th>
                        <th style="width: 25%">Producto / Laboratorio</th>
                        <th style="width: 9%">U. Mínima</th>
                        <th style="width: 37%">Conteo Desglosado (Facturado | Sin Factura | Dorado)</th>
                        <th style="width: 13%" class="text-center">Último Registro</th>
                    </tr>
                </thead>
                <tbody id="productsTableBody">
                    <!-- Dinámico -->
                </tbody>
            </table>
        </div>

        <!-- Paginación -->
        <div class="d-flex justify-content-between align-items-center mt-4 flex-wrap gap-3" id="paginationWrapper">
            <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>

<!-- MODAL 1: REGISTRAR NUEVO PRODUCTO -->
<div class="modal fade" id="newProductModal" tabindex="-1" aria-hidden="true">
    <div class="modal-dialog modal-dialog-centered modal-lg">
        <div class="modal-content modal-content-custom" style="--modal-border-color: #10b981;">
            <div class="modal-header modal-header-custom text-white">
                <h5 class="modal-title fw-bold text-success fs-5"><i class="fa-solid fa-plus-circle me-2"></i> Registrar Nuevo Producto en Catálogo</h5>
                <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Close"></button>
            </div>
            <form id="newProductForm" onsubmit="handleCreateProduct(event)">
                <div class="modal-body modal-body-custom">
                    <div class="alert alert-success alert-high-contrast mb-4 text-white" style="background: rgba(16, 185, 129, 0.2); border: 1px solid #10b981;">
                        <i class="fa-solid fa-circle-info me-2 text-success fs-5"></i> El producto se asociará automáticamente al <strong>Lugar de Compra: General (ID: 1)</strong> y se sincronizará en ambas bases de datos.
                    </div>
                    <div class="row g-3 mb-3">
                        <div class="col-md-8">
                            <label class="modal-label-high-contrast">Nombre Comercial <span class="text-danger">*</span></label>
                            <input type="text" id="np_nombre_comercial" class="form-control modal-input-custom" placeholder="Ej: Paracetamol 500mg Jarabe" required>
                        </div>
                        <div class="col-md-4">
                            <label class="modal-label-high-contrast">Presentación Mínima <span class="text-danger">*</span></label>
                            <select id="np_presentacion_id" class="form-select modal-select-custom" required>
                                <?php foreach ($listaPresentaciones as $pr): ?>
                                    <option value="<?= $pr['id'] ?>" <?= $pr['id'] == 1 ? 'selected' : '' ?>>📦 <?= htmlspecialchars($pr['nombre']) ?></option>
                                <?php endforeach; ?>
                            </select>
                        </div>
                    </div>
                    <div class="row g-3 mb-4">
                        <div class="col-md-4">
                            <label class="modal-label-high-contrast">Código de Barras</label>
                            <input type="text" id="np_codigo_barra" class="form-control modal-input-custom font-monospace" placeholder="Escanear o escribir">
                        </div>
                        <div class="col-md-4">
                            <label class="modal-label-high-contrast">Nombre Genérico</label>
                            <input type="text" id="np_nombre_generico" class="form-control modal-input-custom" placeholder="Ej: Acetaminofén">
                        </div>
                        <div class="col-md-4">
                            <label class="modal-label-high-contrast">Laboratorio</label>
                            <input type="text" id="np_laboratorio" class="form-control modal-input-custom" placeholder="Ej: FAES / MK">
                        </div>
                    </div>
                    <div class="p-3 rounded-3 bg-dark border border-secondary mb-2">
                        <h6 class="fw-bold text-success mb-3" style="font-size: 0.9rem;"><i class="fa-solid fa-boxes-stacked me-2"></i> Conteo Físico Inicial (Opcional):</h6>
                        <div class="row g-3 text-center">
                            <div class="col-md-4">
                                <label class="small text-success fw-bold mb-1">🟢 Con Factura</label>
                                <input type="number" min="0" id="np_q_fact" class="form-control text-center box-conteo-type box-facturado w-100" value="0" onfocus="this.select()">
                            </div>
                            <div class="col-md-4">
                                <label class="small text-info fw-bold mb-1">🔵 Sin Factura</label>
                                <input type="number" min="0" id="np_q_nofact" class="form-control text-center box-conteo-type box-nofacturado w-100" value="0" onfocus="this.select()">
                            </div>
                            <div class="col-md-4">
                                <label class="small text-warning fw-bold mb-1">⭐ Dorado</label>
                                <input type="number" min="0" id="np_q_dorado" class="form-control text-center box-conteo-type box-dorado w-100" value="0" onfocus="this.select()">
                            </div>
                        </div>
                    </div>
                </div>
                <div class="modal-footer modal-footer-custom">
                    <button type="button" class="btn btn-outline-light font-weight-bold px-4" data-bs-dismiss="modal">Cancelar</button>
                    <button type="submit" id="btnSaveNewProduct" class="btn btn-success fw-bold px-4 py-2"><i class="fa-solid fa-floppy-disk me-2"></i> Guardar y Registrar</button>
                </div>
            </form>
        </div>
    </div>
</div>

<!-- MODAL 2: RECIBIR TRASLADO DE OTRA SUCURSAL -->
<div class="modal fade" id="receiveTransferModal" tabindex="-1" aria-hidden="true">
    <div class="modal-dialog modal-dialog-centered modal-lg">
        <div class="modal-content modal-content-custom" style="--modal-border-color: #06b6d4;">
            <div class="modal-header modal-header-custom text-white">
                <h5 class="modal-title fw-bold text-cyan fs-5" style="color: #38bdf8;"><i class="fa-solid fa-right-to-bracket me-2"></i> Recibir Traslado de Otra Sucursal</h5>
                <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Close"></button>
            </div>
            <form id="receiveTransferForm" onsubmit="handleReceiveTransfer(event)">
                <div class="modal-body modal-body-custom">
                    <div class="alert alert-info alert-high-contrast mb-4 text-white" style="background: rgba(6, 182, 212, 0.2); border: 1px solid #06b6d4;">
                        <i class="fa-solid fa-circle-info me-2 text-cyan fs-5" style="color: #38bdf8;"></i> Al recibir, la cantidad <strong>se sumará</strong> al inventario activo de <strong><?= htmlspecialchars($nombreSucursalFija) ?></strong> y se restará de la sucursal de origen seleccionada.
                    </div>

                    <div class="mb-3">
                        <label class="modal-label-high-contrast">Buscar Producto a Recibir <span class="text-danger">*</span></label>
                        <input type="text" class="form-control modal-input-custom mb-2" placeholder="Escriba el nombre comercial, genérico o código..." oninput="searchModalProducts(this.value, 'rt_product_select')">
                        <select id="rt_product_select" class="form-select modal-select-list-custom" size="4" required>
                            <option value="" disabled selected>-- Escriba en el campo superior para buscar producto --</option>
                        </select>
                    </div>

                    <div class="row g-3 mb-3">
                        <div class="col-md-6">
                            <label class="modal-label-high-contrast">Sucursal de Origen <span class="text-danger">*</span></label>
                            <select id="rt_sucursal_origen" class="form-select modal-select-custom" required>
                                <option value="" disabled selected>-- Seleccione Sucursal de Origen --</option>
                                <?php foreach ($listaSucursales as $s): if ($s['id'] != $CONFIG_SUCURSAL_ID): ?>
                                    <option value="<?= $s['id'] ?>">🏬 <?= htmlspecialchars($s['nombre']) ?></option>
                                <?php endif; endforeach; ?>
                            </select>
                        </div>
                        <div class="col-md-6">
                            <label class="modal-label-high-contrast">Clasificación del Producto <span class="text-danger">*</span></label>
                            <select id="rt_clasificacion" class="form-select modal-select-custom" required>
                                <option value="facturado">🟢 Con Factura</option>
                                <option value="no_facturado">🔵 Sin Factura</option>
                                <option value="dorado">⭐ Dorado</option>
                            </select>
                        </div>
                    </div>

                    <div class="row g-3 mb-2">
                        <div class="col-md-4">
                            <label class="modal-label-high-contrast">Cantidad a Recibir <span class="text-danger">*</span></label>
                            <input type="number" min="1" id="rt_cantidad" class="form-control modal-input-custom text-center font-monospace fs-5" style="border-color: #06b6d4; color: #38bdf8;" value="1" onfocus="this.select()" required>
                        </div>
                        <div class="col-md-8">
                            <label class="modal-label-high-contrast">Observaciones / Nota</label>
                            <input type="text" id="rt_observaciones" class="form-control modal-input-custom" placeholder="Ej: Traslado por falta de stock en mostrador">
                        </div>
                    </div>
                </div>
                <div class="modal-footer modal-footer-custom">
                    <button type="button" class="btn btn-outline-light font-weight-bold px-4" data-bs-dismiss="modal">Cancelar</button>
                    <button type="submit" id="btnSaveReceiveTransfer" class="btn btn-cyan text-white fw-bold px-4 py-2"><i class="fa-solid fa-right-to-bracket me-2"></i> Confirmar Recepción (+)</button>
                </div>
            </form>
        </div>
    </div>
</div>

<!-- MODAL 3: ENVIAR TRASLADO A OTRA SUCURSAL -->
<div class="modal fade" id="sendTransferModal" tabindex="-1" aria-hidden="true">
    <div class="modal-dialog modal-dialog-centered modal-lg">
        <div class="modal-content modal-content-custom" style="--modal-border-color: #f59e0b;">
            <div class="modal-header modal-header-custom text-white">
                <h5 class="modal-title fw-bold text-warning fs-5"><i class="fa-solid fa-right-from-bracket me-2"></i> Enviar Traslado a Otra Sucursal</h5>
                <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Close"></button>
            </div>
            <form id="sendTransferForm" onsubmit="handleSendTransfer(event)">
                <div class="modal-body modal-body-custom">
                    <div class="alert alert-warning alert-high-contrast mb-4 text-white" style="background: rgba(245, 158, 11, 0.2); border: 1px solid #f59e0b;">
                        <i class="fa-solid fa-triangle-exclamation me-2 text-warning fs-5"></i> Al enviar, la cantidad <strong>se descontará</strong> del inventario activo de <strong><?= htmlspecialchars($nombreSucursalFija) ?></strong> y se sumará a la sucursal de destino seleccionada.
                    </div>

                    <div class="mb-3">
                        <label class="modal-label-high-contrast">Buscar Producto a Enviar <span class="text-danger">*</span></label>
                        <input type="text" class="form-control modal-input-custom mb-2" placeholder="Escriba el nombre comercial, genérico o código..." oninput="searchModalProducts(this.value, 'st_product_select')">
                        <select id="st_product_select" class="form-select modal-select-list-custom" size="4" required>
                            <option value="" disabled selected>-- Escriba en el campo superior para buscar producto --</option>
                        </select>
                    </div>

                    <div class="row g-3 mb-3">
                        <div class="col-md-6">
                            <label class="modal-label-high-contrast">Sucursal de Destino <span class="text-danger">*</span></label>
                            <select id="st_sucursal_destino" class="form-select modal-select-custom" required>
                                <option value="" disabled selected>-- Seleccione Sucursal de Destino --</option>
                                <?php foreach ($listaSucursales as $s): if ($s['id'] != $CONFIG_SUCURSAL_ID): ?>
                                    <option value="<?= $s['id'] ?>">🏬 <?= htmlspecialchars($s['nombre']) ?></option>
                                <?php endif; endforeach; ?>
                            </select>
                        </div>
                        <div class="col-md-6">
                            <label class="modal-label-high-contrast">Clasificación a Descontar <span class="text-danger">*</span></label>
                            <select id="st_clasificacion" class="form-select modal-select-custom" required>
                                <option value="facturado">🟢 Con Factura</option>
                                <option value="no_facturado">🔵 Sin Factura</option>
                                <option value="dorado">⭐ Dorado</option>
                            </select>
                        </div>
                    </div>

                    <div class="row g-3 mb-2">
                        <div class="col-md-4">
                            <label class="modal-label-high-contrast">Cantidad a Enviar <span class="text-danger">*</span></label>
                            <input type="number" min="1" id="st_cantidad" class="form-control modal-input-custom text-center font-monospace fs-5 border-warning" style="color: #fbbf24;" value="1" onfocus="this.select()" required>
                        </div>
                        <div class="col-md-8">
                            <label class="modal-label-high-contrast">Observaciones / Nota</label>
                            <input type="text" id="st_observaciones" class="form-control modal-input-custom" placeholder="Ej: Envío urgente por alta demanda">
                        </div>
                    </div>
                </div>
                <div class="modal-footer modal-footer-custom">
                    <button type="button" class="btn btn-outline-light font-weight-bold px-4" data-bs-dismiss="modal">Cancelar</button>
                    <button type="submit" id="btnSaveSendTransfer" class="btn btn-amber text-dark fw-bold px-4 py-2"><i class="fa-solid fa-right-from-bracket me-2"></i> Confirmar Envío (-)</button>
                </div>
            </form>
        </div>
    </div>
</div>

<!-- MODAL 4: RECIBIR NUEVOS INGRESOS (COMPRAS) -->
<div class="modal fade" id="newEntryModal" tabindex="-1" aria-hidden="true">
    <div class="modal-dialog modal-dialog-centered modal-lg">
        <div class="modal-content modal-content-custom" style="--modal-border-color: #8b5cf6;">
            <div class="modal-header modal-header-custom text-white">
                <h5 class="modal-title fw-bold fs-5" style="color: #c4b5fd;"><i class="fa-solid fa-boxes-packing me-2"></i> Registrar Nuevo Ingreso (Entrada de Proveedor)</h5>
                <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Close"></button>
            </div>
            <form id="newEntryForm" onsubmit="handleNewEntry(event)">
                <div class="modal-body modal-body-custom">
                    <div class="alert alert-purple alert-high-contrast mb-4 text-white" style="background: rgba(139, 92, 246, 0.25); border: 1px solid #8b5cf6;">
                        <i class="fa-solid fa-box-open me-2 fs-5" style="color: #c4b5fd;"></i> Registre la entrada directa de mercadería. La cantidad <strong>se sumará</strong> al inventario activo de <strong><?= htmlspecialchars($nombreSucursalFija) ?></strong>.
                    </div>

                    <div class="mb-3">
                        <label class="modal-label-high-contrast">Buscar Producto Ingresado <span class="text-danger">*</span></label>
                        <input type="text" class="form-control modal-input-custom mb-2" placeholder="Escriba el nombre comercial, genérico o código..." oninput="searchModalProducts(this.value, 'ne_product_select')">
                        <select id="ne_product_select" class="form-select modal-select-list-custom" size="4" required>
                            <option value="" disabled selected>-- Escriba en el campo superior para buscar producto --</option>
                        </select>
                    </div>

                    <div class="row g-3 mb-3">
                        <div class="col-md-6">
                            <label class="modal-label-high-contrast">Lugar de Compra / Proveedor</label>
                            <select id="ne_lugar_compra" class="form-select modal-select-custom">
                                <?php foreach ($listaLugaresCompra as $lc): ?>
                                    <option value="<?= $lc['id'] ?>" <?= $lc['id'] == 1 ? 'selected' : '' ?>>🏢 <?= htmlspecialchars($lc['nombre']) ?></option>
                                <?php endforeach; ?>
                            </select>
                        </div>
                        <div class="col-md-6">
                            <label class="modal-label-high-contrast">Clasificación a Ingresar <span class="text-danger">*</span></label>
                            <select id="ne_clasificacion" class="form-select modal-select-custom" required>
                                <option value="facturado">🟢 Con Factura</option>
                                <option value="no_facturado">🔵 Sin Factura</option>
                                <option value="dorado">⭐ Dorado</option>
                            </select>
                        </div>
                    </div>

                    <div class="row g-3 mb-2">
                        <div class="col-md-4">
                            <label class="modal-label-high-contrast">Cantidad Ingresada <span class="text-danger">*</span></label>
                            <input type="number" min="1" id="ne_cantidad" class="form-control modal-input-custom text-center font-monospace fs-5" style="border-color: #8b5cf6; color: #c4b5fd;" value="1" onfocus="this.select()" required>
                        </div>
                        <div class="col-md-8">
                            <label class="modal-label-high-contrast">No. Factura / Observaciones</label>
                            <input type="text" id="ne_observaciones" class="form-control modal-input-custom" placeholder="Ej: Factura No. 4589 de Droguería Central">
                        </div>
                    </div>
                </div>
                <div class="modal-footer modal-footer-custom">
                    <button type="button" class="btn btn-outline-light font-weight-bold px-4" data-bs-dismiss="modal">Cancelar</button>
                    <button type="submit" id="btnSaveNewEntry" class="btn btn-purple text-white fw-bold px-4 py-2"><i class="fa-solid fa-boxes-packing me-2"></i> Confirmar Ingreso (+)</button>
                </div>
            </form>
        </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>
    const activeSucursalId = <?= json_encode($CONFIG_SUCURSAL_ID) ?>;

    let productsData = []; 
    let currentPage = 1;
    let currentLimit = 15;
    let searchDebounceTimeout = null;
    let modalSearchTimeout = null;

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

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

        document.getElementById('filterSelect').addEventListener('change', () => {
            loadProducts(1);
        });

        document.getElementById('btnSearch').addEventListener('click', () => {
            loadProducts(1);
        });
    });

    // Búsqueda en tiempo real dentro de los Modales con alta visibilidad
    function searchModalProducts(query, selectId) {
        clearTimeout(modalSearchTimeout);
        const selectElem = document.getElementById(selectId);
        if (!query.trim()) {
            selectElem.innerHTML = '<option value="" disabled selected>-- Escriba en el campo superior para buscar producto --</option>';
            return;
        }

        modalSearchTimeout = setTimeout(async () => {
            try {
                const res = await fetch(`?action=search_products_modal&q=${encodeURIComponent(query.trim())}`);
                const json = await res.json();
                if (json.success && json.data) {
                    selectElem.innerHTML = '';
                    if (json.data.length === 0) {
                        selectElem.innerHTML = '<option value="" disabled selected>❌ No se encontraron productos coincidentes</option>';
                    } else {
                        json.data.forEach((p, idx) => {
                            const opt = document.createElement('option');
                            opt.value = p.id;
                            opt.textContent = `[${p.CodigoInterno || 'S/C'}] ${p.NombreComercial} (${p.laboratorio || 'Sin Lab'}) - Barras: ${p.CodigoBarra || '-'}`;
                            if (idx === 0) opt.selected = true;
                            selectElem.appendChild(opt);
                        });
                    }
                }
            } catch (e) {}
        }, 250);
    }

    // Cargar catálogo de productos y sus conteos desglosados
    async function loadProducts(page = 1) {
        currentPage = page;
        const q = document.getElementById('searchInput').value.trim();
        const filter = document.getElementById('filterSelect').value;
        const tbody = document.getElementById('productsTableBody');

        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>Buscando stock de productos para sucursal ${activeSucursalId}...</div>
                </td>
            </tr>
        `;

        try {
            const res = await fetch(`?action=search&sucursal_id=${activeSucursalId}&q=${encodeURIComponent(q)}&filter=${filter}&page=${page}&limit=${currentLimit}`);
            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;
            }

            productsData = json.data;
            renderProductsTable();
            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 tabla
    function renderProductsTable() {
        const tbody = document.getElementById('productsTableBody');
        tbody.innerHTML = '';

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

        productsData.forEach(p => {
            const tr = document.createElement('tr');
            tr.id = `row_${p.id}`;
            tr.className = 'tr-product';

            const cellCodigos = `
                <div class="mb-1"><span class="color-codigo-interno font-monospace">${escapeHtml(p.CodigoInterno || 'S/C')}</span></div>
                <div class="position-relative">
                    <input type="text" class="barcode-edit-input font-monospace" 
                           id="barcode_input_${p.id}" 
                           value="${escapeHtml(p.CodigoBarra || '')}" 
                           placeholder="📷 Escanear o escribir" 
                           title="Haga clic para editar o escanear el código de barras"
                           onblur="saveBarcodeInline(${p.id}, this.value)"
                           onkeydown="if(event.key === 'Enter') { this.blur(); }">
                    <div class="small text-success fw-bold d-none position-absolute" id="barcode_status_${p.id}" style="font-size: 0.65rem; top: -14px; right: 0;">✓ Guardado</div>
                </div>
            `;

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

            const cellBaseUnit = `
                <span class="badge-base-unit">${escapeHtml(p.unidad_base)}</span>
            `;

            const cellConteo = `
                <div class="d-flex align-items-center gap-3">
                    <div class="d-flex flex-column align-items-center">
                        <label class="small text-success fw-bold mb-1" style="font-size: 0.7rem;">🟢 Factura</label>
                        <input type="number" min="0" class="box-conteo-type box-facturado" 
                               id="q_fact_${p.id}" value="${p.cantidad_facturado}" 
                               onfocus="this.select()"
                               onblur="saveConteoBreakdown(${p.id})"
                               onkeydown="if(event.key === 'Enter') { this.blur(); }">
                    </div>

                    <div class="d-flex flex-column align-items-center">
                        <label class="small text-info fw-bold mb-1" style="font-size: 0.7rem;">🔵 Sin Factura</label>
                        <input type="number" min="0" class="box-conteo-type box-nofacturado" 
                               id="q_nofact_${p.id}" value="${p.cantidad_no_facturado}" 
                               onfocus="this.select()"
                               onblur="saveConteoBreakdown(${p.id})"
                               onkeydown="if(event.key === 'Enter') { this.blur(); }">
                    </div>

                    <div class="d-flex flex-column align-items-center">
                        <label class="small text-warning fw-bold mb-1" style="font-size: 0.7rem;">⭐ Dorado</label>
                        <input type="number" min="0" class="box-conteo-type box-dorado" 
                               id="q_dorado_${p.id}" value="${p.cantidad_dorado}" 
                               onfocus="this.select()"
                               onblur="saveConteoBreakdown(${p.id})"
                               onkeydown="if(event.key === 'Enter') { this.blur(); }">
                    </div>

                    <div class="d-flex flex-column align-items-center ps-2 border-start border-secondary">
                        <label class="small text-secondary fw-bold mb-1" style="font-size: 0.7rem;">Total</label>
                        <span class="badge bg-dark text-white border border-secondary fs-6" id="total_badge_${p.id}">${p.cantidad_contada}</span>
                    </div>
                </div>
            `;

            const cellFecha = `
                <div class="text-center" id="date_cell_${p.id}">
                    ${p.fecha_conteo ? `<span class="small text-secondary fw-semibold"><i class="fa-solid fa-clock text-success me-1"></i> ${p.fecha_conteo}</span>` : '<span class="text-secondary small italic" style="opacity: 0.5;">No contado</span>'}
                </div>
            `;

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

    // Registrar Nuevo Producto vía Modal AJAX
    async function handleCreateProduct(event) {
        event.preventDefault();
        const btnSave = document.getElementById('btnSaveNewProduct');
        const nombreComercial = document.getElementById('np_nombre_comercial').value.trim();
        const presentacionId = document.getElementById('np_presentacion_id').value;
        const nombreGenerico = document.getElementById('np_nombre_generico').value.trim();
        const laboratorio = document.getElementById('np_laboratorio').value.trim();
        const codigoBarra = document.getElementById('np_codigo_barra').value.trim();

        const qFact = Math.max(0, parseInt(document.getElementById('np_q_fact').value) || 0);
        const qNoFact = Math.max(0, parseInt(document.getElementById('np_q_nofact').value) || 0);
        const qDorado = Math.max(0, parseInt(document.getElementById('np_q_dorado').value) || 0);

        if (!nombreComercial) {
            Swal.fire('Atención', 'El Nombre Comercial es obligatorio.', 'warning');
            return;
        }

        btnSave.disabled = true;
        btnSave.innerHTML = '<i class="fa-solid fa-spinner fa-spin me-1"></i> Guardando...';

        try {
            const res = await fetch('?action=create_new_product', {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify({
                    nombre_comercial: nombreComercial,
                    presentacion_id: presentacionId,
                    nombre_generico: nombreGenerico,
                    laboratorio: laboratorio,
                    codigo_barra: codigoBarra,
                    cantidad_facturado: qFact,
                    cantidad_no_facturado: qNoFact,
                    cantidad_dorado: qDorado
                })
            });

            const data = await res.json();
            btnSave.disabled = false;
            btnSave.innerHTML = '<i class="fa-solid fa-floppy-disk me-1"></i> Guardar y Registrar';

            if (data.success) {
                const modalElem = document.getElementById('newProductModal');
                const modalInstance = bootstrap.Modal.getInstance(modalElem);
                if (modalInstance) modalInstance.hide();
                document.getElementById('newProductForm').reset();

                Swal.fire('¡Producto Creado!', data.message, 'success');
                document.getElementById('searchInput').value = nombreComercial;
                loadProducts(1);
            } else {
                Swal.fire('Error', data.error || 'No se pudo registrar el producto.', 'error');
            }
        } catch (err) {
            btnSave.disabled = false;
            btnSave.innerHTML = '<i class="fa-solid fa-floppy-disk me-1"></i> Guardar y Registrar';
            Swal.fire('Error de Red', err.message, 'error');
        }
    }

    // Procesar Recibir Traslado vía Modal AJAX
    async function handleReceiveTransfer(event) {
        event.preventDefault();
        const btnSave = document.getElementById('btnSaveReceiveTransfer');
        const productoId = document.getElementById('rt_product_select').value;
        const sucursalOrigenId = document.getElementById('rt_sucursal_origen').value;
        const clasificacion = document.getElementById('rt_clasificacion').value;
        const cantidad = parseInt(document.getElementById('rt_cantidad').value) || 0;
        const observaciones = document.getElementById('rt_observaciones').value.trim();

        if (!productoId) {
            Swal.fire('Atención', 'Debe seleccionar un producto.', 'warning');
            return;
        }

        btnSave.disabled = true;
        btnSave.innerHTML = '<i class="fa-solid fa-spinner fa-spin me-1"></i> Procesando...';

        try {
            const res = await fetch('?action=process_receive_transfer', {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify({
                    producto_id: productoId,
                    sucursal_origen_id: sucursalOrigenId,
                    clasificacion: clasificacion,
                    cantidad: cantidad,
                    observaciones: observaciones
                })
            });

            const data = await res.json();
            btnSave.disabled = false;
            btnSave.innerHTML = '<i class="fa-solid fa-right-to-bracket me-1"></i> Confirmar Recepción (+)';

            if (data.success) {
                const modalInstance = bootstrap.Modal.getInstance(document.getElementById('receiveTransferModal'));
                if (modalInstance) modalInstance.hide();
                document.getElementById('receiveTransferForm').reset();
                Swal.fire('¡Traslado Recibido!', data.message, 'success');
                loadProducts(currentPage);
            } else {
                Swal.fire('Error', data.error || 'No se pudo recibir el traslado.', 'error');
            }
        } catch (err) {
            btnSave.disabled = false;
            btnSave.innerHTML = '<i class="fa-solid fa-right-to-bracket me-1"></i> Confirmar Recepción (+)';
            Swal.fire('Error de Red', err.message, 'error');
        }
    }

    // Procesar Enviar Traslado vía Modal AJAX
    async function handleSendTransfer(event) {
        event.preventDefault();
        const btnSave = document.getElementById('btnSaveSendTransfer');
        const productoId = document.getElementById('st_product_select').value;
        const sucursalDestinoId = document.getElementById('st_sucursal_destino').value;
        const clasificacion = document.getElementById('st_clasificacion').value;
        const cantidad = parseInt(document.getElementById('st_cantidad').value) || 0;
        const observaciones = document.getElementById('st_observaciones').value.trim();

        if (!productoId) {
            Swal.fire('Atención', 'Debe seleccionar un producto.', 'warning');
            return;
        }

        btnSave.disabled = true;
        btnSave.innerHTML = '<i class="fa-solid fa-spinner fa-spin me-1"></i> Procesando...';

        try {
            const res = await fetch('?action=process_send_transfer', {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify({
                    producto_id: productoId,
                    sucursal_destino_id: sucursalDestinoId,
                    clasificacion: clasificacion,
                    cantidad: cantidad,
                    observaciones: observaciones
                })
            });

            const data = await res.json();
            btnSave.disabled = false;
            btnSave.innerHTML = '<i class="fa-solid fa-right-from-bracket me-1"></i> Confirmar Envío (-)';

            if (data.success) {
                const modalInstance = bootstrap.Modal.getInstance(document.getElementById('sendTransferModal'));
                if (modalInstance) modalInstance.hide();
                document.getElementById('sendTransferForm').reset();
                Swal.fire('¡Traslado Enviado!', data.message, 'success');
                loadProducts(currentPage);
            } else {
                Swal.fire('Error', data.error || 'No se pudo enviar el traslado.', 'error');
            }
        } catch (err) {
            btnSave.disabled = false;
            btnSave.innerHTML = '<i class="fa-solid fa-right-from-bracket me-1"></i> Confirmar Envío (-)';
            Swal.fire('Error de Red', err.message, 'error');
        }
    }

    // Procesar Nuevo Ingreso vía Modal AJAX
    async function handleNewEntry(event) {
        event.preventDefault();
        const btnSave = document.getElementById('btnSaveNewEntry');
        const productoId = document.getElementById('ne_product_select').value;
        const lugarCompraId = document.getElementById('ne_lugar_compra').value;
        const clasificacion = document.getElementById('ne_clasificacion').value;
        const cantidad = parseInt(document.getElementById('ne_cantidad').value) || 0;
        const observaciones = document.getElementById('ne_observaciones').value.trim();

        if (!productoId) {
            Swal.fire('Atención', 'Debe seleccionar un producto.', 'warning');
            return;
        }

        btnSave.disabled = true;
        btnSave.innerHTML = '<i class="fa-solid fa-spinner fa-spin me-1"></i> Procesando...';

        try {
            const res = await fetch('?action=process_new_entry', {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify({
                    producto_id: productoId,
                    lugar_compra_id: lugarCompraId,
                    clasificacion: clasificacion,
                    cantidad: cantidad,
                    observaciones: observaciones
                })
            });

            const data = await res.json();
            btnSave.disabled = false;
            btnSave.innerHTML = '<i class="fa-solid fa-boxes-packing me-1"></i> Confirmar Ingreso (+)';

            if (data.success) {
                const modalInstance = bootstrap.Modal.getInstance(document.getElementById('newEntryModal'));
                if (modalInstance) modalInstance.hide();
                document.getElementById('newEntryForm').reset();
                Swal.fire('¡Ingreso Registrado!', data.message, 'success');
                loadProducts(currentPage);
            } else {
                Swal.fire('Error', data.error || 'No se pudo registrar el ingreso.', 'error');
            }
        } catch (err) {
            btnSave.disabled = false;
            btnSave.innerHTML = '<i class="fa-solid fa-boxes-packing me-1"></i> Confirmar Ingreso (+)';
            Swal.fire('Error de Red', err.message, 'error');
        }
    }

    // Guardar Código de Barras en tiempo real
    async function saveBarcodeInline(productId, newVal) {
        const p = productsData.find(prod => prod.id === productId);
        if (!p) return;

        const val = newVal.trim();
        if ((p.CodigoBarra || '') === val) return;

        const oldVal = p.CodigoBarra;
        p.CodigoBarra = val;

        const statusElem = document.getElementById(`barcode_status_${productId}`);
        if (statusElem) statusElem.classList.remove('d-none');

        try {
            const res = await fetch('?action=save_barcode', {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify({
                    producto_id: productId,
                    codigo_barra: val
                })
            });

            const data = await res.json();
            if (data.success) {
                if (statusElem) {
                    statusElem.textContent = '✓ Guardado';
                    setTimeout(() => statusElem.classList.add('d-none'), 2000);
                }
            } else {
                p.CodigoBarra = oldVal;
                document.getElementById(`barcode_input_${productId}`).value = oldVal || '';
                if (statusElem) statusElem.classList.add('d-none');
                Swal.fire('Error', data.error || 'No se pudo guardar el código de barras.', 'error');
            }
        } catch (err) {
            p.CodigoBarra = oldVal;
            document.getElementById(`barcode_input_${productId}`).value = oldVal || '';
            if (statusElem) statusElem.classList.add('d-none');
            Swal.fire('Error de Red', err.message, 'error');
        }
    }

    // Guardar desglose de conteo
    async function saveConteoBreakdown(productId) {
        const p = productsData.find(prod => prod.id === productId);
        if (!p) return;

        const qFact = Math.max(0, parseInt(document.getElementById(`q_fact_${productId}`).value) || 0);
        const qNoFact = Math.max(0, parseInt(document.getElementById(`q_nofact_${productId}`).value) || 0);
        const qDorado = Math.max(0, parseInt(document.getElementById(`q_dorado_${productId}`).value) || 0);

        const newTotal = qFact + qNoFact + qDorado;

        if (p.cantidad_facturado === qFact && p.cantidad_no_facturado === qNoFact && p.cantidad_dorado === qDorado) {
            return;
        }

        p.cantidad_facturado = qFact;
        p.cantidad_no_facturado = qNoFact;
        p.cantidad_dorado = qDorado;
        p.cantidad_contada = newTotal;

        document.getElementById(`total_badge_${productId}`).textContent = newTotal;

        const success = await persistConteoBreakdownToServer(productId, qFact, qNoFact, qDorado);
        if (!success) {
            loadProducts(currentPage);
        }
    }

    // Persistir conteo desglosado
    async function persistConteoBreakdownToServer(productId, qFact, qNoFact, qDorado) {
        const dateCell = document.getElementById(`date_cell_${productId}`);
        dateCell.innerHTML = '<span class="text-info small"><i class="fa-solid fa-spinner fa-spin"></i> Guardando...</span>';

        try {
            const res = await fetch('?action=save_conteo', {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify({
                    sucursal_id: activeSucursalId,
                    producto_id: productId,
                    cantidad_facturado: qFact,
                    cantidad_no_facturado: qNoFact,
                    cantidad_dorado: qDorado
                })
            });

            const data = await res.json();
            if (data.success) {
                dateCell.innerHTML = `<span class="small text-success fw-bold animate__animated animate__flash"><i class="fa-solid fa-clock me-1"></i> ${data.fecha_conteo}</span>`;
                setTimeout(() => {
                    dateCell.innerHTML = `<span class="small text-secondary fw-semibold"><i class="fa-solid fa-clock text-success me-1"></i> ${data.fecha_conteo}</span>`;
                }, 2000);
                return true;
            } else {
                dateCell.innerHTML = '<span class="text-danger small"><i class="fa-solid fa-circle-exclamation"></i> Error</span>';
                Swal.fire('Error al guardar conteo', data.error || 'Ocurrió un error.', 'error');
                return false;
            }
        } catch (err) {
            dateCell.innerHTML = '<span class="text-danger small"><i class="fa-solid fa-triangle-exclamation"></i> Error Red</span>';
            Swal.fire('Error de red', err.message, 'error');
            return false;
        }
    }

    // Confirmar reinicio del inventario a CERO
    function confirmResetInventory() {
        Swal.fire({
            title: '¿Inicializar inventario a CERO?',
            text: "¡Esta acción pondrá en 0 el stock de todos los productos en todas las sucursales y borrará los conteos manuales previos para empezar desde cero!",
            icon: 'warning',
            showCancelButton: true,
            confirmButtonColor: '#ef4444',
            cancelButtonColor: '#64748b',
            confirmButtonText: 'Sí, reiniciar todo a CERO',
            cancelButtonText: 'Cancelar'
        }).then(async (result) => {
            if (result.isConfirmed) {
                try {
                    const res = await fetch('?action=reset_inventory', { method: 'POST' });
                    const data = await res.json();
                    if (data.success) {
                        Swal.fire('¡Inventario en Cero!', data.message, 'success').then(() => {
                            loadProducts(currentPage);
                        });
                    } else {
                        Swal.fire('Error', data.error || 'No se pudo reiniciar.', 'error');
                    }
                } catch (err) {
                    Swal.fire('Error de Red', err.message, 'error');
                }
            }
        });
    }

    // 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="loadProducts(${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="loadProducts(${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="loadProducts(${info.page + 1}); return false;"><i class="fa-solid fa-chevron-right"></i></a>`;
        list.appendChild(nextLi);
    }

    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>
