#ifndef AGV_MODEL_H
#define AGV_MODEL_H

#define _USE_MATH_DEFINES
#include <cmath>

#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif

/**
 * @brief 单舵轮AGV运动学模型
 *
 * 模型描述：前面一个主舵轮，后面两个从动轮
 * 状态量：x, y, theta (位置和航向角)
 * 控制量：v (速度), delta (主舵轮转向角)
 */
class AGVModel {
public:
    /**
     * @brief AGV状态结构体
     */
    struct State {
        double x;       // x坐标 (m)
        double y;       // y坐标 (m)
        double theta;   // 航向角 (rad)

        State(double x_ = 0.0, double y_ = 0.0, double theta_ = 0.0)
            : x(x_), y(y_), theta(theta_) {}
    };

    /**
     * @brief 控制输入结构体
     */
    struct Control {
        double v;       // 速度 (m/s)
        double delta;   // 主舵轮转向角 (rad)

        Control(double v_ = 0.0, double delta_ = 0.0)
            : v(v_), delta(delta_) {}
    };

    /**
     * @brief 构造函数
     * @param wheelbase 轮距（主舵轮到后轴中心的距离）(m)
     * @param max_velocity 最大速度 (m/s)
     * @param max_steering_angle 最大转向角 (rad)
     */
    AGVModel(double wheelbase = 1.0,
             double max_velocity = 2.0,
             double max_steering_angle = M_PI / 4);

    /**
     * @brief 运动学方程，计算状态导数
     * @param state 当前状态
     * @param control 控制输入
     * @return 状态导数
     */
    State derivative(const State& state, const Control& control) const;

    /**
     * @brief 使用欧拉法更新状态
     * @param state 当前状态
     * @param control 控制输入
     * @param dt 时间步长 (s)
     * @return 更新后的状态
     */
    State update(const State& state, const Control& control, double dt) const;

    /**
     * @brief 限制控制输入在允许范围内
     * @param control 控制输入
     * @return 限制后的控制输入
     */
    Control clampControl(const Control& control) const;

    // 获取参数
    double getWheelbase() const { return wheelbase_; }
    double getMaxVelocity() const { return max_velocity_; }
    double getMaxSteeringAngle() const { return max_steering_angle_; }

    // 状态管理
    void setState(const State& state) { state_ = state; }
    const State& getState() const { return state_; }
    void update(const Control& control, double dt) { state_ = update(state_, control, dt); }

private:
    double wheelbase_;              // 轮距 (m)
    double max_velocity_;           // 最大速度 (m/s)
    double max_steering_angle_;     // 最大转向角 (rad)
    State state_;                   // 当前状态
};

#endif // AGV_MODEL_H
