#ifndef MISSION_ACSDEFS_H_
#define MISSION_ACSDEFS_H_

#include <eive/eventSubsystemIds.h>
#include <fsfw/modes/HasModesIF.h>
#include <mission/sysDefs.h>

namespace acs {

enum class SimpleSensorMode { NORMAL = 0, OFF = 1 };

// These modes are the modes of the ACS controller and of the ACS subsystem.
enum AcsMode : Mode_t {
  OFF = HasModesIF::MODE_OFF,
  SAFE = satsystem::Mode::SAFE,
  PTG_IDLE = satsystem::Mode::PTG_IDLE,
  PTG_NADIR = satsystem::Mode::PTG_NADIR,
  PTG_TARGET = satsystem::Mode::PTG_TARGET,
  PTG_TARGET_GS = satsystem::Mode::PTG_TARGET_GS,
  PTG_INERTIAL = satsystem::Mode::PTG_INERTIAL,
};

enum SafeSubmode : Submode_t { DEFAULT = 0, DETUMBLE = 1 };

enum SafeModeStrategy : uint8_t {
  SAFECTRL_OFF = 0,
  SAFECTRL_NO_MAG_FIELD_FOR_CONTROL = 1,
  SAFECTRL_NO_SENSORS_FOR_CONTROL = 2,
  // OBSW version <= v6.1.0
  LEGACY_SAFECTRL_ACTIVE_MEKF = 10,
  LEGACY_SAFECTRL_WITHOUT_MEKF = 11,
  LEGACY_SAFECTRL_ECLIPSE_DAMPING = 12,
  LEGACY_SAFECTRL_ECLIPSE_IDELING = 13,
  // Added in v6.2.0
  SAFECTRL_MEKF = 14,
  SAFECTRL_GYR = 15,
  SAFECTRL_SUSMGM = 16,
  SAFECTRL_ECLIPSE_DAMPING_GYR = 17,
  SAFECTRL_ECLIPSE_DAMPING_SUSMGM = 18,
  SAFECTRL_ECLIPSE_IDELING = 19,
  SAFECTRL_DETUMBLE_FULL = 20,
  SAFECTRL_DETUMBLE_DETERIORATED = 21,
};

enum GpsSource : uint8_t {
  NONE,
  GPS,
  GPS_EXTRAPOLATED,
  SPG4,
};

static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::ACS_SUBSYSTEM;
//! [EXPORT] : [COMMENT] The limits for the rotation in safe mode were violated.
static constexpr Event SAFE_RATE_VIOLATION = MAKE_EVENT(0, severity::MEDIUM);
//! [EXPORT] : [COMMENT] The system has recovered from a safe rate rotation violation.
static constexpr Event SAFE_RATE_RECOVERY = MAKE_EVENT(1, severity::MEDIUM);
//! [EXPORT] : [COMMENT] Multiple RWs are invalid, uncommandable and therefore higher ACS modes
//! cannot be maintained.
static constexpr Event MULTIPLE_RW_INVALID = MAKE_EVENT(2, severity::HIGH);
//! [EXPORT] : [COMMENT] MEKF was not able to compute a solution.
//! P1: MEKF state on exit
static constexpr Event MEKF_INVALID_INFO = MAKE_EVENT(3, severity::INFO);
//! [EXPORT] : [COMMENT] MEKF is able to compute a solution again.
static constexpr Event MEKF_RECOVERY = MAKE_EVENT(4, severity::INFO);
//! [EXPORT] : [COMMENT] MEKF performed an automatic reset after detection of nonfinite values.
static constexpr Event MEKF_AUTOMATIC_RESET = MAKE_EVENT(5, severity::INFO);
//! [EXPORT] : [COMMENT] MEKF was not able to compute a solution during any pointing ACS mode for a
//! prolonged time.
static constexpr Event MEKF_INVALID_MODE_VIOLATION = MAKE_EVENT(6, severity::HIGH);
//! [EXPORT] : [COMMENT] The ACS safe mode controller was not able to compute a solution and has
//! failed.
//! P1: Missing information about magnetic field, P2: Missing information about rotational rate
static constexpr Event SAFE_MODE_CONTROLLER_FAILURE = MAKE_EVENT(7, severity::HIGH);
//! [EXPORT] : [COMMENT] The TLE for the SGP4 Propagator has become too old.
static constexpr Event TLE_TOO_OLD = MAKE_EVENT(8, severity::INFO);

extern const char* getModeStr(AcsMode mode);

}  // namespace acs

#endif /* MISSION_ACSDEFS_H_ */