#pragma once

#include <string>
#include <string_view>
#include "system_time.hpp"

enum class SBE_CTD_MODE : uint8_t
{
	NONE = 0,
	CP,
	NON_CP
};

typedef struct stateEstimate_t
{
	float press_dBar;
	float vel_dBar_s;
	float bellowsDeltaVol_m3;
	SBE_CTD_MODE mode;
	systime::DateTimeStruct timestamp;
} stateEstimate_t;

// innerBellowsPos is more aptly referred to as a control input signal,
// but it is grouped here for convenience.
typedef struct stateObservation_t
{
	float press_dBar;
	float motorRate_rads_s;
	float innerBellowsPos_pctFull;
	systime::DateTimeStruct timestamp;
} stateObservation_t;

class PlatformStateEstimator
{
  public:
	PlatformStateEstimator(std::string id) : moduleID(id)
	{
	}

	const std::string_view moduleID;

	// Initialize the state estimator to the initial condition
	virtual void init(const stateEstimate_t x0) = 0;

	// Given a new observation, update and return the state estimate
	virtual stateEstimate_t update(const stateObservation_t obs, const SBE_CTD_MODE mode) = 0;

	virtual const stateEstimate_t getCurrentEstimate() = 0;

  protected:
	virtual ~PlatformStateEstimator() = default;
};