#pragma once

#include <fsfw/power/definitions.h>
#include <fsfw/returnvalues/returnvalue.h>
#include <fsfw_hal/linux/gpio/LinuxLibgpioIF.h>
#include <mission/memory/SdCardMountedIF.h>
#include <mission/tmtc/CcsdsIpCoreHandler.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);
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);

void createThermalController();
AcsController* createAcsController(bool connectSubsystem);

void addTmtcIpCoresToFunnels(CcsdsIpCoreHandler& ipCoreHandler, PusTmFunnel& pusFunnel,
                             CfdpTmFunnel& cfdpFunnel);

}  // namespace ObjectFactory