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

switch ($tipo) {
    case 'getCompras':
        $sql = "SELECT c.*, u.nombre as usuario_nombre,
                (SELECT COUNT(*) FROM compra_items WHERE compra_id = c.id) as total_items
                FROM compras c
                LEFT JOIN usuarios u ON c.usuario_id = u.id
                ORDER BY c.fecha DESC, c.created_at DESC";
        $result = mysqli_query($conn, $sql);

        if ($result) {
            $compras = [];
            while ($row = mysqli_fetch_assoc($result)) {
                $compras[] = [
                    'id' => (int)$row['id'],
                    'proveedor' => $row['proveedor'],
                    'metodo_pago' => $row['metodo_pago'],
                    'total' => (float)$row['total'],
                    'observaciones' => $row['observaciones'],
                    'fecha' => $row['fecha'],
                    'usuario_id' => (int)$row['usuario_id'],
                    'usuario_nombre' => $row['usuario_nombre'] ?: 'Desconocido',
                    'total_items' => (int)$row['total_items']
                ];
            }
            sendResponse(true, "Compras obtenidas", $compras);
        } else {
            sendResponse(false, "Error al obtener compras: " . mysqli_error($conn));
        }
        break;

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

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

        // Obtener cabecera
        $sql = "SELECT c.*, u.nombre as usuario_nombre
                FROM compras c
                LEFT JOIN usuarios u ON c.usuario_id = u.id
                WHERE c.id = $id";
        $result = mysqli_query($conn, $sql);

        if (!$result || mysqli_num_rows($result) === 0) {
            sendResponse(false, "Compra no encontrada");
        }

        $row = mysqli_fetch_assoc($result);
        $compra = [
            'id' => (int)$row['id'],
            'proveedor' => $row['proveedor'],
            'metodo_pago' => $row['metodo_pago'],
            'total' => (float)$row['total'],
            'observaciones' => $row['observaciones'],
            'fecha' => $row['fecha'],
            'usuario_nombre' => $row['usuario_nombre'] ?: 'Desconocido',
            'items' => []
        ];

        // Obtener items
        $sqlItems = "SELECT * FROM compra_items WHERE compra_id = $id";
        $resultItems = mysqli_query($conn, $sqlItems);

        if ($resultItems) {
            while ($item = mysqli_fetch_assoc($resultItems)) {
                // Obtener nombre del item
                $itemNombre = '';
                if ($item['tipo_item'] === 'producto') {
                    $nameResult = mysqli_query($conn, "SELECT nombre FROM productos WHERE id = " . (int)$item['item_id']);
                    if ($nameRow = mysqli_fetch_assoc($nameResult)) {
                        $itemNombre = $nameRow['nombre'];
                    }
                } else {
                    $nameResult = mysqli_query($conn, "SELECT nombre FROM ingredientes WHERE id = " . (int)$item['item_id']);
                    if ($nameRow = mysqli_fetch_assoc($nameResult)) {
                        $itemNombre = $nameRow['nombre'];
                    }
                }

                $compra['items'][] = [
                    'id' => (int)$item['id'],
                    'tipo_item' => $item['tipo_item'],
                    'item_id' => (int)$item['item_id'],
                    'item_nombre' => $itemNombre ?: 'Item eliminado',
                    'cantidad' => (float)$item['cantidad'],
                    'unidad' => $item['unidad'],
                    'precio_unitario' => (float)$item['precio_unitario'],
                    'subtotal' => (float)$item['subtotal']
                ];
            }
        }

        sendResponse(true, "Detalle de compra", $compra);
        break;

    case 'registrarCompra':
        $proveedor = isset($datapost['proveedor']) ? mysqli_real_escape_string($conn, $datapost['proveedor']) : '';
        $metodo_pago = isset($datapost['metodo_pago']) ? mysqli_real_escape_string($conn, $datapost['metodo_pago']) : 'efectivo';
        $observaciones = isset($datapost['observaciones']) ? mysqli_real_escape_string($conn, $datapost['observaciones']) : '';
        $total = isset($datapost['total']) ? (float)$datapost['total'] : 0;
        $usuario_id = isset($datapost['usuario_id']) ? (int)$datapost['usuario_id'] : 0;
        $items = isset($datapost['items']) ? $datapost['items'] : [];

        if (empty($items)) {
            sendResponse(false, "La compra debe tener al menos un item");
        }

        $fecha = date('Y-m-d');

        // Iniciar transaccion
        mysqli_begin_transaction($conn);

        try {
            // Insertar cabecera
            $sql = "INSERT INTO compras (proveedor, metodo_pago, total, observaciones, fecha, usuario_id)
                    VALUES ('$proveedor', '$metodo_pago', $total, '$observaciones', '$fecha', $usuario_id)";

            if (!mysqli_query($conn, $sql)) {
                throw new Exception("Error al crear compra: " . mysqli_error($conn));
            }

            $compra_id = mysqli_insert_id($conn);

            // Insertar items y actualizar stock
            foreach ($items as $item) {
                $tipo_item = mysqli_real_escape_string($conn, $item['tipo_item']);
                $item_id = (int)$item['item_id'];
                $cantidad = (float)$item['cantidad'];
                $precio_unitario = (float)$item['precio_unitario'];
                $unidad = mysqli_real_escape_string($conn, $item['unidad']);
                $subtotal = $cantidad * $precio_unitario;

                if (!in_array($tipo_item, ['producto', 'ingrediente'])) {
                    throw new Exception("Tipo de item no valido: $tipo_item");
                }

                if ($cantidad <= 0 || $precio_unitario <= 0) {
                    throw new Exception("Cantidad y precio deben ser mayores a 0");
                }

                // Insertar item
                $sqlItem = "INSERT INTO compra_items (compra_id, tipo_item, item_id, cantidad, unidad, precio_unitario, subtotal)
                            VALUES ($compra_id, '$tipo_item', $item_id, $cantidad, '$unidad', $precio_unitario, $subtotal)";

                if (!mysqli_query($conn, $sqlItem)) {
                    throw new Exception("Error al insertar item: " . mysqli_error($conn));
                }

                // Actualizar stock
                if ($tipo_item === 'producto') {
                    $sqlStock = "UPDATE productos SET stock = stock + $cantidad, updated_at = NOW() WHERE id = $item_id";
                } else {
                    $sqlStock = "UPDATE ingredientes SET cantidad = cantidad + $cantidad, updated_at = NOW() WHERE id = $item_id";
                }

                if (!mysqli_query($conn, $sqlStock)) {
                    throw new Exception("Error al actualizar stock: " . mysqli_error($conn));
                }
            }

            mysqli_commit($conn);
            sendResponse(true, "Compra registrada correctamente", ['id' => $compra_id]);

        } catch (Exception $e) {
            mysqli_rollback($conn);
            sendResponse(false, $e->getMessage());
        }
        break;

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

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

        // Verificar que existe
        $checkResult = mysqli_query($conn, "SELECT id FROM compras WHERE id = $id");
        if (!$checkResult || mysqli_num_rows($checkResult) === 0) {
            sendResponse(false, "Compra no encontrada");
        }

        mysqli_begin_transaction($conn);

        try {
            // Obtener items para revertir stock
            $itemsResult = mysqli_query($conn, "SELECT * FROM compra_items WHERE compra_id = $id");

            if ($itemsResult) {
                while ($item = mysqli_fetch_assoc($itemsResult)) {
                    $tipo_item = $item['tipo_item'];
                    $item_id = (int)$item['item_id'];
                    $cantidad = (float)$item['cantidad'];

                    if ($tipo_item === 'producto') {
                        mysqli_query($conn, "UPDATE productos SET stock = stock - $cantidad, updated_at = NOW() WHERE id = $item_id");
                    } else {
                        mysqli_query($conn, "UPDATE ingredientes SET cantidad = cantidad - $cantidad, updated_at = NOW() WHERE id = $item_id");
                    }
                }
            }

            // Eliminar items
            mysqli_query($conn, "DELETE FROM compra_items WHERE compra_id = $id");

            // Eliminar cabecera
            mysqli_query($conn, "DELETE FROM compras WHERE id = $id");

            mysqli_commit($conn);
            sendResponse(true, "Compra eliminada y stock revertido");

        } catch (Exception $e) {
            mysqli_rollback($conn);
            sendResponse(false, "Error al eliminar compra: " . $e->getMessage());
        }
        break;

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