#pragma once

#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "HyperTwistMemory/HyperTwistMemoryTypes.h"
#include "HyperTwistTraining/HyperTwistTrainingTypes.h"
#include "HyperTwistMemoryCoreLibrary.generated.h"

UCLASS()
class UNREALHYPERTWIST_API UHyperTwistMemoryCoreLibrary : public UBlueprintFunctionLibrary
{
	GENERATED_BODY()

public:
	UFUNCTION(BlueprintPure, Category = "HyperTwist|Memory")
	static FHyperTwistMemoryLedgerState DeriveMemoryLedgerState(
		const FHyperTwistTrainingRepositoryState& RepositoryState,
		const FString& UserId,
		const FString& ReferenceUtc
	);

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Memory")
	static FHyperTwistMemoryChronicleContinuityState DeriveMemoryChronicleContinuityState(
		const FHyperTwistTrainingRepositoryState& RepositoryState,
		const FString& UserId,
		const FString& ReferenceUtc
	);

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Memory")
	static FHyperTwistMemoryRecallSharedContextState DeriveMemoryRecallSharedContextState(
		const FHyperTwistTrainingRepositoryState& RepositoryState,
		const FString& UserId,
		const FString& ReferenceUtc,
		const FString& QueryText
	);

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Memory")
	static FHyperTwistMemoryCognitiveConsolidationState DeriveMemoryCognitiveConsolidationState(
		const FHyperTwistTrainingRepositoryState& RepositoryState,
		const FString& UserId,
		const FString& ReferenceUtc
	);

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Memory")
	static FHyperTwistMemoryKnowledgeNotesState DeriveMemoryKnowledgeNotesState(
		const FHyperTwistTrainingRepositoryState& RepositoryState,
		const FString& UserId,
		const FString& ReferenceUtc
	);

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Memory")
	static FHyperTwistMemoryDerivedAdjunctState DeriveMemoryDerivedAdjunctState(
		const FHyperTwistTrainingRepositoryState& RepositoryState,
		const FString& UserId,
		const FString& ReferenceUtc,
		EHyperTwistMemoryContextAssemblyProfile ContextAssemblyProfile
	);
};
