<?php
if (!defined('BASEPATH')) {
    http_response_code(403);
    die(json_encode(["success" => false, "message" => "Acceso directo no permitido"]));
}

switch ($tipo) {
    case 'getProductos':
        $sql = "SELECT p.*, c.nombre as categoria_nombre
                FROM productos p
                LEFT JOIN categorias_productos c ON p.categoria_id = c.id
                WHERE p.activo = 1
                ORDER BY c.orden, p.nombre ASC";
        $result = mysqli_query($conn, $sql);

        if ($result) {
            $productos = [];
            while ($row = mysqli_fetch_assoc($result)) {
                $productos[] = [
                    'id' => (int)$row['id'],
                    'nombre' => $row['nombre'],
                    'descripcion' => $row['descripcion'],
                    'precio' => (float)$row['precio'],
                    'categoria_id' => (int)$row['categoria_id'],
                    'categoria' => $row['categoria_nombre'],
                    'unidad' => $row['unidad'],
                    'stock' => (float)$row['stock'],
                    'stockMinimo' => (float)$row['stock_minimo'],
                    'codigo' => $row['codigo'],
                    'imagen' => $row['imagen'],
                    'tiene_receta' => (int)($row['tiene_receta'] ?? 0),
                    'envasado_origen' => (int)($row['envasado_origen'] ?? 0),
                    'contabilizar_corte' => (int)($row['contabilizar_corte'] ?? 1),
                    'contar_al_inicio' => (int)($row['contar_al_inicio'] ?? 0),
                    'no_venta' => (int)($row['no_venta'] ?? 0),
                    'no_descuento_inventario' => (int)($row['no_descuento_inventario'] ?? 0),
                    'productos_salida' => (int)($row['productos_salida'] ?? 0),
                    'produccion_directa' => (int)($row['produccion_directa'] ?? 0)
                ];
            }
            sendResponse(true, "Productos obtenidos", $productos);
        } else {
            sendResponse(false, "Error al obtener productos: " . mysqli_error($conn));
        }
        break;

    case 'getProducto':
        $id = isset($datapost['id']) ? (int)$datapost['id'] : 0;

        if ($id <= 0) {
            sendResponse(false, "ID de producto no valido");
        }

        $sql = "SELECT p.*, c.nombre as categoria_nombre
                FROM productos p
                LEFT JOIN categorias_productos c ON p.categoria_id = c.id
                WHERE p.id = $id AND p.activo = 1";
        $result = mysqli_query($conn, $sql);

        if ($result && mysqli_num_rows($result) > 0) {
            $row = mysqli_fetch_assoc($result);
            $producto = [
                'id' => (int)$row['id'],
                'nombre' => $row['nombre'],
                'descripcion' => $row['descripcion'],
                'precio' => (float)$row['precio'],
                'categoria_id' => (int)$row['categoria_id'],
                'categoria' => $row['categoria_nombre'],
                'unidad' => $row['unidad'],
                'stock' => (float)$row['stock'],
                'stockMinimo' => (float)$row['stock_minimo'],
                'codigo' => $row['codigo'],
                'imagen' => $row['imagen']
            ];
            sendResponse(true, "Producto encontrado", $producto);
        } else {
            sendResponse(false, "Producto no encontrado");
        }
        break;

    case 'crearProducto':
        $nombre = isset($datapost['nombre']) ? mysqli_real_escape_string($conn, $datapost['nombre']) : '';
        $descripcion = isset($datapost['descripcion']) ? mysqli_real_escape_string($conn, $datapost['descripcion']) : '';
        $precio = isset($datapost['precio']) ? (float)$datapost['precio'] : 0;
        $categoria_id = isset($datapost['categoria_id']) ? (int)$datapost['categoria_id'] : null;
        $unidad = isset($datapost['unidad']) ? mysqli_real_escape_string($conn, $datapost['unidad']) : 'pza';
        $stock = isset($datapost['stock']) ? (float)$datapost['stock'] : 0;
        $stockMinimo = isset($datapost['stockMinimo']) ? (float)$datapost['stockMinimo'] : 0;
        $codigo = isset($datapost['codigo']) ? mysqli_real_escape_string($conn, $datapost['codigo']) : '';
        $envasado_origen = isset($datapost['envasado_origen']) ? (int)$datapost['envasado_origen'] : 0;
        $contabilizar_corte = isset($datapost['contabilizar_corte']) ? (int)$datapost['contabilizar_corte'] : 1;
        $contar_al_inicio = isset($datapost['contar_al_inicio']) ? (int)$datapost['contar_al_inicio'] : 0;
        $no_venta = isset($datapost['no_venta']) ? (int)$datapost['no_venta'] : 0;
        $no_descuento_inventario = isset($datapost['no_descuento_inventario']) ? (int)$datapost['no_descuento_inventario'] : 0;
        $productos_salida = isset($datapost['productos_salida']) ? (int)$datapost['productos_salida'] : 0;
        $produccion_directa = isset($datapost['produccion_directa']) ? (int)$datapost['produccion_directa'] : 0;

        if (empty($nombre)) {
            sendResponse(false, "El nombre es requerido");
        }

        $cat_value = $categoria_id ? $categoria_id : 'NULL';

        $sql = "INSERT INTO productos (nombre, descripcion, precio, categoria_id, unidad, stock, stock_minimo, codigo, envasado_origen, contabilizar_corte, contar_al_inicio, no_venta, no_descuento_inventario, productos_salida, produccion_directa)
                VALUES ('$nombre', '$descripcion', $precio, $cat_value, '$unidad', $stock, $stockMinimo, '$codigo', $envasado_origen, $contabilizar_corte, $contar_al_inicio, $no_venta, $no_descuento_inventario, $productos_salida, $produccion_directa)";

        if (mysqli_query($conn, $sql)) {
            $nuevoId = mysqli_insert_id($conn);
            sendResponse(true, "Producto creado correctamente", ['id' => $nuevoId]);
        } else {
            sendResponse(false, "Error al crear producto: " . mysqli_error($conn));
        }
        break;

    case 'actualizarProducto':
        $id = isset($datapost['id']) ? (int)$datapost['id'] : 0;
        $nombre = isset($datapost['nombre']) ? mysqli_real_escape_string($conn, $datapost['nombre']) : '';
        $descripcion = isset($datapost['descripcion']) ? mysqli_real_escape_string($conn, $datapost['descripcion']) : '';
        $precio = isset($datapost['precio']) ? (float)$datapost['precio'] : 0;
        $categoria_id = isset($datapost['categoria_id']) ? (int)$datapost['categoria_id'] : null;
        $unidad = isset($datapost['unidad']) ? mysqli_real_escape_string($conn, $datapost['unidad']) : 'pza';
        $stock = isset($datapost['stock']) ? (float)$datapost['stock'] : 0;
        $stockMinimo = isset($datapost['stockMinimo']) ? (float)$datapost['stockMinimo'] : 0;
        $codigo = isset($datapost['codigo']) ? mysqli_real_escape_string($conn, $datapost['codigo']) : '';
        $envasado_origen = isset($datapost['envasado_origen']) ? (int)$datapost['envasado_origen'] : 0;
        $contabilizar_corte = isset($datapost['contabilizar_corte']) ? (int)$datapost['contabilizar_corte'] : 1;
        $contar_al_inicio = isset($datapost['contar_al_inicio']) ? (int)$datapost['contar_al_inicio'] : 0;
        $no_venta = isset($datapost['no_venta']) ? (int)$datapost['no_venta'] : 0;
        $no_descuento_inventario = isset($datapost['no_descuento_inventario']) ? (int)$datapost['no_descuento_inventario'] : 0;
        $productos_salida = isset($datapost['productos_salida']) ? (int)$datapost['productos_salida'] : 0;
        $produccion_directa = isset($datapost['produccion_directa']) ? (int)$datapost['produccion_directa'] : 0;

        if ($id <= 0) {
            sendResponse(false, "ID de producto no valido");
        }

        if (empty($nombre)) {
            sendResponse(false, "El nombre es requerido");
        }

        $cat_value = $categoria_id ? $categoria_id : 'NULL';

        $sql = "UPDATE productos SET
                nombre = '$nombre',
                descripcion = '$descripcion',
                precio = $precio,
                categoria_id = $cat_value,
                unidad = '$unidad',
                stock = $stock,
                stock_minimo = $stockMinimo,
                codigo = '$codigo',
                envasado_origen = $envasado_origen,
                contabilizar_corte = $contabilizar_corte,
                contar_al_inicio = $contar_al_inicio,
                no_venta = $no_venta,
                no_descuento_inventario = $no_descuento_inventario,
                productos_salida = $productos_salida,
                produccion_directa = $produccion_directa,
                updated_at = NOW()
                WHERE id = $id";

        if (mysqli_query($conn, $sql)) {
            sendResponse(true, "Producto actualizado correctamente");
        } else {
            sendResponse(false, "Error al actualizar producto: " . mysqli_error($conn));
        }
        break;

    case 'eliminarProducto':
        $id = isset($datapost['id']) ? (int)$datapost['id'] : 0;

        if ($id <= 0) {
            sendResponse(false, "ID de producto no valido");
        }

        // Soft delete
        $sql = "UPDATE productos SET activo = 0, updated_at = NOW() WHERE id = $id";

        if (mysqli_query($conn, $sql)) {
            sendResponse(true, "Producto eliminado correctamente");
        } else {
            sendResponse(false, "Error al eliminar producto: " . mysqli_error($conn));
        }
        break;

    case 'getCategoriasProductos':
        $sql = "SELECT cp.*,
                (SELECT COUNT(*) FROM productos p WHERE p.categoria_id = cp.id AND p.activo = 1) as total_productos
                FROM categorias_productos cp
                WHERE cp.activo = 1
                ORDER BY cp.orden, cp.nombre ASC";
        $result = mysqli_query($conn, $sql);

        if ($result) {
            $categorias = [];
            while ($row = mysqli_fetch_assoc($result)) {
                $categorias[] = [
                    'id' => (int)$row['id'],
                    'nombre' => $row['nombre'],
                    'descripcion' => $row['descripcion'],
                    'color' => $row['color'] ?? '#f97316',
                    'orden' => (int)$row['orden'],
                    'total_productos' => (int)$row['total_productos']
                ];
            }
            sendResponse(true, "Categorias obtenidas", $categorias);
        } else {
            sendResponse(false, "Error al obtener categorias: " . mysqli_error($conn));
        }
        break;

    case 'crearCategoriaProducto':
        $nombre = isset($datapost['nombre']) ? mysqli_real_escape_string($conn, $datapost['nombre']) : '';
        $descripcion = isset($datapost['descripcion']) ? mysqli_real_escape_string($conn, $datapost['descripcion']) : '';
        $color = isset($datapost['color']) ? mysqli_real_escape_string($conn, $datapost['color']) : '#f97316';

        if (empty($nombre)) {
            sendResponse(false, "El nombre es requerido");
        }

        // Verificar si ya existe
        $checkSql = "SELECT id FROM categorias_productos WHERE nombre = '$nombre' AND activo = 1";
        $checkResult = mysqli_query($conn, $checkSql);
        if ($checkResult && mysqli_num_rows($checkResult) > 0) {
            sendResponse(false, "Ya existe una categoria con ese nombre");
        }

        // Obtener el siguiente orden
        $ordenSql = "SELECT COALESCE(MAX(orden), 0) + 1 as siguiente FROM categorias_productos";
        $ordenResult = mysqli_query($conn, $ordenSql);
        $ordenRow = mysqli_fetch_assoc($ordenResult);
        $orden = $ordenRow['siguiente'];

        $sql = "INSERT INTO categorias_productos (nombre, descripcion, color, orden)
                VALUES ('$nombre', '$descripcion', '$color', $orden)";

        if (mysqli_query($conn, $sql)) {
            $nuevoId = mysqli_insert_id($conn);
            sendResponse(true, "Categoria creada correctamente", ['id' => $nuevoId]);
        } else {
            sendResponse(false, "Error al crear categoria: " . mysqli_error($conn));
        }
        break;

    case 'actualizarCategoriaProducto':
        $id = isset($datapost['id']) ? (int)$datapost['id'] : 0;
        $nombre = isset($datapost['nombre']) ? mysqli_real_escape_string($conn, $datapost['nombre']) : '';
        $descripcion = isset($datapost['descripcion']) ? mysqli_real_escape_string($conn, $datapost['descripcion']) : '';
        $color = isset($datapost['color']) ? mysqli_real_escape_string($conn, $datapost['color']) : '#f97316';

        if ($id <= 0) {
            sendResponse(false, "ID de categoria no valido");
        }

        if (empty($nombre)) {
            sendResponse(false, "El nombre es requerido");
        }

        // Verificar si ya existe otra con ese nombre
        $checkSql = "SELECT id FROM categorias_productos WHERE nombre = '$nombre' AND id != $id AND activo = 1";
        $checkResult = mysqli_query($conn, $checkSql);
        if ($checkResult && mysqli_num_rows($checkResult) > 0) {
            sendResponse(false, "Ya existe otra categoria con ese nombre");
        }

        $sql = "UPDATE categorias_productos SET
                nombre = '$nombre',
                descripcion = '$descripcion',
                color = '$color',
                updated_at = NOW()
                WHERE id = $id";

        if (mysqli_query($conn, $sql)) {
            sendResponse(true, "Categoria actualizada correctamente");
        } else {
            sendResponse(false, "Error al actualizar categoria: " . mysqli_error($conn));
        }
        break;

    case 'eliminarCategoriaProducto':
        $id = isset($datapost['id']) ? (int)$datapost['id'] : 0;

        if ($id <= 0) {
            sendResponse(false, "ID de categoria no valido");
        }

        // Soft delete - los productos quedan con categoria_id pero la categoria inactiva
        $sql = "UPDATE categorias_productos SET activo = 0, updated_at = NOW() WHERE id = $id";

        if (mysqli_query($conn, $sql)) {
            // Opcional: quitar la categoria de los productos
            mysqli_query($conn, "UPDATE productos SET categoria_id = NULL WHERE categoria_id = $id");
            sendResponse(true, "Categoria eliminada correctamente");
        } else {
            sendResponse(false, "Error al eliminar categoria: " . mysqli_error($conn));
        }
        break;

    case 'buscarProductos':
        $busqueda = isset($datapost['busqueda']) ? mysqli_real_escape_string($conn, $datapost['busqueda']) : '';

        $sql = "SELECT p.*, c.nombre as categoria_nombre
                FROM productos p
                LEFT JOIN categorias_productos c ON p.categoria_id = c.id
                WHERE p.activo = 1
                AND (p.nombre LIKE '%$busqueda%' OR p.codigo LIKE '%$busqueda%' OR p.descripcion LIKE '%$busqueda%')
                ORDER BY p.nombre ASC
                LIMIT 50";
        $result = mysqli_query($conn, $sql);

        if ($result) {
            $productos = [];
            while ($row = mysqli_fetch_assoc($result)) {
                $productos[] = [
                    'id' => (int)$row['id'],
                    'nombre' => $row['nombre'],
                    'descripcion' => $row['descripcion'],
                    'precio' => (float)$row['precio'],
                    'categoria_id' => (int)$row['categoria_id'],
                    'categoria' => $row['categoria_nombre'],
                    'unidad' => $row['unidad'],
                    'stock' => (float)$row['stock'],
                    'stockMinimo' => (float)$row['stock_minimo'],
                    'codigo' => $row['codigo']
                ];
            }
            sendResponse(true, "Productos encontrados", $productos);
        } else {
            sendResponse(false, "Error en busqueda: " . mysqli_error($conn));
        }
        break;

    case 'actualizarStock':
        $id = isset($datapost['id']) ? (int)$datapost['id'] : 0;
        $cantidad = isset($datapost['cantidad']) ? (float)$datapost['cantidad'] : 0;
        $operacion = isset($datapost['operacion']) ? $datapost['operacion'] : 'set'; // set, add, subtract

        if ($id <= 0) {
            sendResponse(false, "ID de producto no valido");
        }

        switch ($operacion) {
            case 'add':
                $sql = "UPDATE productos SET stock = stock + $cantidad, updated_at = NOW() WHERE id = $id";
                break;
            case 'subtract':
                $sql = "UPDATE productos SET stock = stock - $cantidad, updated_at = NOW() WHERE id = $id";
                break;
            default:
                $sql = "UPDATE productos SET stock = $cantidad, updated_at = NOW() WHERE id = $id";
        }

        if (mysqli_query($conn, $sql)) {
            sendResponse(true, "Stock actualizado correctamente");
        } else {
            sendResponse(false, "Error al actualizar stock: " . mysqli_error($conn));
        }
        break;

    default:
        sendResponse(false, "Operacion no valida en Productos");
        break;
}
