#include "ObjectFactory.h"

#include <devConf.h>
#include <fsfw/src/fsfw/osal/common/TcpTmTcBridge.h>
#include <fsfw/src/fsfw/osal/common/TcpTmTcServer.h>
#include <fsfw_hal/linux/uart/UartComIF.h>
#include <fsfw_hal/linux/uart/UartCookie.h>
#include <mission/devices/GPSHyperionHandler.h>

#include "OBSWConfig.h"
#include "busConf.h"
#include "fsfw/datapoollocal/LocalDataPoolManager.h"
#include "fsfw/tmtcpacket/pus/tm.h"
#include "fsfw/tmtcservices/CommandingServiceBase.h"
#include "fsfw/tmtcservices/PusServiceBase.h"
#include "linux/devices/devicedefinitions/StarTrackerDefinitions.h"
#include "linux/devices/startracker/StarTrackerHandler.h"
#include "mission/core/GenericFactory.h"
#include "mission/utility/TmFunnel.h"
#include "objects/systemObjectList.h"
#include "tmtc/apid.h"
#include "tmtc/pusIds.h"

void Factory::setStaticFrameworkObjectIds() {
  PusServiceBase::packetSource = objects::PUS_PACKET_DISTRIBUTOR;
  PusServiceBase::packetDestination = objects::TM_FUNNEL;

  CommandingServiceBase::defaultPacketSource = objects::PUS_PACKET_DISTRIBUTOR;
  CommandingServiceBase::defaultPacketDestination = objects::TM_FUNNEL;

  TmFunnel::downlinkDestination = objects::TMTC_BRIDGE;
  TmFunnel::storageDestination = objects::NO_OBJECT;

  VerificationReporter::messageReceiver = objects::PUS_SERVICE_1_VERIFICATION;
  TmPacketBase::timeStamperId = objects::TIME_STAMPER;
}

void ObjectFactory::produce(void* args) {
  Factory::setStaticFrameworkObjectIds();
  ObjectFactory::produceGenericObjects();

  UartCookie* starTrackerCookie =
      new UartCookie(objects::STAR_TRACKER, egse::STAR_TRACKER_UART, UartModes::NON_CANONICAL,
                     uart::STAR_TRACKER_BAUD, startracker::MAX_FRAME_SIZE * 2 + 2);
  new UartComIF(objects::UART_COM_IF);
  starTrackerCookie->setNoFixedSizeReply();
  StrHelper* strHelper = new StrHelper(objects::STR_HELPER);
  StarTrackerHandler* starTrackerHandler = new StarTrackerHandler(
      objects::STAR_TRACKER, objects::UART_COM_IF, starTrackerCookie, strHelper);
  starTrackerHandler->setStartUpImmediately();
}