#include "CfdpUser.h"

#include <fsfw/ipc/QueueFactory.h>

using namespace returnvalue;

namespace cfdp {

EiveUserHandler::EiveUserHandler(HasFileSystemIF& vfs, StorageManagerIF& ipcStore,
                                 MessageQueueId_t cfdpRequestId)
    : cfdp::UserBase(vfs), userQueue(QueueFactory::instance()->createMessageQueue(10)) {
  if (userQueue == nullptr) {
    sif::error << "EiveUserHandler: Queue creation failed" << std::endl;
    return;
  }
  userQueue->setDefaultDestination(cfdpRequestId);
  reservedMsgParser = new ReservedMessageParser(ipcStore, *userQueue, cfdpRequestId);
}

EiveUserHandler::~EiveUserHandler() { QueueFactory::instance()->deleteMessageQueue(userQueue); }

void EiveUserHandler::transactionIndication(const cfdp::TransactionId& id) {}
void EiveUserHandler::eofSentIndication(const cfdp::TransactionId& id) {}
void EiveUserHandler::transactionFinishedIndication(const cfdp::TransactionFinishedParams& params) {
  sif::info << "File transaction finished for transaction with " << params.id << std::endl;
}
void EiveUserHandler::metadataRecvdIndication(const cfdp::MetadataRecvdParams& params) {
  sif::info << "Metadata received for transaction with " << params.id << std::endl;
  if (params.numberOfMsgsToUser > 0 and params.msgsToUserArray != nullptr) {
    ReturnValue_t result =
        reservedMsgParser->parse(params.msgsToUserArray, params.numberOfMsgsToUser);
    if (result != OK) {
      sif::warning << "EiveUserHandler: Parsing reserved CFDP messages failed" << std::endl;
    }
  }
}
void EiveUserHandler::fileSegmentRecvdIndication(const cfdp::FileSegmentRecvdParams& params) {}
void EiveUserHandler::reportIndication(const cfdp::TransactionId& id,
                                       cfdp::StatusReportIF& report) {}
void EiveUserHandler::suspendedIndication(const cfdp::TransactionId& id, cfdp::ConditionCode code) {
}
void EiveUserHandler::resumedIndication(const cfdp::TransactionId& id, size_t progress) {}
void EiveUserHandler::faultIndication(const cfdp::TransactionId& id, cfdp::ConditionCode code,
                                      size_t progress) {}
void EiveUserHandler::abandonedIndication(const cfdp::TransactionId& id, cfdp::ConditionCode code,
                                          size_t progress) {}
void EiveUserHandler::eofRecvIndication(const cfdp::TransactionId& id) {
  sif::info << "EOF PDU received for transaction with " << id << std::endl;
}

}  // namespace cfdp