#pragma once

#include <fsfw/power/definitions.h>
#include <fsfw/returnvalues/returnvalue.h>
#include <fsfw_hal/linux/gpio/LinuxLibgpioIF.h>
#include <mission/com/CcsdsIpCoreHandler.h>
#include <mission/memory/SdCardMountedIF.h>
#include <mission/tcs/HeaterHandler.h>
#include <mission/tmtc/CfdpTmFunnel.h>
#include <mission/tmtc/PusTmFunnel.h>

#include <optional>
#include <string>

class GpioIF;
class SpiComIF;
class PowerSwitchIF;
class AcsController;

namespace ObjectFactory {

void createSunSensorComponents(GpioIF* gpioComIF, SpiComIF* spiComIF, PowerSwitchIF& pwrSwitcher,
                               std::string spiDev, bool swap0And6);
void createRtdComponents(std::string spiDev, GpioIF* gpioComIF, PowerSwitchIF* pwrSwitcher,
                         SpiComIF* comIF);

void createScexComponents(std::string uartDev, PowerSwitchIF* pwrSwitcher,
                          SdCardMountedIF& mountedIF, bool onImmediately,
                          std::optional<power::Switch_t> switchId);

void gpioChecker(ReturnValue_t result, std::string output);

AcsController* createAcsController(bool connectSubsystem, bool enableHkSets);

}  // namespace ObjectFactory