#pragma once

#include "CoreMinimal.h"
#include "HoudiniEngineCopyPropertiesInterface.h"
#include "Components/SceneComponent.h"
#include "UObject/NoExportTypes.h"
#include "EHoudiniCurveType.h"
#include "EHoudiniCurveMethod.h"
#include "EHoudiniCurveBreakpointParameterization.h"
#include "HoudiniSplineComponent.generated.h"

UCLASS(Blueprintable, EditInlineNew, meta=(BlueprintSpawnableComponent))
class HOUDINIENGINERUNTIME_API UHoudiniSplineComponent : public USceneComponent, public IHoudiniEngineCopyPropertiesInterface
{
	GENERATED_BODY()

public:
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	TArray<FTransform> CurvePoints;

	UPROPERTY(EditAnywhere)
	TArray<FVector3d> DisplayPoints;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	TArray<int32> DisplayPointIndexDivider;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	FString HoudiniSplineName;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	bool bClosed;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	bool bReversed;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	int32 CurveOrder;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	bool bIsHoudiniSplineVisible;

	UPROPERTY(EditAnywhere)
	EHoudiniCurveType CurveType;

	UPROPERTY(EditAnywhere)
	EHoudiniCurveMethod CurveMethod;

	UPROPERTY(EditAnywhere)
	EHoudiniCurveBreakpointParameterization CurveBreakpointParameterization;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	bool bIsOutputCurve;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	bool bCookOnCurveChanged;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	bool bIsLegacyInputCurve;

private:
	UPROPERTY(EditInstanceOnly, BlueprintReadWrite, Transient, DuplicateTransient, meta=(AllowPrivateAccess=true))
	bool bHasChanged;

	UPROPERTY(EditInstanceOnly, BlueprintReadWrite, Transient, DuplicateTransient, meta=(AllowPrivateAccess=true))
	bool bNeedsToTriggerUpdate;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	bool bIsInputCurve;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	bool bIsEditableOutputCurve;

	UPROPERTY(EditInstanceOnly, BlueprintReadWrite, Transient, DuplicateTransient, meta=(AllowPrivateAccess=true))
	int32 NodeId;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	FString PartName;

public:
	UHoudiniSplineComponent();
};

FORCEINLINE uint32 GetTypeHash(const UHoudiniSplineComponent) { return 0; }
