#pragma once

#include <string>

#include "external_localization_service/external_localization_algorithms.hpp"

namespace external_localization_service
{

// 这个类是 external_localization_service 的算法门面层。
// 职责是：
// 1. 对统一输入做最小校验；
// 2. 按外部定位任务类型分发到不同的算法模板文件；
// 3. 让 node 层保持干净，只负责 ROS 通信和输入组装；
// 4. 让算法工程师主要聚焦在各自的 *_algorithm.cpp 中填充真实算法。
class ExternalLocalizationAlgorithmTemplate
{
public:
  using Input = ExternalLocalizationInput;
  using Output = ExternalLocalizationOutput;

  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 ExternalLocalizationAlgorithm * resolve_algorithm(const ExternalTaskType & task_type) const;

  ReferencePoseCollectionAlgorithm reference_pose_collection_algorithm_;
  MarkerAlignmentAlgorithm marker_alignment_algorithm_;
  TruthSourceValidationAlgorithm truth_source_validation_algorithm_;
};

}  // namespace external_localization_service
