#include "StrAssembly.h"

#include <eive/objects.h>

#include "mission/acs/str/strHelpers.h"

StrAssembly::StrAssembly(object_id_t objectId) : AssemblyBase(objectId) {
  ModeListEntry entry;
  entry.setObject(objects::STAR_TRACKER);
  entry.setMode(MODE_OFF);
  entry.setSubmode(SUBMODE_NONE);
  commandTable.insert(entry);
}

ReturnValue_t StrAssembly::commandChildren(Mode_t mode, Submode_t submode) {
  // To ensure consistent state.
  commandTable[0].setMode(MODE_OFF);
  commandTable[0].setSubmode(submode);
  if (healthHelper.healthTable->getHealth(objects::STAR_TRACKER) != FAULTY) {
    commandTable[0].setMode(mode);
    commandTable[0].setSubmode(submode);
  }
  HybridIterator<ModeListEntry> iter(commandTable.begin(), commandTable.end());
  executeTable(iter);
  return returnvalue::OK;
}

ReturnValue_t StrAssembly::checkChildrenStateOn(Mode_t wantedMode, Submode_t wantedSubmode) {
  if (childrenMap[objects::STAR_TRACKER].mode != wantedMode) {
    return NOT_ENOUGH_CHILDREN_IN_CORRECT_STATE;
  }
  return returnvalue::OK;
}

ReturnValue_t StrAssembly::isModeCombinationValid(Mode_t mode, Submode_t submode) {
  if ((mode == DeviceHandlerIF::MODE_NORMAL or mode == MODE_OFF) and submode != SUBMODE_NONE) {
    return HasModesIF::INVALID_SUBMODE;
  }
  if (mode == MODE_ON and
      (submode != startracker::SUBMODE_BOOTLOADER and submode != startracker::SUBMODE_FIRMWARE)) {
    return HasModesIF::INVALID_SUBMODE;
  }
  return returnvalue::OK;
}