#ifndef MISSION_SYSTEM_OBJECTS_STACK5VHANDLER_H_
#define MISSION_SYSTEM_OBJECTS_STACK5VHANDLER_H_

#include <fsfw/power/PowerSwitchIF.h>
#include <mission/power/gsDefs.h>

enum class StackCommander { RAD_SENSOR = 0, PL_PCDU = 1 };
enum class HandlerState { SWITCH_PENDING, IDLE };

class Stack5VHandler {
 public:
  //! [EXPORT] : [SKIP]
  static constexpr ReturnValue_t BUSY = returnvalue::makeCode(1, 0);
  Stack5VHandler(PowerSwitchIF& switcher);

  ReturnValue_t deviceToOn(StackCommander commander, bool updateStates);
  ReturnValue_t deviceToOff(StackCommander commander, bool updateStates);

  bool isSwitchOn();
  void update();

 private:
  static constexpr MutexIF::TimeoutType LOCK_TYPE = MutexIF::TimeoutType::WAITING;
  static constexpr uint32_t LOCK_TIMEOUT = 20;

  MutexIF* stackLock;
  static constexpr char LOCK_CTX[] = "Stack5VHandler";
  PowerSwitchIF& switcher;
  bool switchIsOn = false;
  bool targetState = false;
  HandlerState handlerState = HandlerState::IDLE;
  bool radSensorIsOn = false;
  bool plPcduIsOn = false;
  power::Switches stackSwitch = power::Switches::P60_DOCK_5V_STACK;

  bool updateInternalStates();
};

#endif /* MISSION_SYSTEM_OBJECTS_STACK5VHANDLER_H_ */