#pragma once

#include <string>
#include <vector>

enum class RuntimeStateLayerKind
{
	BasePersisted,
	CommittedLive,
	TransientAutomation,
	RenderLocal,
	HealthConfig
};

enum class RuntimeStateField
{
	PersistedLayerStack,
	PersistedParameterValues,
	StackPresets,
	CommittedSessionParameterValues,
	CommittedLayerBypass,
	RuntimeCompileReloadFlags,
	TransientOscOverlay,
	TransientAutomationCommitState,
	RenderLocalTemporalHistory,
	RenderLocalFeedbackState,
	RenderLocalInputFrames,
	RenderLocalOutputFrames,
	RuntimeConfiguration,
	HealthTelemetry
};

struct RuntimeStateLayerDescriptor
{
	RuntimeStateLayerKind kind = RuntimeStateLayerKind::BasePersisted;
	const char* name = "";
	const char* owner = "";
	const char* lifetime = "";
	const char* persistence = "";
	const char* renderRole = "";
};

struct RuntimeStateFieldDescriptor
{
	RuntimeStateField field = RuntimeStateField::PersistedLayerStack;
	RuntimeStateLayerKind layerKind = RuntimeStateLayerKind::BasePersisted;
	const char* name = "";
	const char* currentOwner = "";
	const char* notes = "";
};

const char* RuntimeStateLayerKindName(RuntimeStateLayerKind kind);
int RuntimeStateLayerCompositionPrecedence(RuntimeStateLayerKind kind);
bool RuntimeStateLayerIsDurable(RuntimeStateLayerKind kind);
bool RuntimeStateLayerParticipatesInParameterComposition(RuntimeStateLayerKind kind);
bool RuntimeStateLayerIsRenderLocal(RuntimeStateLayerKind kind);

RuntimeStateLayerKind ClassifyRuntimeStateField(RuntimeStateField field);
std::vector<RuntimeStateLayerDescriptor> GetRuntimeStateLayerInventory();
std::vector<RuntimeStateFieldDescriptor> GetRuntimeStateFieldInventory();

