#ifndef NAVIGATION_H_
#define NAVIGATION_H_

#include <fsfw/coordinates/Sgp4Propagator.h>
#include <mission/acs/defs.h>
#include <mission/controller/acs/AcsParameters.h>
#include <mission/controller/acs/MultiplicativeKalmanFilter.h>
#include <mission/controller/acs/SensorValues.h>
#include <mission/controller/controllerdefinitions/AcsCtrlDefinitions.h>

class Navigation {
 public:
  Navigation(AcsParameters *acsParameters);
  virtual ~Navigation();

  ReturnValue_t useMekf(const ACS::SensorValues *sensorValues,
                        const acsctrl::GyrDataProcessed *gyrDataProcessed,
                        const acsctrl::MgmDataProcessed *mgmDataProcessed,
                        const acsctrl::SusDataProcessed *susDataProcessed, const double timeDelta,
                        acsctrl::AttitudeEstimationData *attitudeEstimationData,
                        const bool allowStr);
  void resetMekf(acsctrl::AttitudeEstimationData *mekfData);

  ReturnValue_t useSpg4(timeval now, acsctrl::GpsDataProcessed *gpsDataProcessed);
  ReturnValue_t updateTle(const uint8_t *line1, const uint8_t *line2);
  void updateMekfStandardDeviations(const AcsParameters *acsParameters);

 protected:
 private:
  MultiplicativeKalmanFilter multiplicativeKalmanFilter;
  ReturnValue_t mekfStatus = MultiplicativeKalmanFilter::MEKF_UNINITIALIZED;
  Sgp4Propagator sgp4Propagator;
};

#endif /* ACS_NAVIGATION_H_ */