#ifndef ECSS_SERVICES_TIMEBASEDSCHEDULINGSERVICE_HPP
#define ECSS_SERVICES_TIMEBASEDSCHEDULINGSERVICE_HPP

#include <iostream>
#include "etl/vector.h"
#include "etl/iterator.h"
#include "etl/String.hpp"
#include "Service.hpp"
#include "ErrorHandler.hpp"
#include "MessageParser.hpp"
#include "Helpers/CRCHelper.hpp"
#include "Helpers/TimeHelper.hpp"

// Define whether groups and/or sub-schedules are in use
#define GROUPS_ENABLED          0
#define SUB_SCHEDULES_ENABLED   0

#define MAX_NUMBER_OF_ACTIVITIES    10 // todo: Define the maximum number of activities
#define TIME_MARGIN_FOR_ACTIVATION  60 // todo: Define the time margin for the command activation
#define MAX_DELTA_OF_RELEASE_TIME   60 // todo: Define the maximum delta between the specified
// release time and the actual release time


class TimeBasedSchedulingService : public Service {
public:


private:
	bool executionFunctionStatus = false; // True indicates "enabled" and False "disabled" state
	uint8_t currentNumberOfActivities = 0; // Keep track of the number of activities
	MessageParser msgParser; // Parse TC packets

	// Define the request ID structure
	struct RequestID {
		uint16_t applicationID = 0;
		uint16_t sequenceCount = 0;
		uint8_t sourceID = 0;

		bool operator!=(const RequestID &rightSide) const {
			return (sequenceCount != rightSide.sequenceCount) or
			       (applicationID != rightSide.applicationID) or (sourceID != rightSide.sourceID);
		}
	};

	// Hold the data for the scheduled activity definition
	struct ScheduledActivity {
		Message request; // Hold the received command request
		RequestID requestID; // Request ID, characteristic of the definition
		uint32_t requestReleaseTime = 0; // Keep the command release time
		// todo: If we decide to use sub-schedules, the ID of that has to be defined
		// todo: If groups are used, then the group ID has to be defined here
	};
	etl::vector<ScheduledActivity, MAX_NUMBER_OF_ACTIVITIES> scheduledActivities; // Scheduled activity definitions


public:
	/**
	 * TC[11,1] enable the time-based schedule execution function
	 *
	 * @details Enables the time-based command execution scheduling
	 * @param request Provide the received message as a parameter
	 */
	void enableScheduleExecution(Message &request);

	/**
	 * TC[11,2] disable the time-based schedule execution function
	 *
	 * @details Disables the time-based command execution scheduling
	 * @param request Provide the received message as a parameter
	 */
	void disableScheduleExecution(Message &request);

	/**
	 * TC[11,3] reset the time-based schedule
	 *
	 * @details Resets the time-based command execution schedule (deletes the schedule)
	 * @param request Provide the received message as a parameter
	 */
	void resetSchedule(Message &request);

	/**
	 * TC[11,4] insert activities into the time based schedule
	 *
	 * @details Add activities into the schedule for future execution
	 * @param request Provide the received message as a parameter
	 */
	void insertActivities(Message &request);

	/**
	 * TC[11,15] time-shift all scheduled activities
	 *
	 * @details All scheduled activities are shifted per user request
	 * @param request Provide the received message as a parameter
	 */
	void timeShiftAllActivities(Message &request);

	/**
	 * TC[11,16] detail-report all activities
	 *
	 * @details Send a detailed report about the status of all the activities
				on the current schedule
	 * @param request Provide the received message as a parameter
	 */
	void detailReportAllActivities(Message &request);

	/**
	 * TC[11,9] detail-report activities identified by request identifier
	 *
	 * @details Send a detailed report about the status of the requested activities
	 * @param request Provide the received message as a parameter
	 */
	void detailReporActivitiesByID(Message &request);

	/**
	 * TC[11,12] summary-report activities identified by request identifier
	 *
	 * @details Send a summary report about the status of the requested activities
	 * @param request Provide the received message as a parameter
	 */
	void summaryReporActivitiesByID(Message &request);

	/**
	 * TC[11,5] delete time-based scheduled activities identified by a request identifier
	 *
	 * @details Delete certain activities by using the unique request identifier
	 * @param request Provide the received message as a parameter
	 */
	void deleteActivitiesByID(Message &request);

	/**
	 * TC[11,7] time-shift scheduled activities identified by a request identifier
	 *
	 * @details Time-shift certain activities by using the unique request identifier
	 * @param request Provide the received message as a parameter
	 */
	void timeShiftActivitiesByID(Message &request);


private:


};

#endif //ECSS_SERVICES_TIMEBASEDSCHEDULINGSERVICE_HPP