#include "Utility/RWTHVRUtilities.h"

#include "AudioDevice.h"
#include "IHeadMountedDisplay.h"
#include "IXRTrackingSystem.h"
#include "Engine/Engine.h"
#include "Engine/LocalPlayer.h"
#include "Kismet/GameplayStatics.h"

#if PLATFORM_SUPPORTS_CLUSTER
#include "Utility/RWTHVRClusterUtilities.h"
#endif


DEFINE_LOG_CATEGORY(Toolkit);

bool URWTHVRUtilities::IsDesktopMode() { return !IsRoomMountedMode() && !IsHeadMountedMode(); }

bool URWTHVRUtilities::IsHeadMountedMode()
{
	// In editor builds: checks for EdEngine->IsVRPreviewActive()
	// In packaged builds: checks for `-vr` in commandline or bStartInVR in UGeneralProjectSettings
	return FAudioDevice::CanUseVRAudioDevice();
}

bool URWTHVRUtilities::IsRoomMountedMode()
{
#if PLATFORM_SUPPORTS_CLUSTER
	return URWTHVRClusterUtilities::IsRoomMountedMode();
#endif
	return false;
}

bool URWTHVRUtilities::IsPrimaryNode()
{
#if PLATFORM_SUPPORTS_CLUSTER
	return URWTHVRClusterUtilities::IsPrimaryNode();
#endif
	return false;
}

float URWTHVRUtilities::GetEyeDistance()
{
	if (IsHeadMountedMode())
	{
		return GEngine->XRSystem->GetHMDDevice()->GetInterpupillaryDistance();
	}
	return 0;
}

void URWTHVRUtilities::ShowErrorAndQuit(UWorld* WorldContext, const FString& Message)
{
	UE_LOG(Toolkit, Error, TEXT("%s"), *Message)
#if WITH_EDITOR
	const FText Title = FText::FromString(FString("RUNTIME ERROR"));
	FMessageDialog::Open(EAppMsgType::Ok, FText::FromString(Message), Title);
#endif
	UKismetSystemLibrary::QuitGame(WorldContext, nullptr, EQuitPreference::Quit, false);
}