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

switch ($tipo) {

    // ===================== SUCURSALES =====================
    case 'getSucursales':
        $sql = "SELECT * FROM sucursales WHERE activo = 1 ORDER BY nombre ASC";
        $result = mysqli_query($conn, $sql);

        if ($result) {
            $sucursales = [];
            while ($row = mysqli_fetch_assoc($result)) {
                $sucursales[] = [
                    'id' => (int)$row['id'],
                    'nombre' => $row['nombre'],
                    'direccion' => $row['direccion'],
                    'telefono' => $row['telefono']
                ];
            }
            sendResponse(true, "Sucursales obtenidas", $sucursales);
        } else {
            sendResponse(false, "Error al obtener sucursales: " . mysqli_error($conn));
        }
        break;

    case 'crearSucursal':
        $nombre = isset($datapost['nombre']) ? mysqli_real_escape_string($conn, $datapost['nombre']) : '';
        $direccion = isset($datapost['direccion']) ? mysqli_real_escape_string($conn, $datapost['direccion']) : '';
        $telefono = isset($datapost['telefono']) ? mysqli_real_escape_string($conn, $datapost['telefono']) : '';

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

        $check = "SELECT id FROM sucursales WHERE nombre = '$nombre' AND activo = 1";
        $checkR = mysqli_query($conn, $check);
        if ($checkR && mysqli_num_rows($checkR) > 0) {
            sendResponse(false, "Ya existe una sucursal con ese nombre");
        }

        $sql = "INSERT INTO sucursales (nombre, direccion, telefono) VALUES ('$nombre', '$direccion', '$telefono')";
        if (mysqli_query($conn, $sql)) {
            sendResponse(true, "Sucursal creada correctamente", ['id' => mysqli_insert_id($conn)]);
        } else {
            sendResponse(false, "Error al crear sucursal: " . mysqli_error($conn));
        }
        break;

    case 'actualizarSucursal':
        $id = isset($datapost['id']) ? (int)$datapost['id'] : 0;
        $nombre = isset($datapost['nombre']) ? mysqli_real_escape_string($conn, $datapost['nombre']) : '';
        $direccion = isset($datapost['direccion']) ? mysqli_real_escape_string($conn, $datapost['direccion']) : '';
        $telefono = isset($datapost['telefono']) ? mysqli_real_escape_string($conn, $datapost['telefono']) : '';

        if ($id <= 0) sendResponse(false, "ID no válido");
        if (empty($nombre)) sendResponse(false, "El nombre es requerido");

        $check = "SELECT id FROM sucursales WHERE nombre = '$nombre' AND id != $id AND activo = 1";
        $checkR = mysqli_query($conn, $check);
        if ($checkR && mysqli_num_rows($checkR) > 0) {
            sendResponse(false, "Ya existe otra sucursal con ese nombre");
        }

        $sql = "UPDATE sucursales SET nombre = '$nombre', direccion = '$direccion', telefono = '$telefono', updated_at = NOW() WHERE id = $id";
        if (mysqli_query($conn, $sql)) {
            sendResponse(true, "Sucursal actualizada correctamente");
        } else {
            sendResponse(false, "Error al actualizar sucursal: " . mysqli_error($conn));
        }
        break;

    case 'eliminarSucursal':
        $id = isset($datapost['id']) ? (int)$datapost['id'] : 0;
        if ($id <= 0) sendResponse(false, "ID no válido");

        // Verificar si hay transferencias activas
        $check = "SELECT COUNT(*) as total FROM transferencias WHERE (sucursal_origen_id = $id OR sucursal_destino_id = $id) AND estado NOT IN ('recibida', 'cancelada', 'rechazada')";
        $checkR = mysqli_query($conn, $check);
        $checkRow = mysqli_fetch_assoc($checkR);
        if ((int)$checkRow['total'] > 0) {
            sendResponse(false, "No se puede eliminar: hay transferencias activas con esta sucursal");
        }

        $sql = "UPDATE sucursales SET activo = 0, updated_at = NOW() WHERE id = $id";
        if (mysqli_query($conn, $sql)) {
            sendResponse(true, "Sucursal eliminada correctamente");
        } else {
            sendResponse(false, "Error al eliminar sucursal: " . mysqli_error($conn));
        }
        break;

    // ===================== TRANSFERENCIAS =====================
    case 'getTransferencias':
        $sql = "SELECT t.*,
                (SELECT COUNT(*) FROM transferencia_items ti WHERE ti.transferencia_id = t.id) as total_items
                FROM transferencias t
                ORDER BY t.created_at DESC";
        $result = mysqli_query($conn, $sql);

        if ($result) {
            $transferencias = [];
            while ($row = mysqli_fetch_assoc($result)) {
                $transferencias[] = [
                    'id' => (int)$row['id'],
                    'tipo' => $row['tipo'],
                    'sucursal_origen_id' => (int)$row['sucursal_origen_id'],
                    'sucursal_origen_nombre' => $row['sucursal_origen_nombre'],
                    'sucursal_destino_id' => (int)$row['sucursal_destino_id'],
                    'sucursal_destino_nombre' => $row['sucursal_destino_nombre'],
                    'estado' => $row['estado'],
                    'observaciones' => $row['observaciones'],
                    'fecha' => $row['fecha'],
                    'total_items' => (int)$row['total_items'],
                    'created_at' => $row['created_at']
                ];
            }
            sendResponse(true, "Transferencias obtenidas", $transferencias);
        } else {
            sendResponse(false, "Error: " . mysqli_error($conn));
        }
        break;

    case 'getTransferenciaDetalle':
        $id = isset($datapost['id']) ? (int)$datapost['id'] : 0;
        if ($id <= 0) sendResponse(false, "ID no válido");

        $sql = "SELECT * FROM transferencias WHERE id = $id";
        $result = mysqli_query($conn, $sql);

        if ($result && mysqli_num_rows($result) > 0) {
            $row = mysqli_fetch_assoc($result);
            $transferencia = [
                'id' => (int)$row['id'],
                'tipo' => $row['tipo'],
                'sucursal_origen_id' => (int)$row['sucursal_origen_id'],
                'sucursal_origen_nombre' => $row['sucursal_origen_nombre'],
                'sucursal_destino_id' => (int)$row['sucursal_destino_id'],
                'sucursal_destino_nombre' => $row['sucursal_destino_nombre'],
                'estado' => $row['estado'],
                'observaciones' => $row['observaciones'],
                'fecha' => $row['fecha'],
                'fecha_aprobacion' => $row['fecha_aprobacion'],
                'fecha_envio' => $row['fecha_envio'],
                'fecha_recepcion' => $row['fecha_recepcion'],
                'created_at' => $row['created_at']
            ];

            // Items
            $sqlItems = "SELECT * FROM transferencia_items WHERE transferencia_id = $id";
            $resultItems = mysqli_query($conn, $sqlItems);
            $items = [];
            if ($resultItems) {
                while ($item = mysqli_fetch_assoc($resultItems)) {
                    $items[] = [
                        'id' => (int)$item['id'],
                        'tipo_item' => $item['tipo_item'],
                        'item_id' => (int)$item['item_id'],
                        'item_nombre' => $item['item_nombre'],
                        'cantidad_solicitada' => (float)$item['cantidad_solicitada'],
                        'cantidad_enviada' => (float)$item['cantidad_enviada'],
                        'cantidad_recibida' => (float)$item['cantidad_recibida'],
                        'unidad' => $item['unidad']
                    ];
                }
            }
            $transferencia['items'] = $items;
            sendResponse(true, "Detalle obtenido", $transferencia);
        } else {
            sendResponse(false, "Transferencia no encontrada");
        }
        break;

    case 'crearRequisicion':
        $sucursal_origen_id = isset($datapost['sucursal_origen_id']) ? (int)$datapost['sucursal_origen_id'] : 0;
        $sucursal_origen_nombre = isset($datapost['sucursal_origen_nombre']) ? mysqli_real_escape_string($conn, $datapost['sucursal_origen_nombre']) : '';
        $sucursal_destino_id = isset($datapost['sucursal_destino_id']) ? (int)$datapost['sucursal_destino_id'] : 0;
        $sucursal_destino_nombre = isset($datapost['sucursal_destino_nombre']) ? mysqli_real_escape_string($conn, $datapost['sucursal_destino_nombre']) : '';
        $observaciones = isset($datapost['observaciones']) ? mysqli_real_escape_string($conn, $datapost['observaciones']) : '';
        $usuario_id = isset($datapost['usuario_id']) ? (int)$datapost['usuario_id'] : 0;
        $items = isset($datapost['items']) ? $datapost['items'] : [];

        if ($sucursal_destino_id <= 0) sendResponse(false, "Selecciona una sucursal destino");
        if (empty($items)) sendResponse(false, "Agrega al menos un item");

        $fecha = date('Y-m-d');
        $sql = "INSERT INTO transferencias (tipo, sucursal_origen_id, sucursal_origen_nombre, sucursal_destino_id, sucursal_destino_nombre, estado, observaciones, fecha, solicitado_por)
                VALUES ('requisicion', $sucursal_origen_id, '$sucursal_origen_nombre', $sucursal_destino_id, '$sucursal_destino_nombre', 'pendiente', '$observaciones', '$fecha', $usuario_id)";

        if (mysqli_query($conn, $sql)) {
            $transferencia_id = mysqli_insert_id($conn);

            foreach ($items as $item) {
                $tipo_item = mysqli_real_escape_string($conn, $item['tipo_item']);
                $item_id = (int)$item['item_id'];
                $item_nombre = mysqli_real_escape_string($conn, $item['item_nombre']);
                $cantidad = (float)$item['cantidad'];
                $unidad = mysqli_real_escape_string($conn, $item['unidad']);

                $sqlItem = "INSERT INTO transferencia_items (transferencia_id, tipo_item, item_id, item_nombre, cantidad_solicitada, unidad)
                            VALUES ($transferencia_id, '$tipo_item', $item_id, '$item_nombre', $cantidad, '$unidad')";
                mysqli_query($conn, $sqlItem);
            }

            sendResponse(true, "Requisición creada correctamente", ['id' => $transferencia_id]);
        } else {
            sendResponse(false, "Error al crear requisición: " . mysqli_error($conn));
        }
        break;

    case 'crearEnvioDirecto':
        $sucursal_origen_id = isset($datapost['sucursal_origen_id']) ? (int)$datapost['sucursal_origen_id'] : 0;
        $sucursal_origen_nombre = isset($datapost['sucursal_origen_nombre']) ? mysqli_real_escape_string($conn, $datapost['sucursal_origen_nombre']) : '';
        $sucursal_destino_id = isset($datapost['sucursal_destino_id']) ? (int)$datapost['sucursal_destino_id'] : 0;
        $sucursal_destino_nombre = isset($datapost['sucursal_destino_nombre']) ? mysqli_real_escape_string($conn, $datapost['sucursal_destino_nombre']) : '';
        $observaciones = isset($datapost['observaciones']) ? mysqli_real_escape_string($conn, $datapost['observaciones']) : '';
        $usuario_id = isset($datapost['usuario_id']) ? (int)$datapost['usuario_id'] : 0;
        $items = isset($datapost['items']) ? $datapost['items'] : [];

        if ($sucursal_destino_id <= 0) sendResponse(false, "Selecciona una sucursal destino");
        if (empty($items)) sendResponse(false, "Agrega al menos un item");

        // Validar stock suficiente
        foreach ($items as $item) {
            $tipo_item = $item['tipo_item'];
            $item_id = (int)$item['item_id'];
            $cantidad = (float)$item['cantidad'];

            if ($tipo_item === 'producto') {
                $stockSql = "SELECT stock, nombre FROM productos WHERE id = $item_id AND activo = 1";
            } else {
                $stockSql = "SELECT cantidad as stock, nombre FROM ingredientes WHERE id = $item_id AND activo = 1";
            }
            $stockResult = mysqli_query($conn, $stockSql);
            if ($stockResult && $stockRow = mysqli_fetch_assoc($stockResult)) {
                if ((float)$stockRow['stock'] < $cantidad) {
                    sendResponse(false, "Stock insuficiente para '{$stockRow['nombre']}': disponible {$stockRow['stock']}, solicitado $cantidad");
                }
            } else {
                sendResponse(false, "Item no encontrado");
            }
        }

        $fecha = date('Y-m-d');
        $sql = "INSERT INTO transferencias (tipo, sucursal_origen_id, sucursal_origen_nombre, sucursal_destino_id, sucursal_destino_nombre, estado, observaciones, fecha, solicitado_por, enviado_por, fecha_envio)
                VALUES ('envio_directo', $sucursal_origen_id, '$sucursal_origen_nombre', $sucursal_destino_id, '$sucursal_destino_nombre', 'enviada', '$observaciones', '$fecha', $usuario_id, $usuario_id, NOW())";

        if (mysqli_query($conn, $sql)) {
            $transferencia_id = mysqli_insert_id($conn);

            foreach ($items as $item) {
                $tipo_item = mysqli_real_escape_string($conn, $item['tipo_item']);
                $item_id = (int)$item['item_id'];
                $item_nombre = mysqli_real_escape_string($conn, $item['item_nombre']);
                $cantidad = (float)$item['cantidad'];
                $unidad = mysqli_real_escape_string($conn, $item['unidad']);

                $sqlItem = "INSERT INTO transferencia_items (transferencia_id, tipo_item, item_id, item_nombre, cantidad_solicitada, cantidad_enviada, unidad)
                            VALUES ($transferencia_id, '$tipo_item', $item_id, '$item_nombre', $cantidad, $cantidad, '$unidad')";
                mysqli_query($conn, $sqlItem);

                // Descontar stock del origen
                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");
                }
            }

            sendResponse(true, "Envío registrado correctamente. Stock descontado.", ['id' => $transferencia_id]);
        } else {
            sendResponse(false, "Error al crear envío: " . mysqli_error($conn));
        }
        break;

    case 'aprobarRequisicion':
        $id = isset($datapost['id']) ? (int)$datapost['id'] : 0;
        $usuario_id = isset($datapost['usuario_id']) ? (int)$datapost['usuario_id'] : 0;
        if ($id <= 0) sendResponse(false, "ID no válido");

        $check = "SELECT estado FROM transferencias WHERE id = $id";
        $checkR = mysqli_query($conn, $check);
        $row = mysqli_fetch_assoc($checkR);
        if (!$row || $row['estado'] !== 'pendiente') {
            sendResponse(false, "Solo se pueden aprobar requisiciones pendientes");
        }

        $sql = "UPDATE transferencias SET estado = 'aprobada', aprobado_por = $usuario_id, fecha_aprobacion = NOW(), updated_at = NOW() WHERE id = $id";
        if (mysqli_query($conn, $sql)) {
            sendResponse(true, "Requisición aprobada");
        } else {
            sendResponse(false, "Error: " . mysqli_error($conn));
        }
        break;

    case 'rechazarRequisicion':
        $id = isset($datapost['id']) ? (int)$datapost['id'] : 0;
        $usuario_id = isset($datapost['usuario_id']) ? (int)$datapost['usuario_id'] : 0;
        if ($id <= 0) sendResponse(false, "ID no válido");

        $check = "SELECT estado FROM transferencias WHERE id = $id";
        $checkR = mysqli_query($conn, $check);
        $row = mysqli_fetch_assoc($checkR);
        if (!$row || $row['estado'] !== 'pendiente') {
            sendResponse(false, "Solo se pueden rechazar requisiciones pendientes");
        }

        $sql = "UPDATE transferencias SET estado = 'rechazada', aprobado_por = $usuario_id, fecha_aprobacion = NOW(), updated_at = NOW() WHERE id = $id";
        if (mysqli_query($conn, $sql)) {
            sendResponse(true, "Requisición rechazada");
        } else {
            sendResponse(false, "Error: " . mysqli_error($conn));
        }
        break;

    case 'enviarRequisicion':
        $id = isset($datapost['id']) ? (int)$datapost['id'] : 0;
        $usuario_id = isset($datapost['usuario_id']) ? (int)$datapost['usuario_id'] : 0;
        $items_enviados = isset($datapost['items']) ? $datapost['items'] : [];
        if ($id <= 0) sendResponse(false, "ID no válido");

        $check = "SELECT estado FROM transferencias WHERE id = $id";
        $checkR = mysqli_query($conn, $check);
        $row = mysqli_fetch_assoc($checkR);
        if (!$row || $row['estado'] !== 'aprobada') {
            sendResponse(false, "Solo se pueden enviar requisiciones aprobadas");
        }

        // Validar stock y actualizar cantidades enviadas
        foreach ($items_enviados as $itemEnv) {
            $item_id_ti = (int)$itemEnv['id']; // transferencia_items.id
            $cantidad_enviada = (float)$itemEnv['cantidad_enviada'];

            // Obtener info del item
            $tiSql = "SELECT * FROM transferencia_items WHERE id = $item_id_ti AND transferencia_id = $id";
            $tiResult = mysqli_query($conn, $tiSql);
            $tiRow = mysqli_fetch_assoc($tiResult);

            if (!$tiRow) continue;

            $tipo_item = $tiRow['tipo_item'];
            $real_item_id = (int)$tiRow['item_id'];

            // Validar stock
            if ($tipo_item === 'producto') {
                $stockSql = "SELECT stock, nombre FROM productos WHERE id = $real_item_id AND activo = 1";
            } else {
                $stockSql = "SELECT cantidad as stock, nombre FROM ingredientes WHERE id = $real_item_id AND activo = 1";
            }
            $stockResult = mysqli_query($conn, $stockSql);
            $stockRow = mysqli_fetch_assoc($stockResult);

            if ($stockRow && (float)$stockRow['stock'] < $cantidad_enviada) {
                sendResponse(false, "Stock insuficiente para '{$stockRow['nombre']}': disponible {$stockRow['stock']}, enviando $cantidad_enviada");
            }

            // Actualizar cantidad enviada
            mysqli_query($conn, "UPDATE transferencia_items SET cantidad_enviada = $cantidad_enviada WHERE id = $item_id_ti");

            // Descontar stock
            if ($cantidad_enviada > 0) {
                if ($tipo_item === 'producto') {
                    mysqli_query($conn, "UPDATE productos SET stock = stock - $cantidad_enviada, updated_at = NOW() WHERE id = $real_item_id");
                } else {
                    mysqli_query($conn, "UPDATE ingredientes SET cantidad = cantidad - $cantidad_enviada, updated_at = NOW() WHERE id = $real_item_id");
                }
            }
        }

        $sql = "UPDATE transferencias SET estado = 'enviada', enviado_por = $usuario_id, fecha_envio = NOW(), updated_at = NOW() WHERE id = $id";
        if (mysqli_query($conn, $sql)) {
            sendResponse(true, "Requisición enviada. Stock descontado.");
        } else {
            sendResponse(false, "Error: " . mysqli_error($conn));
        }
        break;

    case 'recibirTransferencia':
        $id = isset($datapost['id']) ? (int)$datapost['id'] : 0;
        $usuario_id = isset($datapost['usuario_id']) ? (int)$datapost['usuario_id'] : 0;
        $items_recibidos = isset($datapost['items']) ? $datapost['items'] : [];
        if ($id <= 0) sendResponse(false, "ID no válido");

        $check = "SELECT estado FROM transferencias WHERE id = $id";
        $checkR = mysqli_query($conn, $check);
        $row = mysqli_fetch_assoc($checkR);
        if (!$row || $row['estado'] !== 'enviada') {
            sendResponse(false, "Solo se pueden recibir transferencias enviadas");
        }

        foreach ($items_recibidos as $itemRec) {
            $item_id_ti = (int)$itemRec['id'];
            $cantidad_recibida = (float)$itemRec['cantidad_recibida'];

            $tiSql = "SELECT * FROM transferencia_items WHERE id = $item_id_ti AND transferencia_id = $id";
            $tiResult = mysqli_query($conn, $tiSql);
            $tiRow = mysqli_fetch_assoc($tiResult);

            if (!$tiRow) continue;

            $tipo_item = $tiRow['tipo_item'];
            $real_item_id = (int)$tiRow['item_id'];

            // Actualizar cantidad recibida
            mysqli_query($conn, "UPDATE transferencia_items SET cantidad_recibida = $cantidad_recibida WHERE id = $item_id_ti");

            // Sumar stock al destino
            if ($cantidad_recibida > 0) {
                if ($tipo_item === 'producto') {
                    mysqli_query($conn, "UPDATE productos SET stock = stock + $cantidad_recibida, updated_at = NOW() WHERE id = $real_item_id");
                } else {
                    mysqli_query($conn, "UPDATE ingredientes SET cantidad = cantidad + $cantidad_recibida, updated_at = NOW() WHERE id = $real_item_id");
                }
            }
        }

        $sql = "UPDATE transferencias SET estado = 'recibida', recibido_por = $usuario_id, fecha_recepcion = NOW(), updated_at = NOW() WHERE id = $id";
        if (mysqli_query($conn, $sql)) {
            sendResponse(true, "Transferencia recibida. Stock actualizado.");
        } else {
            sendResponse(false, "Error: " . mysqli_error($conn));
        }
        break;

    case 'cancelarTransferencia':
        $id = isset($datapost['id']) ? (int)$datapost['id'] : 0;
        if ($id <= 0) sendResponse(false, "ID no válido");

        $check = "SELECT estado FROM transferencias WHERE id = $id";
        $checkR = mysqli_query($conn, $check);
        $row = mysqli_fetch_assoc($checkR);
        if (!$row) sendResponse(false, "Transferencia no encontrada");
        if ($row['estado'] === 'recibida' || $row['estado'] === 'cancelada') {
            sendResponse(false, "No se puede cancelar una transferencia recibida o ya cancelada");
        }

        // Si ya fue enviada, revertir stock
        if ($row['estado'] === 'enviada') {
            $itemsSql = "SELECT * FROM transferencia_items WHERE transferencia_id = $id";
            $itemsResult = mysqli_query($conn, $itemsSql);
            while ($item = mysqli_fetch_assoc($itemsResult)) {
                $cantidad = (float)$item['cantidad_enviada'];
                $tipo_item = $item['tipo_item'];
                $real_item_id = (int)$item['item_id'];

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

        $sql = "UPDATE transferencias SET estado = 'cancelada', updated_at = NOW() WHERE id = $id";
        if (mysqli_query($conn, $sql)) {
            $msg = $row['estado'] === 'enviada' ? "Transferencia cancelada. Stock revertido." : "Transferencia cancelada.";
            sendResponse(true, $msg);
        } else {
            sendResponse(false, "Error: " . mysqli_error($conn));
        }
        break;

    default:
        sendResponse(false, "Operación no válida en Requisiciones");
        break;
}
