<?php
/**
 * API: Sincronización del Catálogo Completo para PWA Offline
 * Devuelve todos los productos esenciales para guardarse en Dexie.js
 */

// 1. Configuración de cabeceras y manejo de errores
ini_set('display_errors', 0); 
error_reporting(E_ALL); 
header('Content-Type: application/json; charset=utf-8');

require_once '../../db_connection.php';

$response = [
    'success' => false,
    'productos' => [],
    'total' => 0
];

try {
    // 1.1 Optimización de Caché: ETag (Evita descargar si no hay cambios)
    // Calculamos una firma rápida basada en el conteo y el ID máximo
    $stmtETag = $pdo->query("SELECT COUNT(*) as total, MAX(id) as max_id FROM productos WHERE estado = 1");
    $etagData = $stmtETag->fetch();
    $etag = md5($etagData['total'] . '-' . $etagData['max_id']);
    
    header("ETag: \"$etag\"");
    header("Cache-Control: public, max-age=3600"); // Cache por 1 hora
    
    if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && trim($_SERVER['HTTP_IF_NONE_MATCH'], '"') === $etag) {
        http_response_code(304); // Not Modified
        exit;
    }

    // 2. Obtener sucursal activa
    $config = require '../../config/sucursal_activa.php';
    $sucursal_id = $config['sucursal_id'];
    
    // 2. Consulta simplificada sin paginación (solo estado activo)
    // Para no saturar al inicio, priorizamos los productos más recientes o con stock, 
    // pero idealmente jalamos todos los activos.
    $sqlData = "
    SELECT 
        pf.id,
        COALESCE(pf.CodigoInterno, '') as codigo,
        COALESCE(pf.CodigoBarra, '') as codigo_barra,
        COALESCE(pf.NombreComercial, 'Sin Nombre') as nombre,
        COALESCE(pf.laboratorio, 'Genérico') as laboratorio,
        COALESCE(pcp.costo_promedio_unidad_base, 0) as costo_unitario_base,
        COALESCE(pf.imagen_producto, '') as imagen,
        COALESCE(pf.exento_iva, 0) as exento_iva,
        COALESCE(pf.receta_controlada, 0) as receta_controlada,
        COALESCE(inv.stock_total, 0) as stock
    FROM (
        SELECT id, CodigoInterno, CodigoBarra, NombreComercial, laboratorio, 
               exento_iva, imagen_producto, receta_controlada
        FROM productos
        WHERE estado = 1
    ) as pf
    LEFT JOIN productos_costo_promedio pcp ON pf.id = pcp.producto_id
    LEFT JOIN inventario_sucursal inv ON pf.id = inv.producto_id AND inv.sucursal_id = :sucursal_id_inv";

    $stmt = $pdo->prepare($sqlData);
    $stmt->bindValue(':sucursal_id_inv', $sucursal_id, PDO::PARAM_INT);
    $stmt->execute();
    $productos = $stmt->fetchAll();

    // Fetch all active presentations grouped by product_id
    $sqlPres = "
        SELECT pp.producto_id, pp.presentacion_id, pp.factor_conversion, pp.precio_venta, pp.es_facturable, pp.es_unidad_base, pp.orden, pr.nombre as nombre_presentacion
        FROM producto_presentaciones pp
        JOIN presentaciones pr ON pp.presentacion_id = pr.id
        WHERE pp.activo = 1
        ORDER BY pp.producto_id, pp.es_unidad_base DESC, pp.orden ASC, pp.presentacion_id ASC
    ";
    $stmtPres = $pdo->query($sqlPres);
    $presentations = [];
    while ($presRow = $stmtPres->fetch(PDO::FETCH_ASSOC)) {
        $presentations[$presRow['producto_id']][] = $presRow;
    }

    $productosFormateados = [];
    foreach ($productos as $row) {
        $costo_base = (float)$row['costo_unitario_base'];
        $productId = (int)$row['id'];
        
        $prodPres = isset($presentations[$productId]) ? $presentations[$productId] : [];
        
        $base = null;
        $others = [];
        
        foreach ($prodPres as $p) {
            if ((int)$p['es_unidad_base'] === 1 && $base === null) {
                $base = $p;
            } else {
                $others[] = $p;
            }
        }
        
        // Fallback if no base presentation is marked as es_unidad_base
        if ($base === null && !empty($prodPres)) {
            $base = array_shift($prodPres);
            $others = $prodPres;
        }
        
        // Defaults
        $precio_unidad = 0.0;
        $precio_blister = 0.0;
        $precio_caja = 0.0;
        
        $nombre_unidad = 'Unidad';
        $nombre_blister = 'Blíster';
        $nombre_caja = 'Caja';
        
        $factor_blister = 1;
        $factor_caja = 1;
        
        $facturable_unidad = 1;
        $facturable_blister = 1;
        $facturable_caja = 1;
        
        if ($base !== null) {
            $precio_unidad = (float)$base['precio_venta'];
            $nombre_unidad = $base['nombre_presentacion'];
            $facturable_unidad = (int)$base['es_facturable'];
        }
        
        if (isset($others[0])) {
            $precio_blister = (float)$others[0]['precio_venta'];
            $nombre_blister = $others[0]['nombre_presentacion'];
            $factor_blister = (int)$others[0]['factor_conversion'];
            $facturable_blister = (int)$others[0]['es_facturable'];
        }
        
        if (isset($others[1])) {
            $precio_caja = (float)$others[1]['precio_venta'];
            $nombre_caja = $others[1]['nombre_presentacion'];
            $factor_caja = (int)$others[1]['factor_conversion'];
            $facturable_caja = (int)$others[1]['es_facturable'];
        }
        
        $productosFormateados[] = [
            'id' => $productId,
            'codigo' => $row['codigo'],
            'codigo_barra' => $row['codigo_barra'],
            'nombre' => $row['nombre'],
            'laboratorio' => $row['laboratorio'],
            'stock' => (int)$row['stock'],
            'imagen' => $row['imagen'],
            'exento_iva' => (int)$row['exento_iva'],
            'receta_controlada' => (int)$row['receta_controlada'],
            'precios' => [
                'unidad' => $precio_unidad,
                'blister' => $precio_blister,
                'misto' => 0.0,
                'caja' => $precio_caja
            ],
            'nombres' => [
                'unidad' => $nombre_unidad,
                'blister' => $nombre_blister,
                'caja' => $nombre_caja
            ],
            'costos' => [
                'unidad' => $costo_base,
                'blister' => $costo_base * $factor_blister,
                'misto' => $costo_base,
                'caja' => $costo_base * $factor_caja
            ],
            'es_facturable' => [
                'unidad' => $facturable_unidad,
                'blister' => $facturable_blister,
                'caja' => $facturable_caja
            ],
            'factor_blister' => $factor_blister,
            'factor_caja' => $factor_caja
        ];
    }

    $response['success'] = true;
    $response['productos'] = $productosFormateados;
    $response['total'] = count($productosFormateados);

} catch (Exception $e) {
    $response['success'] = false;
    $response['error'] = 'Error del servidor: ' . $e->getMessage();
}

// Salida JSON final
echo json_encode($response, JSON_UNESCAPED_UNICODE | JSON_PARTIAL_OUTPUT_ON_ERROR);
?>
