#ifndef BSP_Q7S_DEVICES_DEVICEDEFINITIONS_STARTRACKERJSONCOMMANDS_H_
#define BSP_Q7S_DEVICES_DEVICEDEFINITIONS_STARTRACKERJSONCOMMANDS_H_

/**
 * @brief   This file defines a few helper classes to generate commands by means of the parameters
 *          defined in the arcsec json files.
 *  @author J. Meier
 */

#include <string>

#include "ArcsecJsonParamBase.h"
#include "fsfw/serviceinterface/ServiceInterface.h"

/**
 * @brief   Generates command to set the limit parameters
 *
 */
class Limits : public ArcsecJsonParamBase {
 public:
  Limits();

  size_t getSize();

 private:
  static const size_t COMMAND_SIZE = 43;

  virtual ReturnValue_t createCommand(uint8_t* buffer) override;
};

/**
 * @brief   Generates the command to configure the tracking algorithm.
 *
 */
class Tracking : public ArcsecJsonParamBase {
 public:
  Tracking();

  size_t getSize();

 private:
  static const size_t COMMAND_SIZE = 15;

  ReturnValue_t createCommand(uint8_t* buffer) override;
};

/**
 * @brief   Generates the command to set the mounting quaternion
 *
 */
class Mounting : public ArcsecJsonParamBase {
 public:
  Mounting();

  size_t getSize();

 private:
  static const size_t COMMAND_SIZE = 18;

  ReturnValue_t createCommand(uint8_t* buffer) override;
};

/**
 * @brief   Generates the command to configure the image processor
 *
 */
class ImageProcessor : public ArcsecJsonParamBase {
 public:
  ImageProcessor();

  size_t getSize();

 private:
  static const size_t COMMAND_SIZE = 9;

  ReturnValue_t createCommand(uint8_t* buffer) override;
};

/**
 * @brief   Generates the command to set the mounting quaternion
 *
 */
class Camera : public ArcsecJsonParamBase {
 public:
  Camera();

  size_t getSize();

 private:
  static const size_t COMMAND_SIZE = 39;

  ReturnValue_t createCommand(uint8_t* buffer) override;
};

/**
 * @brief   Generates the command to configure the centroiding algorithm
 *
 */
class Centroiding : public ArcsecJsonParamBase {
 public:
  Centroiding();

  size_t getSize();

 private:
  static const size_t COMMAND_SIZE = 51;

  ReturnValue_t createCommand(uint8_t* buffer) override;
};

/**
 * @brief   Generates the command to configure the LISA (lost in space algorithm)
 *
 */
class Lisa : public ArcsecJsonParamBase {
 public:
  Lisa();

  size_t getSize();

 private:
  static const size_t COMMAND_SIZE = 52;

  ReturnValue_t createCommand(uint8_t* buffer) override;
};

/**
 * @brief   Generates the command to configure the matching algorithm
 *
 */
class Matching : public ArcsecJsonParamBase {
 public:
  Matching();

  size_t getSize();

 private:
  static const size_t COMMAND_SIZE = 10;

  ReturnValue_t createCommand(uint8_t* buffer) override;
};

/**
 * @brief   Generates the command to configure the validation parameters
 *
 */
class Validation : public ArcsecJsonParamBase {
 public:
  Validation();

  size_t getSize();

 private:
  static const size_t COMMAND_SIZE = 12;

  ReturnValue_t createCommand(uint8_t* buffer) override;
};

/**
 * @brief   Generates command to configure the mechanism of automatically switching between the
 *          LISA and other algorithms.
 *
 */
class Algo : public ArcsecJsonParamBase {
 public:
  Algo();

  size_t getSize();

 private:
  static const size_t COMMAND_SIZE = 13;

  ReturnValue_t createCommand(uint8_t* buffer) override;
};

/**
 * @brief   Generates command to configure the log level parameters.
 *
 */
class LogLevel : public ArcsecJsonParamBase {
 public:
  LogLevel();

  size_t getSize();

 private:
  static const size_t COMMAND_SIZE = 18;

  ReturnValue_t createCommand(uint8_t* buffer) override;
};

/**
 * @brief   Generates command to set subscription parameters.
 *
 */
class Subscription : public ArcsecJsonParamBase {
 public:
  Subscription();

  size_t getSize();

 private:
  static const size_t COMMAND_SIZE = 18;

  ReturnValue_t createCommand(uint8_t* buffer) override;
};

/**
 * @brief   Generates command to set log subscription parameters.
 *
 */
class LogSubscription : public ArcsecJsonParamBase {
 public:
  LogSubscription();

  size_t getSize();

 private:
  static const size_t COMMAND_SIZE = 6;

  ReturnValue_t createCommand(uint8_t* buffer) override;
};

/**
 * @brief   Generates command to set debug camera parameters
 *
 */
class DebugCamera : public ArcsecJsonParamBase {
 public:
  DebugCamera();

  size_t getSize();

 private:
  static const size_t COMMAND_SIZE = 10;

  ReturnValue_t createCommand(uint8_t* buffer) override;
};

#endif /* BSP_Q7S_DEVICES_DEVICEDEFINITIONS_STARTRACKERJSONCOMMANDS_H_ */