#include "TcPacketCheck.h"

#include "../globalfunctions/CRC.h"
#include "../serviceinterface/ServiceInterfaceStream.h"
#include "../storagemanager/StorageManagerIF.h"
#include "../tmtcservices/VerificationCodes.h"

TcPacketCheck::TcPacketCheck( uint16_t setApid ) : apid(setApid) {
}

ReturnValue_t TcPacketCheck::checkPacket( TcPacketStored* currentPacket ) {
	uint16_t calculated_crc = CRC::crc16ccitt( currentPacket->getWholeData(),
	        currentPacket->getFullSize() );
	if ( calculated_crc != 0 ) {
		return INCORRECT_CHECKSUM;
	}
	bool condition = (not currentPacket->hasSecondaryHeader()) or
			(currentPacket->getPacketVersionNumber() != CCSDS_VERSION_NUMBER) or
			(not currentPacket->isTelecommand());
	if ( condition ) {
		return INCORRECT_PRIMARY_HEADER;
	}
	if ( currentPacket->getAPID() != this->apid )
		return ILLEGAL_APID;

	if ( not currentPacket->isSizeCorrect() ) {
		return INCOMPLETE_PACKET;
	}
	condition = (currentPacket->getSecondaryHeaderFlag() != CCSDS_SECONDARY_HEADER_FLAG) ||
			(currentPacket->getPusVersionNumber() != PUS_VERSION_NUMBER);
	if ( condition ) {
		return INCORRECT_SECONDARY_HEADER;
	}
	return RETURN_OK;
}

uint16_t TcPacketCheck::getApid() const {
	return apid;
}