#include "ObjectFactory.h"
#include <OBSWConfig.h>
#include <tmtc/apid.h>
#include <devices/addresses.h>
#include <tmtc/pusIds.h>

#include <fsfw/datapoollocal/LocalDataPoolManager.h>
#include <fsfw/tmtcservices/CommandingServiceBase.h>
#include <fsfw/tmtcservices/PusServiceBase.h>
#include <fsfw/osal/linux/TmTcUnixUdpBridge.h>
#include <fsfw/tmtcpacket/pus/TmPacketStored.h>
#include <fsfw/osal/linux/TcUnixUdpPollingTask.h>

#include <mission/core/GenericFactory.h>
#include <mission/devices/GomspaceDeviceHandler.h>
#include <mission/devices/devicedefinitions/GomSpacePackets.h>
#include <mission/devices/devicedefinitions/GomspaceDefinitions.h>
#include <mission/utility/TmFunnel.h>

#include <bsp_q7s/comIF/cookies/CspCookie.h>
#include <bsp_q7s/comIF/CspComIF.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::UDP_BRIDGE;
	// No storage object for now.
	TmFunnel::storageDestination = objects::NO_OBJECT;

	LocalDataPoolManager::defaultHkDestination = objects::NO_OBJECT;

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



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

    /* Cookies */
	CspCookie* p60DockCspCookie = new CspCookie(P60Dock::MAX_REPLY_LENGTH,
			addresses::P60DOCK);
	CspCookie* pdu1CspCookie = new CspCookie(PDU::MAX_REPLY_LENGTH,
			addresses::PDU1);
	CspCookie* pdu2CspCookie = new CspCookie(PDU::MAX_REPLY_LENGTH,
			addresses::PDU2);
	CspCookie* acuCspCookie = new CspCookie(ACU::MAX_REPLY_LENGTH,
				addresses::ACU);

    /* Communication interfaces */
	new CspComIF(objects::CSP_COM_IF);

    /* Device Handler */
	new GomspaceDeviceHandler(objects::P60DOCK_HANDLER, objects::CSP_COM_IF,
			p60DockCspCookie, P60Dock::MAX_CONFIGTABLE_ADDRESS,
			P60Dock::MAX_HKTABLE_ADDRESS);
	new GomspaceDeviceHandler(objects::PDU1_HANDLER, objects::CSP_COM_IF,
			pdu1CspCookie, PDU::MAX_CONFIGTABLE_ADDRESS,
			PDU::MAX_HKTABLE_ADDRESS);
	new GomspaceDeviceHandler(objects::PDU2_HANDLER, objects::CSP_COM_IF,
			pdu2CspCookie, PDU::MAX_CONFIGTABLE_ADDRESS,
			PDU::MAX_HKTABLE_ADDRESS);
	new GomspaceDeviceHandler(objects::ACU_HANDLER, objects::CSP_COM_IF,
				acuCspCookie, ACU::MAX_CONFIGTABLE_ADDRESS,
				ACU::MAX_HKTABLE_ADDRESS);

	new TmTcUnixUdpBridge(objects::UDP_BRIDGE,
			objects::CCSDS_PACKET_DISTRIBUTOR,
			objects::TM_STORE, objects::TC_STORE);
	new TcUnixUdpPollingTask(objects::UDP_POLLING_TASK, objects::UDP_BRIDGE);
}