#pragma once

#include "CoreMinimal.h"
#include "AkGameObject.h"
#include "AkRoomComponent.generated.h"

class AActor;
class UAkAcousticTextureSetComponent;
class UAkRoomComponent;
class UPrimitiveComponent;

UCLASS(Blueprintable, meta=(BlueprintSpawnableComponent))
class AKAUDIO_API UAkRoomComponent : public UAkGameObject
{
	GENERATED_BODY()

public:
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	bool bEnable;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	bool bDynamic;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float Priority;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float WallOcclusion;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float AuxSendLevel;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	bool AutoPost;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	bool bEnableReverbZone;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	AActor* ParentRoomActor;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	FString ParentRoomName;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float TransitionRegionWidth;

private:
	UPROPERTY(EditInstanceOnly, BlueprintReadWrite, Transient, Instanced, meta=(AllowPrivateAccess=true))
	UAkAcousticTextureSetComponent* GeometryComponent;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Export, meta=(AllowPrivateAccess=true))
	TWeakObjectPtr<UAkRoomComponent> ParentRoom;

public:
	UFUNCTION(BlueprintCallable)
	void UpdateTransitionRegionWidth(float InTransitionRegionWidth);

	UFUNCTION(BlueprintCallable)
	void UpdateParentRoomActor(AActor* InParentRoomActor);

	UFUNCTION(BlueprintCallable)
	void SetTransmissionLoss(float InTransmissionLoss);

	UFUNCTION(BlueprintCallable)
	void SetReverbZone(const UAkRoomComponent* InParentRoom, float InTransitionRegionWidth);

	UFUNCTION(BlueprintCallable)
	void SetGeometryComponent(UAkAcousticTextureSetComponent* textureSetComponent);

	UFUNCTION(BlueprintCallable)
	void SetEnableReverbZone(bool bInEnableReverbZone);

	UFUNCTION(BlueprintCallable)
	void SetEnable(bool bInEnable);

	UFUNCTION(BlueprintCallable)
	void SetDynamic(bool bInDynamic);

	UFUNCTION(BlueprintCallable)
	void SetAuxSendLevel(float InAuxSendLevel);

	UFUNCTION(BlueprintCallable)
	void RemoveReverbZone();

	UFUNCTION(BlueprintPure)
	UPrimitiveComponent* GetPrimitiveParent() const;

public:
	UAkRoomComponent();
};

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