#pragma once

#include "HealthTelemetry.h"
#include "LayerStackStore.h"
#include "RuntimeConfigStore.h"
#include "ShaderPackageCatalog.h"
#include "ShaderTypes.h"

#include <chrono>
#include <filesystem>
#include <map>
#include <string>
#include <vector>

struct ShaderCompilerInputs
{
	std::filesystem::path repoRoot;
	std::filesystem::path wrapperPath;
	std::filesystem::path generatedGlslPath;
	std::filesystem::path patchedGlslPath;
	unsigned maxTemporalHistoryFrames = 0;
};

struct RenderTimingSnapshot
{
	std::chrono::steady_clock::time_point startTime;
	double startupRandom = 0.0;
};

struct CommittedLiveStateReadModel
{
	std::vector<LayerStackStore::LayerPersistentState> layers;
	std::map<std::string, ShaderPackage> packagesById;
};

struct RenderSnapshotReadModel
{
	CommittedLiveStateReadModel committedLiveState;
	HealthTelemetry::SignalStatusSnapshot signalStatus;
	RenderTimingSnapshot timing;
};

struct RuntimeStatePresentationReadModel
{
	RuntimeConfigStore::AppConfig config;
	HealthTelemetry::Snapshot telemetry;
	LayerStackStore layerStack;
	ShaderPackageCatalog::Snapshot shaderCatalog;
	std::vector<ShaderPackageStatus> packageStatuses;
	std::vector<std::string> stackPresetNames;
	unsigned short serverPort = 0;
	bool autoReloadEnabled = false;
	bool compileSucceeded = false;
	std::string compileMessage;
};
