#include "Tmp1075Dummy.h"

#include <fsfw/datapool/PoolReadGuard.h>
#include <mission/tcs/Tmp1075Definitions.h>

using namespace returnvalue;

Tmp1075Dummy::Tmp1075Dummy(object_id_t objectId, object_id_t comif, CookieIF *comCookie)
    : DeviceHandlerBase(objectId, comif, comCookie), set(this) {}

void Tmp1075Dummy::doStartUp() { setMode(MODE_ON); }
void Tmp1075Dummy::doShutDown() {
  PoolReadGuard pg(&set);
  set.setValidity(false, true);
  setMode(MODE_OFF);
}

ReturnValue_t Tmp1075Dummy::buildNormalDeviceCommand(DeviceCommandId_t *id) {
  return NOTHING_TO_SEND;
}

ReturnValue_t Tmp1075Dummy::buildTransitionDeviceCommand(DeviceCommandId_t *id) {
  return NOTHING_TO_SEND;
}

ReturnValue_t Tmp1075Dummy::buildCommandFromCommand(DeviceCommandId_t deviceCommand,
                                                    const uint8_t *commandData,
                                                    size_t commandDataLen) {
  return NOTHING_TO_SEND;
}

ReturnValue_t Tmp1075Dummy::scanForReply(const uint8_t *start, size_t len,
                                         DeviceCommandId_t *foundId, size_t *foundLen) {
  return 0;
}

ReturnValue_t Tmp1075Dummy::interpretDeviceReply(DeviceCommandId_t id, const uint8_t *packet) {
  return 0;
}

void Tmp1075Dummy::setTemperature(float temperature, bool valid) {
  PoolReadGuard pg(&set);
  set.temperatureCelcius.value = temperature;
  set.setValidity(valid, true);
}

void Tmp1075Dummy::fillCommandAndReplyMap() {}

uint32_t Tmp1075Dummy::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) { return 1000; }

ReturnValue_t Tmp1075Dummy::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
                                                    LocalDataPoolManager &poolManager) {
  localDataPoolMap.emplace(TMP1075::TEMPERATURE_C_TMP1075, new PoolEntry<float>({10.0}, true));
  return OK;
}

ReturnValue_t Tmp1075Dummy::setHealth(HealthState health) {
  if (health == FAULTY or health == PERMANENT_FAULTY) {
    setMode(_MODE_SHUT_DOWN);
  }
  return DeviceHandlerBase::setHealth(health);
}

LocalPoolDataSetBase *Tmp1075Dummy::getDataSetHandle(sid_t sid) { return &set; }