#ifndef AOS_UTIL_TRAPEZOID_PROFILE_H_
#define AOS_UTIL_TRAPEZOID_PROFILE_H_

#include "Eigen/Dense"

#include "aos/macros.h"
#include "aos/time/time.h"

namespace aos {
namespace util {

// Calculates a trapezoidal motion profile (like for a control loop's goals).
// Supports having the end speed and position changed in the middle.
//
// The only units assumption that this class makes is that the unit of time is
// seconds.
class TrapezoidProfile {
 public:
  // delta_time is how long between each call to Update.
  TrapezoidProfile(::std::chrono::nanoseconds delta_time);

  // Updates the state.
  const Eigen::Matrix<double, 2, 1> &Update(double goal_position,
                                            double goal_velocity);
  // Useful for preventing windup etc.
  void MoveCurrentState(const Eigen::Matrix<double, 2, 1> &current) {
    output_ = current;
  }

  // Useful for preventing windup etc.
  void MoveGoal(double dx) { output_(0, 0) += dx; }

  void SetGoal(double x) { output_(0, 0) = x; }

  void set_maximum_acceleration(double maximum_acceleration) {
    maximum_acceleration_ = maximum_acceleration;
  }
  void set_maximum_velocity(double maximum_velocity) {
    maximum_velocity_ = maximum_velocity;
  }

 private:
  // Basic kinematics to update output_, given that we are going to accelerate
  // by acceleration over delta_time.
  void UpdateVals(double acceleration, double delta_time);
  // Calculates how long to go for each segment.
  void CalculateTimes(double distance_to_target, double goal_velocity);
  // output_ is where it should go at time_.
  Eigen::Matrix<double, 2, 1> output_;

  double acceleration_time_;
  double acceleration_;
  double constant_time_;
  double deceleration_time_;
  double deceleration_;

  double maximum_acceleration_;
  double maximum_velocity_;

  // How long between calls to Update.
  ::std::chrono::nanoseconds timestep_;

  DISALLOW_COPY_AND_ASSIGN(TrapezoidProfile);
};

}  // namespace util
}  // namespace aos

#endif  // AOS_UTIL_TRAPEZOID_PROFILE_H_
