#pragma once

#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "HyperTwistCore/HyperTwistCoreTypes.h"
#include "HyperTwistRecognition/HyperTwistRecognitionReplayLibrary.h"
#include "HyperTwistReplay/HyperTwistReplayTypes.h"
#include "HyperTwistReplay/HyperTwistReplayReviewLibrary.h"
#include "HyperTwistRecognition/HyperTwistRecognitionTypes.h"
#include "HyperTwistTraining/HyperTwistTrainingCoachLibrary.h"
#include "HyperTwistTraining/HyperTwistTrainingCatalogImportTypes.h"
#include "HyperTwistTraining/HyperTwistTrainingTypes.h"
#include "HyperTwistContractLibrary.generated.h"

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

public:
	UFUNCTION(BlueprintPure, Category = "HyperTwist|Core")
	static FHyperTwistPuzzleDefinitionRef MakeSampleClassicPuzzleDefinition();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Core")
	static FHyperTwistPuzzleDefinitionRef MakeSampleHyperPuzzleDefinition();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Core")
	static FHyperTwistPuzzleState MakeSampleClassicPuzzleState();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Core")
	static FHyperTwistPuzzleState MakeSampleClassicRecognitionPreviewState();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Core")
	static FHyperTwistPuzzleState MakeSampleHyperPuzzleState();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Core")
	static FHyperTwistTransformation MakeSampleClassicTransformation();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Replay")
	static FHyperTwistReplayPacket MakeSampleRuntimeReplayPacket();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Replay")
	static FHyperTwistReplayPacket MakeSampleRecognitionReplayPacket();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Recognition")
	static FHyperTwistVisionSessionConfig MakeSampleVisionSessionConfig();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Recognition")
	static FHyperTwistVisionPreviewResult MakeMockVisionPreviewResult();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Recognition")
	static FHyperTwistVisionCommitResult MakeMockVisionCommitResult();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Recognition")
	static FHyperTwistVisionFinalizeResult MakeMockVisionFinalizeResult();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Recognition")
	static FHyperTwistVisionServiceHealth MakeMockVisionServiceHealth();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
	static FHyperTwistContentPack MakeSampleAlgTrainerContentPack();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
	static FHyperTwistContentPack MakeSampleCrossTrainerContentPack();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
	static FHyperTwistContentPack MakeSampleFiveStyleContentPack();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Catalog")
	static FHyperTwistTrainingCatalogImportLoadReport MakeBundledCatalogMaterializationLoadReport();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
	static FHyperTwistTrainingRunState MakeSampleTrainingRunState();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Drill")
	static FHyperTwistTrainingMethodDrillDefinition MakeSampleMethodDrillDefinition();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Drill")
	static FHyperTwistTrainingMethodDrillRunState MakeSampleMethodDrillRunState();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Drill")
	static FHyperTwistTrainingMethodDrillSummary MakeSampleMethodDrillSummary();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Drill")
	static FHyperTwistTrainingMethodDrillFavoriteEntry MakeSampleMethodDrillFavoriteEntry();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Drill")
	static FHyperTwistTrainingMethodDrillBatch MakeSampleMethodDrillBatch();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Drill")
	static FHyperTwistTrainingMethodDrillDefinition MakeSampleFavoriteFirstMethodDrillDefinition();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Drill")
	static FHyperTwistTrainingMethodDrillBatchReadiness MakeSampleMethodDrillBatchReadiness();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Drill")
	static FHyperTwistTrainingDrillCaseModeCompatibility MakeSampleMethodDrillCaseModeCompatibility();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Drill")
	static FHyperTwistTrainingMethodDrillDiagnosticPacket MakeSampleMethodDrillDiagnosticPacket();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Drill")
	static FHyperTwistTrainingSessionTemplate MakeSampleMethodDrillFollowUpTemplate();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
	static FHyperTwistTrainingRunStepResult MakeSampleTrainingRunStepResult();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
	static FHyperTwistTrainingSessionSummary MakeSampleTrainingRunSummary();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
	static FHyperTwistTrainingTimingPolicy MakeSampleTrainingTimingPolicy();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
	static FHyperTwistTrainingTimingBreakdown MakeSampleTrainingTimingBreakdown();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
	static FHyperTwistTrainingRepositoryState MakeSampleTrainingRepositoryState();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
	static FHyperTwistTrainingRepositoryIntegrityReport MakeSampleTrainingRepositoryIntegrityReport();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
	static FHyperTwistTrainingDeckHistorySummary MakeSampleTrainingDeckHistorySummary();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
	static FHyperTwistTrainingTimingTrendSummary MakeSampleTrainingTimingTrendSummary();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
	static FHyperTwistTrainingPersonalBestSummary MakeSampleTrainingPersonalBestSummary();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
	static FHyperTwistTrainingTimerExportPacket MakeSampleTrainingTimerExportPacket();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
	static FHyperTwistTrainingTimerExportIntegrityReport MakeSampleTrainingTimerExportIntegrityReport();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
	static FHyperTwistTrainingCaseScopedStats MakeSampleTrainingCaseScopedStats();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
	static FHyperTwistTrainingDeckScopedStats MakeSampleTrainingDeckScopedStats();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
	static FHyperTwistTrainingCaseLearnerState MakeSampleTrainingCaseLearnerState();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
	static FHyperTwistTrainingLearnerDeckStateSummary MakeSampleTrainingLearnerDeckStateSummary();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
	static FHyperTwistTrainingLearnerProfile MakeSampleTrainingLearnerProfile();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
	static FHyperTwistTrainingCoachMemorySnapshot MakeSampleTrainingCoachMemorySnapshot();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
	static TArray<FHyperTwistTrainingMethodSegment> MakeSampleTrainingMethodSegments();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
	static TArray<FHyperTwistTrainingLearnerPreset> MakeSampleTrainingLearnerPresets();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
	static TArray<FHyperTwistTrainingSessionTemplate> MakeSampleTrainingSessionTemplates();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
	static FHyperTwistTrainingSessionTemplate MakeSampleCustomizedTrainingSessionTemplate();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
	static FHyperTwistTrainingDeck MakeSampleTrainingSessionTemplateDeck();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
	static TArray<FHyperTwistTrainingCaseRecommendation> MakeSampleTrainingCaseRecommendations();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
	static FHyperTwistTrainingDeck MakeSampleTrainingReviewDeck();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
	static FHyperTwistTrainingReviewPlanState MakeSampleTrainingReviewPlanState();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
	static FHyperTwistTrainingReviewFlowStatus MakeSampleTrainingReviewFlowStatus();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training")
	static FHyperTwistTrainingReviewProgramSummary MakeSampleTrainingReviewProgramSummary();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Replay")
	static FHyperTwistReplayReviewAnalytics MakeSampleReplayReviewAnalytics();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Recognition")
	static FHyperTwistRecognitionReplaySummary MakeSampleRecognitionReplaySummary();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
	static TArray<FHyperTwistCoachSignal> MakeSampleTrainingCoachSignals();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
	static FHyperTwistCoachBrief MakeSampleTrainingCoachBrief();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
	static FHyperTwistTrainingCoachActionPlan MakeSampleTrainingCoachActionPlan();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
	static FHyperTwistTrainingCoachActionPlanSummary MakeSampleTrainingCoachActionPlanSummary();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
	static FHyperTwistTrainingCoachActionPlanOutcomeSummary MakeSampleTrainingCoachActionPlanOutcomeSummary();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
	static FHyperTwistTrainingCoachActionSequenceSummary MakeSampleTrainingCoachActionSequenceSummary();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
	static FHyperTwistTrainingCoachActionClosureSummary MakeSampleTrainingCoachActionClosureSummary();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
	static FHyperTwistTrainingCoachClosureMemorySummary MakeSampleTrainingCoachClosureMemorySummary();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
	static FHyperTwistTrainingCoachRecommendationHistorySummary MakeSampleTrainingCoachRecommendationHistorySummary();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
	static FHyperTwistTrainingCoachCarryForwardPolicySummary MakeSampleTrainingCoachCarryForwardPolicySummary();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
	static FHyperTwistTrainingCoachArchivePolicySummary MakeSampleTrainingCoachArchivePolicySummary();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
	static FHyperTwistCoachBrief MakeSampleTrainingCoachFollowUpBrief();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
	static FHyperTwistCoachSessionQueueSummary MakeSampleTrainingCoachSessionQueueSummary();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
	static FHyperTwistTrainingCoachSessionQueueState MakeSampleTrainingCoachSessionQueueState();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
	static FHyperTwistCoachScheduleHorizonSummary MakeSampleTrainingCoachScheduleHorizonSummary();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
	static FHyperTwistCoachSchedulePolicySummary MakeSampleTrainingCoachSchedulePolicySummary();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Training|Coach")
	static FHyperTwistTrainingCoachSessionQueueExecutionSummary MakeSampleTrainingCoachSessionQueueExecutionSummary();

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Validation")
	static bool IsPuzzleStateStructurallyValid(const FHyperTwistPuzzleState& State);

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Validation")
	static bool IsReplayPacketStructurallyValid(const FHyperTwistReplayPacket& Packet);

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Serialization")
	static FString SerializePuzzleStateToJson(const FHyperTwistPuzzleState& State);

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Serialization")
	static FString SerializeReplayPacketToJson(const FHyperTwistReplayPacket& Packet);

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Serialization")
	static FString SerializeContentPackToJson(const FHyperTwistContentPack& ContentPack);

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Serialization")
	static FString SerializeMethodDrillDefinitionToJson(
		const FHyperTwistTrainingMethodDrillDefinition& DrillDefinition
	);

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Serialization")
	static FString SerializeMethodDrillRunStateToJson(
		const FHyperTwistTrainingMethodDrillRunState& RunState
	);

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Serialization")
	static FString SerializeMethodDrillFavoriteEntryToJson(
		const FHyperTwistTrainingMethodDrillFavoriteEntry& FavoriteEntry
	);

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Serialization")
	static FString SerializeMethodDrillBatchToJson(
		const FHyperTwistTrainingMethodDrillBatch& DrillBatch
	);

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Serialization")
	static FString SerializeTrainingRepositoryStateToJson(const FHyperTwistTrainingRepositoryState& RepositoryState);

	UFUNCTION(BlueprintPure, Category = "HyperTwist|Serialization")
	static FString SerializeTrainingTimerExportPacketToJson(const FHyperTwistTrainingTimerExportPacket& TimerExportPacket);

	UFUNCTION(BlueprintCallable, Category = "HyperTwist|Serialization")
	static bool DeserializePuzzleStateFromJson(const FString& Json, FHyperTwistPuzzleState& OutState);

	UFUNCTION(BlueprintCallable, Category = "HyperTwist|Serialization")
	static bool DeserializeReplayPacketFromJson(const FString& Json, FHyperTwistReplayPacket& OutPacket);

	UFUNCTION(BlueprintCallable, Category = "HyperTwist|Serialization")
	static bool DeserializeContentPackFromJson(const FString& Json, FHyperTwistContentPack& OutContentPack);

	UFUNCTION(BlueprintCallable, Category = "HyperTwist|Serialization")
	static bool DeserializeMethodDrillDefinitionFromJson(
		const FString& Json,
		FHyperTwistTrainingMethodDrillDefinition& OutDrillDefinition
	);

	UFUNCTION(BlueprintCallable, Category = "HyperTwist|Serialization")
	static bool DeserializeMethodDrillRunStateFromJson(
		const FString& Json,
		FHyperTwistTrainingMethodDrillRunState& OutRunState
	);

	UFUNCTION(BlueprintCallable, Category = "HyperTwist|Serialization")
	static bool DeserializeMethodDrillFavoriteEntryFromJson(
		const FString& Json,
		FHyperTwistTrainingMethodDrillFavoriteEntry& OutFavoriteEntry
	);

	UFUNCTION(BlueprintCallable, Category = "HyperTwist|Serialization")
	static bool DeserializeMethodDrillBatchFromJson(
		const FString& Json,
		FHyperTwistTrainingMethodDrillBatch& OutDrillBatch
	);

	UFUNCTION(BlueprintCallable, Category = "HyperTwist|Serialization")
	static bool DeserializeTrainingRepositoryStateFromJson(const FString& Json, FHyperTwistTrainingRepositoryState& OutRepositoryState);

	UFUNCTION(BlueprintCallable, Category = "HyperTwist|Serialization")
	static bool DeserializeTrainingTimerExportPacketFromJson(const FString& Json, FHyperTwistTrainingTimerExportPacket& OutTimerExportPacket);
};
