#pragma once

#include <fsfw/controller/ExtendedControllerBase.h>
#include <mission/com/syrlinksDefs.h>
#include <mission/tcs/Max31865Definitions.h>

#include "Max31865Dummy.h"
#include "Tmp1075Dummy.h"

class TemperatureSensorInserter : public ExecutableObjectIF, public SystemObject {
 public:
  using Max31865DummyMap = std::map<object_id_t, Max31865Dummy*>;
  using Tmp1075DummyMap = std::map<object_id_t, Tmp1075Dummy*>;
  explicit TemperatureSensorInserter(object_id_t objectId, Max31865DummyMap tempSensorDummies_,
                                     std::optional<Tmp1075DummyMap> tempTmpSensorDummies_);

  ReturnValue_t initialize() override;
  ReturnValue_t initializeAfterTaskCreation() override;

 protected:
  ReturnValue_t performOperation(uint8_t opCode) override;

 private:
  Max31865DummyMap max31865DummyMap;
  std::optional<Tmp1075DummyMap> tmp1075DummyMap;

  enum TestCase {
    NONE = 0,
    COLD_SYRLINKS = 1,
    COLD_HPA = 2,
    COLD_MGT = 3,
    COLD_STR = 4,
    COLD_STR_CONSECUTIVE = 5,
    COLD_CAMERA = 6,
    COLD_PLOC_CONSECUTIVE = 7,
    COLD_PLOC_STAYS_COLD = 8,
    COLD_CAMERA_STAYS_COLD = 9
  };
  int iteration = 0;
  uint32_t cycles = 0;
  bool tempsWereInitialized = false;
  TestCase testCase = TestCase::NONE;

  // void noise();
};