#pragma once

#include "RuntimeLiveState.h"

#include <chrono>
#include <vector>

struct LayeredRenderStateInput
{
	const std::vector<RuntimeRenderState>* basePersistedLayerStates = nullptr;
	const std::vector<RuntimeRenderState>* committedLiveLayerStates = nullptr;
	RuntimeLiveState* transientAutomationOverlay = nullptr;
	bool allowTransientAutomationCommits = false;
	bool collectTransientAutomationCommitRequests = true;
	double transientAutomationSmoothing = 0.0;
	std::chrono::milliseconds transientAutomationCommitDelay = std::chrono::milliseconds(150);
	std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now();
};

struct RenderStateCompositionResult
{
	std::vector<RuntimeRenderState> layerStates;
	std::vector<RuntimeLiveOscCommitRequest> commitRequests;
	bool hasLayerStates = false;
};

class RenderStateComposer
{
public:
	RenderStateCompositionResult BuildFrameState(const LayeredRenderStateInput& input) const;
};
