#include "ceres/internal/export.h"
#include "ceres/local_parameterization.h"
#include "ceres/manifold.h"
#include "glog/logging.h"

namespace ceres::internal {

// Adapter to wrap LocalParameterization and make them look like Manifolds.
//
// ManifoldAdapter NEVER takes ownership of local_parameterization.
class CERES_NO_EXPORT ManifoldAdapter final : public Manifold {
 public:
  explicit ManifoldAdapter(const LocalParameterization* local_parameterization)
      : local_parameterization_(local_parameterization) {
    CHECK(local_parameterization != nullptr);
  }

  bool Plus(const double* x,
            const double* delta,
            double* x_plus_delta) const override {
    return local_parameterization_->Plus(x, delta, x_plus_delta);
  }

  bool PlusJacobian(const double* x, double* jacobian) const override {
    return local_parameterization_->ComputeJacobian(x, jacobian);
  }

  bool RightMultiplyByPlusJacobian(const double* x,
                                   const int num_rows,
                                   const double* ambient_matrix,
                                   double* tangent_matrix) const override {
    return local_parameterization_->MultiplyByJacobian(
        x, num_rows, ambient_matrix, tangent_matrix);
  }

  bool Minus(const double* y, const double* x, double* delta) const override {
    LOG(FATAL) << "This should never be called.";
    return false;
  }

  bool MinusJacobian(const double* x, double* jacobian) const override {
    LOG(FATAL) << "This should never be called.";
    return false;
  }

  int AmbientSize() const override {
    return local_parameterization_->GlobalSize();
  }

  int TangentSize() const override {
    return local_parameterization_->LocalSize();
  }

 private:
  const LocalParameterization* local_parameterization_;
};

}  // namespace ceres::internal
