// Copyright (c) Meta Platforms, Inc. and affiliates.

#include "OculusXRPassthroughModule.h"

#include "OculusXRHMD.h"
#include "OculusXRPassthroughEventHandling.h"
#include "Misc/CoreDelegates.h"

DEFINE_LOG_CATEGORY(LogOculusXRPassthrough);

#define LOCTEXT_NAMESPACE "OculusXRPassthrough"

//-------------------------------------------------------------------------------------------------
// FOculusXRPassthroughModule
//-------------------------------------------------------------------------------------------------

FOculusXRPassthroughModule::FOculusXRPassthroughModule()
{
}

void FOculusXRPassthroughModule::StartupModule()
{
	PassthroughXR = MakeShareable(new XRPassthrough::FPassthroughXR());
	PassthroughXR->RegisterAsOpenXRExtension();

	FCoreDelegates::OnPostEngineInit.AddRaw(this, &FOculusXRPassthroughModule::OnPostEngineInit);
}

void FOculusXRPassthroughModule::ShutdownModule()
{
}

void FOculusXRPassthroughModule::OnPostEngineInit()
{
	if (IsRunningCommandlet())
	{
		return;
	}

	if (!GEngine)
	{
		UE_LOG(LogOculusXRPassthrough, Warning, TEXT("No GEngine, cannot add event polling delegate."));
		return;
	}

	OculusXRHMD::FOculusXRHMD* HMD = OculusXRHMD::FOculusXRHMD::GetOculusXRHMD();
	if (!HMD)
	{
		FName XRSystemName = GEngine->XRSystem ? GEngine->XRSystem->GetSystemName() : "None";
		UE_LOG(LogOculusXRPassthrough, Warning, TEXT("Unable to retrieve OculusXRHMD, cannot add event polling delegate. (current xrsystem : %s)"), *XRSystemName.ToString());
		return;
	}

	HMD->AddEventPollingDelegate(OculusXRHMD::FOculusXRHMDEventPollingDelegate::CreateStatic(&OculusXRPassthrough::FOculusXRPassthroughEventHandling::OnPollEvent));
}

IMPLEMENT_MODULE(FOculusXRPassthroughModule, OculusXRPassthrough)

#undef LOCTEXT_NAMESPACE