#include "ObjectFactory.h"

#include <fsfw/objectmanager/frameworkObjects.h>
#include <fsfw/storagemanager/PoolManager.h>
#include <fsfw/tmtc/TmManager.h>

#include <mission/controller/PrintController.h>
#include <mission/controller/BlinkController.h>

#include <mission/devices/LightHandler.h>

#include "fsfw/events/EventManager.h"
#include "fsfw/health/HealthTable.h"
#include "fsfw/internalerror/InternalErrorReporter.h"
#include "systemObjects.h"

namespace objects {
enum commonObjects : object_id_t {

  /* 0x63 ('C') for core objects */
  CCSDS_DISTRIBUTOR = 0x63000000,
  PUS_DISTRIBUTOR = 0x63000001,
  TM_FUNNEL = 0x63000002,
  CFDP_DISTRIBUTOR = 0x63000003,
  CFDP_HANDLER = 0x63000004,
  PUS_TM_FUNNEL = 0x63000005,
  CFDP_TM_FUNNEL = 0x64000006,
};
}


// void Factory::setStaticFrameworkObjectIds() {
//   // MonitoringReportContent<float>::timeStamperId = objects::TIME_STAMPER;
//   // MonitoringReportContent<double>::timeStamperId = objects::TIME_STAMPER;
//   // MonitoringReportContent<uint32_t>::timeStamperId = objects::TIME_STAMPER;
//   // MonitoringReportContent<int32_t>::timeStamperId = objects::TIME_STAMPER;
//   // MonitoringReportContent<int16_t>::timeStamperId = objects::TIME_STAMPER;
//   // MonitoringReportContent<uint16_t>::timeStamperId = objects::TIME_STAMPER;

//   // PusServiceBase::PUS_DISTRIBUTOR = objects::PUS_DISTRIBUTOR;
//   // PusServiceBase::PACKET_DESTINATION = objects::PUS_TM_FUNNEL;

//   // CommandingServiceBase::defaultPacketSource = objects::PUS_DISTRIBUTOR;
//   // CommandingServiceBase::defaultPacketDestination = objects::PUS_TM_FUNNEL;

//   // VerificationReporter::DEFAULT_RECEIVER = objects::PUS_SERVICE_1_VERIFICATION;
// }

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

  

  {
    LocalPool::LocalPoolConfig poolCfg = {{100, 16}, {50, 32},   {40, 64},
                                          {30, 128}, {20, 1024}, {10, 2048}};
    new PoolManager(objects::IPC_STORE, poolCfg);
  }

  new EventManager(objects::EVENT_MANAGER, 20);
  new HealthTable(objects::HEALTH_TABLE);
  new InternalErrorReporter(objects::INTERNAL_ERROR_REPORTER);

  new TmManager(objects::TM_MANAGER);

  new PrintController(123);
  new BlinkController(124);

  new LightHandler(125, new ComIF(), *CookieIF);

}