<?php

require_once "conexion.php";

class ModeloStock{

	static public function mdlIngresarStockActual($tabla, $datos) {

		$stmt = Conexion::conectar()->prepare("INSERT INTO $tabla(id_producto, cantidad) VALUES (:id_producto, :cantidad)");

		$stmt->bindParam(":id_producto", $datos["id_producto"], PDO::PARAM_INT);
		// Usamos PDO::PARAM_STR para decimales para evitar problemas de formato
		$stmt->bindParam(":cantidad", $datos["cantidad"], PDO::PARAM_STR);

		if ($stmt->execute()) {
			return "ok";
		} else {
			return "error";
		}

		// Cerrar la conexión y liberar los recursos
		$stmt->closeCursor();
		$stmt = null;
	}

	/**
	 * Inserta un nuevo registro en la tabla 'diario_stock'.
	 * @param string $tabla El nombre de la tabla ('diario_stock').
	 * @param array $datos Un array asociativo con los datos del movimiento de stock.
	 * @return string 'ok' si la inserción fue exitosa, 'error' en caso contrario.
	 */
	static public function mdlIngresarDiarioStock($tabla, $datos) {
            $db = Conexion::conectar();
            $stmt = $db->prepare("INSERT INTO $tabla (fecha, codigo_tipo_operacion, id_producto, cantidad, precio, id_usuario, id_proveedor, referencia, observacion, attributeset_id) 
                VALUES (:fecha, :codigo_tipo_operacion, :id_producto, :cantidad, :precio, :id_usuario, :id_proveedor, :referencia, :observacion, :attributeset_id)");

            $stmt->bindParam(":fecha", $datos["fecha"], PDO::PARAM_STR);
            $stmt->bindParam(":codigo_tipo_operacion", $datos["codigo_tipo_operacion"], PDO::PARAM_STR);
            $stmt->bindParam(":id_producto", $datos["id_producto"], PDO::PARAM_INT);
            $stmt->bindParam(":cantidad", $datos["cantidad"], PDO::PARAM_STR);
            $stmt->bindParam(":precio", $datos["precio"], PDO::PARAM_STR);
            $stmt->bindParam(":id_usuario", $datos["id_usuario"], PDO::PARAM_INT);
            $stmt->bindParam(":id_proveedor", $datos["id_proveedor"], PDO::PARAM_INT);
            $stmt->bindParam(":referencia", $datos["referencia"], PDO::PARAM_STR);
            $stmt->bindParam(":observacion", $datos["observacion"], PDO::PARAM_STR);
            $stmt->bindParam(":attributeset_id", $datos["attributeset_id"], PDO::PARAM_STR);

            if ($stmt->execute()) {
                $stmt->closeCursor();
                $stmt = null;
                return "ok";
            } else {
                $error = $stmt->errorInfo();
                $stmt->closeCursor();
                $stmt = null;
                return "error: " . $error[2];
            }
        }



	/**
	 * Muestra un registro de la tabla 'stock_actual' por un campo específico.
	 * @param string $tabla El nombre de la tabla ('stock_actual').
	 * @param string $item El nombre del campo a buscar ('id_producto').
	 * @param mixed $valor El valor del campo a buscar.
	 * @return array Un array asociativo con los datos del registro o false si no se encuentra.
	 */
	static public function mdlMostrarStockActual($tabla, $item, $valor) {

		$stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE $item = :$item");
		$stmt->bindParam(":" . $item, $valor, PDO::PARAM_INT);
		$stmt->execute();
		return $stmt->fetch();

		$stmt->closeCursor();
		$stmt = null;
	}

        
        /**
	 * Actualiza un registro en la tabla 'stock_actual'.
	 * @param string $tabla El nombre de la tabla ('stock_actual').
	 * @param array $datos Un array asociativo con los datos a actualizar (id, cantidad).
	 * @return string 'ok' si la actualización fue exitosa, 'error' en caso contrario.
	 */
        
        	static public function mdlActualizarStockActual($tabla, $datos) {

		$stmt = Conexion::conectar()->prepare("UPDATE $tabla SET cantidad = :cantidad WHERE id_producto = :id_producto");

		$stmt->bindParam(":cantidad", $datos["cantidad"], PDO::PARAM_STR);
		$stmt->bindParam(":id_producto", $datos["id_producto"], PDO::PARAM_INT);

		if ($stmt->execute()) {
			return "ok";
		} else {
			return "error";
		}

		$stmt->closeCursor();
		$stmt = null;
	}
        
        /**
	 * Elimina un registro de la tabla 'stock_actual'.
	 * @param string $tabla El nombre de la tabla ('stock_actual').
	 * @param array $datos Un array asociativo con el ID del registro a eliminar.
	 * @return string 'ok' si la eliminación fue exitosa, 'error' en caso contrario.
	 */
	static public function mdlEliminarStockActual($tabla, $datos) {

                $conn = Conexion::conectar();
                $stmt = $conn->prepare("DELETE FROM $tabla WHERE id_producto = :id");

                $stmt->bindParam(":id", $datos, PDO::PARAM_INT);

                if ($stmt->execute()) {
                        $stmt->closeCursor();
                        $stmt = null;
                        return "ok";
                } else {
                        $stmt->closeCursor();
                        $stmt = null;
                        return "error";
                }
        }

        
        /**
	 * Obtiene los registros de 'diario_stock' con filtros dinámicos.
	 * @param string $tabla El nombre de la tabla ('diario_stock').
	 * @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 mdlMostrarDiarioStockFiltrado($tabla, $fechaInicial, $fechaFinal, $idProveedor, $codigoTipoOperacion) {

            // Base de la consulta con joins
            $sql = "SELECT
                        s.id,
                        s.fecha,
                        s.referencia,
                        p.codigo,
                        p.descripcion AS producto_descripcion,
                        s.cantidad,
                        s.precio,
                        i.nombre AS tipo_operacion_descripcion,
                        u.nombre AS usuario_nombre,
                        pr.nombre AS proveedor_nombre
                    FROM $tabla s
                    INNER JOIN productos p ON p.id = s.id_producto
                    INNER JOIN inventario_tipo_operacion i ON i.codigo = s.codigo_tipo_operacion
                    INNER JOIN usuarios u ON u.id = s.id_usuario
                    LEFT JOIN proveedores pr ON pr.id = s.id_proveedor";

            // Arreglos para filtros
            $where = [];
            $params = [];

            // ✅ Filtro por fecha con DATE() (s.fecha es DATETIME)
            if (!empty($fechaInicial) && !empty($fechaFinal)) {
                $where[] = "DATE(s.fecha) BETWEEN :fechaInicial AND :fechaFinal";
                $params[':fechaInicial'] = $fechaInicial;
                $params[':fechaFinal'] = $fechaFinal;
            }

            // Filtro por proveedor
            if (!empty($idProveedor)) {
                $where[] = "pr.id = :idProveedor";
                $params[':idProveedor'] = $idProveedor;
            }

            // Filtro por tipo de operación
            if (!empty($codigoTipoOperacion)) {
                $where[] = "i.codigo = :codigoTipoOperacion";
                $params[':codigoTipoOperacion'] = $codigoTipoOperacion;
            }

            // Agregar cláusula WHERE si hay filtros
            if (!empty($where)) {
                $sql .= " WHERE " . implode(" AND ", $where);
            }

            // Ordenar por fecha descendente
            $sql .= " ORDER BY s.fecha DESC";

            // Preparar y ejecutar consulta
            $stmt = Conexion::conectar()->prepare($sql);

            foreach ($params as $param => $value) {
                $stmt->bindValue($param, $value);
            }

            $stmt->execute();
            $result = $stmt->fetchAll(PDO::FETCH_ASSOC);

            $stmt->closeCursor();
            $stmt = null;

            return $result;
        }


        /*=============================================
        MOSTRAR TIPO DE OPERACION
        =============================================*/
        static public function mdlMostrarTipoOperacion($tabla, $item, $valor) {

            if ($item != null) {

                $stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE $item = :$item");
                $stmt->bindParam(":" . $item, $valor, PDO::PARAM_STR);
                $stmt->execute();
                return $stmt->fetch();

            } else {

                $stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla");
                $stmt->execute();
                return $stmt->fetchAll();

            }

            $stmt->closeCursor();
            $stmt = null;
        }
        
        /*=============================================
        MOSTRAR MOVIMIENTOS
        =============================================*/
        static public function mdlMostrarMovimientos($tabla, $item, $valor){

            if ($item != null) {
                $stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla WHERE $item = :$item ORDER BY id DESC");
                $stmt->bindParam(":".$item, $valor, PDO::PARAM_STR);
                $stmt->execute();
                return $stmt->fetch();
            } else {
                // Se obtiene solo el último registro para generar el código
                $stmt = Conexion::conectar()->prepare("SELECT * FROM $tabla ORDER BY id DESC LIMIT 1");
                $stmt->execute();
                return $stmt->fetch();
            }

            $stmt->closeCursor();
            $stmt = null;
        }
}