#ifndef MISSION_CONTROLLER_ACS_SUSCONVERTER_H_
#define MISSION_CONTROLLER_ACS_SUSCONVERTER_H_

#include <fsfw/datapoollocal/LocalPoolVector.h>
#include <stdint.h>

#include "AcsParameters.h"

class SusConverter {
 public:
  SusConverter() {}

  bool checkSunSensorData(const uint16_t susChannel[6]);

  void calcAngle(const uint16_t susChannel[6]);
  void calibration(const float coeffAlpha[9][10], const float coeffBeta[9][10]);
  float* calculateSunVector();

  float* getSunVectorSensorFrame(const uint16_t susChannel[6], const float coeffAlpha[9][10],
                                 const float coeffBeta[9][10]);

 private:
  float alphaBetaRaw[2];          //[°]
  float alphaBetaCalibrated[2];   //[°]
  float sunVectorSensorFrame[3];  //[-]

  bool validFlag[12] = {returnvalue::OK, returnvalue::OK, returnvalue::OK, returnvalue::OK,
                        returnvalue::OK, returnvalue::OK, returnvalue::OK, returnvalue::OK,
                        returnvalue::OK, returnvalue::OK, returnvalue::OK, returnvalue::OK};

  static const uint8_t GNDREF = 4;
  uint16_t susChannelValueCheckHigh =
      4096;  //=2^12[Bit]high borderline for the channel values of one sun sensor for validity Check
  uint8_t susChannelValueCheckLow =
      0;  //[Bit]low borderline for the channel values of one sun sensor for validity Check
  uint16_t susChannelValueSumHigh =
      100;  // 4096[Bit]high borderline for check if the sun sensor is illuminated by the sun or by
            // the reflection of sunlight from the moon/earth
  uint8_t susChannelValueSumLow =
      0;  //[Bit]low borderline for check if the sun sensor is illuminated
          // by the sun or by the reflection of sunlight from the moon/earth
  uint8_t completeCellWidth = 140,
          halfCellWidth = 70;  //[°] Width of the calibration cells --> necessary for checking in
                               // which cell a data point should be
  uint16_t susChannelValueSum = 0;

  AcsParameters acsParameters;
};

#endif /* MISSION_CONTROLLER_ACS_SUSCONVERTER_H_ */