#ifndef MISSION_DEVICES_BPXBATTERYHANDLER_H_
#define MISSION_DEVICES_BPXBATTERYHANDLER_H_

#include <fsfw/devicehandlers/DeviceHandlerBase.h>

#include "devicedefinitions/BpxBatteryDefinitions.h"

class BpxBatteryHandler : public DeviceHandlerBase {
 public:
  BpxBatteryHandler(object_id_t objectId, object_id_t comIF, CookieIF* comCookie);
  virtual ~BpxBatteryHandler();

  void setToGoToNormalMode(bool enable);
  void setDebugMode(bool enable);

 protected:
  enum class States {
    CHECK_COM = 0,
    IDLE = 1,
  };

  States state = States::CHECK_COM;
  bool commandExecuted = false;
  bool debugMode = false;
  bool goToNormalModeImmediately = false;
  uint8_t sentPingByte = BpxBattery::DEFAULT_PING_SENT_BYTE;
  BpxBatteryHk hkSet;
  DeviceCommandId_t lastCmd = DeviceHandlerIF::NO_COMMAND_ID;
  BpxBatteryCfg cfgSet;
  std::array<uint8_t, 8> cmdBuf = {};
  PoolEntry<uint16_t> chargeCurrent = PoolEntry<uint16_t>({0});
  PoolEntry<uint16_t> dischargeCurrent = PoolEntry<uint16_t>({0});
  PoolEntry<uint16_t> heaterCurrent = PoolEntry<uint16_t>({0});
  PoolEntry<uint16_t> battVolt = PoolEntry<uint16_t>({0});
  PoolEntry<int16_t> battTemp1 = PoolEntry<int16_t>({0});
  PoolEntry<int16_t> battTemp2 = PoolEntry<int16_t>({0});
  PoolEntry<int16_t> battTemp3 = PoolEntry<int16_t>({0});
  PoolEntry<int16_t> battTemp4 = PoolEntry<int16_t>({0});
  PoolEntry<uint32_t> rebootCounter = PoolEntry<uint32_t>({0});
  PoolEntry<uint8_t> bootCause = PoolEntry<uint8_t>({0});
  PoolEntry<uint8_t> battheatMode = PoolEntry<uint8_t>({0});
  PoolEntry<int8_t> battheatLow = PoolEntry<int8_t>({0});
  PoolEntry<int8_t> battheatHigh = PoolEntry<int8_t>({0});

  void doStartUp() override;
  void doShutDown() override;
  ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t* id) override;
  ReturnValue_t buildTransitionDeviceCommand(DeviceCommandId_t* id) override;
  void fillCommandAndReplyMap() override;
  ReturnValue_t buildCommandFromCommand(DeviceCommandId_t deviceCommand, const uint8_t* commandData,
                                        size_t commandDataLen) override;
  ReturnValue_t scanForReply(const uint8_t* start, size_t remainingSize, DeviceCommandId_t* foundId,
                             size_t* foundLen) override;
  ReturnValue_t interpretDeviceReply(DeviceCommandId_t id, const uint8_t* packet) override;
  uint32_t getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) override;
  ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
                                        LocalDataPoolManager& poolManager) override;
};

#endif /* MISSION_DEVICES_BPXBATTERYHANDLER_H_ */