#include "MissionData.hpp"

#include <iostream>
#include <sstream>
#include <string>
#include <vector>

#include "FileSys.hpp"

// Serialization Library headers
#include <cereal/cereal.hpp>
#include <cereal/archives/binary.hpp>
#include <cereal/archives/json.hpp>

#include <cereal/types/string.hpp>
#include <cereal\types\vector.hpp>
#include <cereal\types\chrono.hpp>

struct MissionDataStruct
{
	uint16_t parkSamplePeriod_minutes;
	float maxMissionDuration_hours;
	uint16_t maxProfiles;
	float maxPressure_dBar;
	std::vector<MissionData::DepthTable> descendTable;
	std::vector<MissionData::DepthTable> ascendTable;

	template <class Archive>
		void serialize(Archive& missionFileArchive)
		{
			missionFileArchive(parkSamplePeriod_minutes, maxMissionDuration_hours, maxProfiles, maxPressure_dBar, descendTable, ascendTable);
		}
};

static MissionDataStruct cpfMissionData;

uint16_t MissionData::getSizeOfDescendTable()
{
	return (cpfMissionData.descendTable.size());
}

uint16_t MissionData::getSizeOfAscendTable()
{
	return (cpfMissionData.ascendTable.size());
}

void MissionData::readMissionData()
{	
	// TODO: what to do if file doesn't exist?
	// should this fcn retunr a bool to indicate success?
	std::stringstream missionFileStream;
	
	missionFileStream = FileSys::readFile("/MissionDataJSON.crl");

	cereal::JSONInputArchive iarchive(missionFileStream);
	iarchive(cpfMissionData);
}

void MissionData::writeMissionData()
{
	std::stringstream missionFileStream;

	{
		cereal::JSONInputArchive oarchive(missionFileStream);
		oarchive(cpfMissionData);
	
	}
	std::string missionFileString{missionFileStream.str()};
	
	const char* missionFileChars = missionFileString.c_str();
	
	//SDLogger::writeFile("./ConfigDataJSON.crl", missionFileChars, missionFileString.length());
}

void createStdMission()
{
}

MissionData::DepthTable MissionData::getDescendTableEntry(uint16_t lineNum)
{
	return (cpfMissionData.descendTable[lineNum]);
}

MissionData::DepthTable MissionData::getAscendTableEntry(uint16_t lineNum)
{
	return (cpfMissionData.ascendTable[lineNum]);
}

void MissionData::setParkSamplePeriod_minutes(uint16_t duration)
{
}

uint16_t MissionData::getParkSamplePeriod_minutes()
{
	return cpfMissionData.parkSamplePeriod_minutes;
}

float MissionData::getMaxMissionDuration_hours()
{
	return cpfMissionData.maxMissionDuration_hours;
}

uint16_t MissionData::getMaxProfiles()
{
	return cpfMissionData.maxProfiles;

}

void MissionData::setMaxProfiles(uint16_t maxProfiles)
{
}
float MissionData::getMaxPressure_dBar()
{
	return cpfMissionData.maxPressure_dBar;
}

float MissionData::setMaxPressure_dBar(float maxPressure)
{
}