#pragma once

#include <string>

#include "control_calibration_service/control_calibration_algorithms.hpp"

namespace control_calibration_service
{

// 控制标定算法门面：
// 1. 负责对 node 组装好的 ControlCalibrationInput 做统一入口校验。
// 2. 负责按控制算法类型分发到 PID / MPC / LQR / Pure Pursuit 的专属实现。
// 3. 负责保持 node 层与具体算法实现解耦，方便后续整体替换某个算法 cpp 文件。
// 4. 这是算法工程师和 ROS 接口层之间的边界：
//    - node 只负责通信、上下文收集、结果回填；
//    - template 只负责路由和基本校验；
//    - 具体算法文件只负责“怎么算”。
class ControlCalibrationAlgorithmTemplate
{
public:
  using Input = ControlCalibrationInput;
  using Output = ControlCalibrationOutput;
  using ControllerAlgorithmType = control_calibration_service::ControllerAlgorithmType;

  bool run(
    const Input & input,
    Output & output,
    std::string & failure_reason) const;

private:
  bool validate_input(const Input & input, std::string & failure_reason) const;

  const ControlCalibrationAlgorithm * resolve_algorithm(
    const ControllerAlgorithmType & controller_algorithm) const;

  PidControlCalibrationAlgorithm pid_algorithm_;
  MpcControlCalibrationAlgorithm mpc_algorithm_;
  LqrControlCalibrationAlgorithm lqr_algorithm_;
  PurePursuitControlCalibrationAlgorithm pure_pursuit_algorithm_;
};

}  // namespace control_calibration_service
