<?php
date_default_timezone_set('America/La_Paz');
class ControladorStock{
    
        /*=============================================
        CREAR MOVIMIENTO DE STOCK
        =============================================*/
        static public function ctrCrearMovimiento() {

            if (isset($_POST["tipoMovimiento"])) {

                if (!empty($_POST["tipoMovimiento"]) && !empty($_POST["listaProductos"])) {

                    $listaProductos = json_decode($_POST["listaProductos"], true);
                    $respuestaExitosa = true;

                    // Obtener naturaleza del movimiento
                    $item = "codigo";
                    $valor = $_POST["tipoMovimiento"];
                    $tablaTipoOperacion = "inventario_tipo_operacion";
                    $tipoOperacion = ModeloStock::mdlMostrarTipoOperacion($tablaTipoOperacion, $item, $valor);

                    if (!$tipoOperacion || !isset($tipoOperacion["naturaleza"])) {
                        echo '<script>
                            swal({
                                type: "error",
                                title: "¡Error! Tipo de movimiento no válido.",
                                text: "Por favor, seleccione un tipo de movimiento de la lista.",
                                showConfirmButton: true,
                                confirmButtonText: "Cerrar"
                            });
                        </script>';
                        return;
                    }

                    $naturaleza = $tipoOperacion["naturaleza"];
                    $fechaMovimiento = date("Y-m-d H:i:s");
                    $referencia = !empty($_POST["nuevaReferencia"]) ? $_POST["nuevaReferencia"] : uniqid("REF-");

                    // ⚠️ Solo registrar una transacción si es compra
                    if ($_POST["tipoMovimiento"] === "001") {
                        $montoTotal = 0;
                        foreach ($listaProductos as $producto) {
                            $montoTotal += $producto["precio"] * $producto["cantidad"];
                        }

                        $datosTransaccion = array(
                            "monto" => $montoTotal,
                            "fecha" => $fechaMovimiento,
                            "descripcion" => "Compra de productos",
                            "referencia" => $referencia,
                            "id_usuario" => (int)$_POST["idUsuario"],
                            "id_tipo_transaccion" => TRANSACCION_COMPRA,
                            "metodo_pago" => "EFECTIVO"
                        );

                        $resTransaccion = ModeloTransacciones::mdlIngresarTransaccion("transacciones", $datosTransaccion);

                        if ($resTransaccion !== "ok") {
                            echo '<script>
                                swal({
                                    type: "error",
                                    title: "¡Error al registrar transacción de compra!",
                                    showConfirmButton: true,
                                    confirmButtonText: "Cerrar"
                                });
                            </script>';
                            return;
                        }
                    }

                    // Procesar productos
                    foreach ($listaProductos as $producto) {

                        // Paso 1: Insertar en diario_stock
                        $datosDiario = [
                            "fecha" => $fechaMovimiento,
                            "codigo_tipo_operacion" => $_POST["tipoMovimiento"],
                            "id_producto" => $producto["id"],
                            "cantidad" => $producto["cantidad"],
                            "precio" => $producto["precio"],
                            "id_usuario" => $_POST["idUsuario"],
                            "id_proveedor" => !empty($_POST["seleccionarProveedor"]) ? $_POST["seleccionarProveedor"] : null,
                            "referencia" => $referencia,
                            "observacion" => !empty($_POST["nuevaObservacion"]) ? $_POST["nuevaObservacion"] : null,
                            "attributeset_id" => !empty($producto["attributeset_id"]) ? $producto["attributeset_id"] : null
                        ];

                        $respuestaDiario = ModeloStock::mdlIngresarDiarioStock("diario_stock", $datosDiario);

                        if ($respuestaDiario == "ok") {

                            // Paso 2: Actualizar stock
                            $stockExistente = ModeloProductos::mdlMostrarProductos("productos", "id", $producto["id"], null);
                            $cantidadActual = ($stockExistente) ? (int)$stockExistente["stock"] : 0;

                            $cantidadMovida = 0;
                            if ($naturaleza === "E") {
                                $cantidadMovida = (int)$producto["cantidad"];
                            } else if ($naturaleza === "S") {
                                $cantidadMovida = -(int)$producto["cantidad"];
                            }

                            $nuevaCantidad = $cantidadActual + $cantidadMovida;

                            $respuestaStock = ModeloProductos::mdlActualizarProducto(
                                "productos",
                                "stock",
                                $nuevaCantidad,
                                $producto["id"]
                            );

                            if ($respuestaStock != "ok") {
                                $respuestaExitosa = false;
                                break;
                            }

                        } else {
                            $respuestaExitosa = false;
                            break;
                        }
                    }

                    // Resultado final
                    if ($respuestaExitosa) {
                        echo '<script>
                            swal({
                                type: "success",
                                title: "¡El movimiento ha sido guardado correctamente!",
                                showConfirmButton: true,
                                confirmButtonText: "Cerrar"
                            }).then(function(result){
                                if(result.value){
                                    window.location = "admin-stock";
                                }
                            });
                        </script>';
                    } else {
                        echo '<script>
                            swal({
                                type: "error",
                                title: "¡Hubo un error al guardar el movimiento!",
                                text: "Por favor, inténtelo de nuevo.",
                                showConfirmButton: true,
                                confirmButtonText: "Cerrar"
                            });
                        </script>';
                    }

                } else {
                    echo '<script>
                        swal({
                            type: "error",
                            title: "¡Debe llenar todos los campos obligatorios!",
                            showConfirmButton: true,
                            confirmButtonText: "Cerrar"
                        });
                    </script>';
                }
            }
        }


       
       /*=============================================
        MOSTRAR MOVIMIENTOS
        =============================================*/

        static public function ctrMostrarMovimientos($item, $valor){

            $tabla = "diario_stock";

            $respuesta = ModeloStock::mdlMostrarMovimientos($tabla, $item, $valor);

            return $respuesta;

        }

	/**
	 * Método para insertar un nuevo registro en 'stock_actual'.
	 * @param array $datos Array con la información del producto (id_producto, cantidad).
	 * @return string Retorna el resultado del modelo ('ok' o 'error').
	 */
	static public function ctrIngresarStockActual($datos) {

		$tabla = "stock_actual";
		$respuesta = ModeloStock::mdlIngresarStockActual($tabla, $datos);
		return $respuesta;
	}

	/**
	 * Método para actualizar la cantidad de un producto en 'stock_actual'.
	 * @param array $datos Array con la información a actualizar (id, cantidad).
	 * @return string Retorna el resultado del modelo ('ok' o 'error').
	 */
	static public function ctrActualizarStockActual($datos) {

		$tabla = "stock_actual";
		$respuesta = ModeloStock::mdlActualizarStockActual($tabla, $datos);
		return $respuesta;
	}

	/**
	 * Método para eliminar un registro de 'stock_actual' por su ID.
	 * @param array $datos Array con el ID del registro a eliminar.
	 * @return string Retorna el resultado del modelo ('ok' o 'error').
	 */
	static public function ctrEliminarStockActual($datos) {

		$tabla = "stock_actual";
		$respuesta = ModeloStock::mdlEliminarStockActual($tabla, $datos);
		return $respuesta;
	}

	/**
	 * Método para insertar un nuevo registro en 'diario_stock'.
	 * @param array $datos Array con la información del movimiento de stock.
	 * @return string Retorna el resultado del modelo ('ok' o 'error').
	 */
	static public function ctrIngresarDiarioStock($datos) {

		$tabla = "diario_stock";
		$respuesta = ModeloStock::mdlIngresarDiarioStock($tabla, $datos);
		return $respuesta;
	}

	/*=============================================
	MOSTRAR STOCK ACTUAL
	=============================================*/
	static public function ctrMostrarStockActual($item, $valor) {

		$tabla = "productos";
		$respuesta = ModeloStock::mdlMostrarStockActual($tabla, $item, $valor);
		return $respuesta;
	}
        

	/**
	 * Obtiene los registros de 'diario_stock' con filtros dinámicos.
	 * @param string $fechaInicial Fecha de inicio para el filtro de rango.
	 * @param string $fechaFinal Fecha de fin para el filtro de rango.
	 * @param int $idProveedor ID del proveedor para filtrar.
	 * @param string $codigoTipoOperacion Código del tipo de operación para filtrar.
	 * @return array Un array de arrays asociativos con los resultados.
	 */
        static public function ctrMostrarDiarioStockFiltrado() {

            $fechaInicial = isset($_GET["fechaInicial"]) && $_GET["fechaInicial"] !== '' ? $_GET["fechaInicial"] : null;
            $fechaFinal = isset($_GET["fechaFinal"]) && $_GET["fechaFinal"] !== '' ? $_GET["fechaFinal"] : null;
            $idProveedor = isset($_GET["idProveedor"]) && $_GET["idProveedor"] !== '' ? $_GET["idProveedor"] : null;
            $codigoTipoOperacion = isset($_GET["codigoTipoOperacion"]) && $_GET["codigoTipoOperacion"] !== '' ? $_GET["codigoTipoOperacion"] : null;

            $tabla = "diario_stock";
            return ModeloStock::mdlMostrarDiarioStockFiltrado($tabla, $fechaInicial, $fechaFinal, $idProveedor, $codigoTipoOperacion);
        }



	/**
	 * Obtiene todos los tipos de operación de inventario.
	 * @param string $item Nombre de la columna para la búsqueda.
	 * @param mixed $valor Valor para la búsqueda.
	 * @return array Un array con los tipos de operación.
	 */
	static public function ctrMostrarTiposOperacion($item, $valor) {
		$tabla = "inventario_tipo_operacion";
		$respuesta = ModeloStock::mdlMostrarTipoOperacion($tabla, $item, $valor);
		return $respuesta;
	}

}

