#pragma once

#include "CoreMinimal.h"
#include "HyperTwistCore/HyperTwistCoreTypes.h"
#include "HyperTwistSimulationTypes.generated.h"

UENUM(BlueprintType)
enum class EHyperTwistProjectionKind : uint8
{
	ClassicPerspective UMETA(DisplayName = "Classic Perspective"),
	HyperProjection UMETA(DisplayName = "Hyper Projection"),
	Orthographic UMETA(DisplayName = "Orthographic")
};

USTRUCT(BlueprintType)
struct FHyperTwistProjectionSettings
{
	GENERATED_BODY()

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
	EHyperTwistProjectionKind ProjectionKind = EHyperTwistProjectionKind::ClassicPerspective;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
	FString ProjectionProfile = TEXT("classic-default");

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
	float ProjectionDepth = 1.0f;
};

USTRUCT(BlueprintType)
struct FHyperTwistSimulationSceneContext
{
	GENERATED_BODY()

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
	FString SceneContextId;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
	FHyperTwistPuzzleState PuzzleState;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
	FHyperTwistProjectionSettings ProjectionSettings;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "HyperTwist")
	FString RenderStateProfile;

	bool IsStructurallyValid() const
	{
		return !SceneContextId.IsEmpty() && PuzzleState.IsStructurallyValid() && !RenderStateProfile.IsEmpty();
	}
};
