#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Templates/SubclassOf.h"
#include "K40SecurityCorridor.generated.h"

class AK40SecurityCorridorSurvivorCameraDolly;
class AK40SecurityCorridorKillerCameraDolly;
class UAmbianceManagerDataAsset;
class UK40SecuritySystemAbility;
class AKiller;
class ASurvivor;

UCLASS(Blueprintable)
class AK40SecurityCorridor : public AActor
{
	GENERATED_BODY()

protected:
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	bool _isCorridorSequencePlaying;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	bool _isJumpscarePlaying;

private:
	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	bool _worldElementsVisibility;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	bool _internalElementsVisibility;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	TSubclassOf<AK40SecurityCorridorSurvivorCameraDolly> _survivorCameraDollyClassToSpawn;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	TSubclassOf<AK40SecurityCorridorKillerCameraDolly> _killerCameraDollyClassToSpawn;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	AK40SecurityCorridorSurvivorCameraDolly* _survivorCameraDolly;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	AK40SecurityCorridorKillerCameraDolly* _killerCameraDolly;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	UAmbianceManagerDataAsset* _officeAmbiance;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced, meta=(AllowPrivateAccess=true))
	UK40SecuritySystemAbility* _owningAbility;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	FName _lightingThemeName;

public:
	UFUNCTION(BlueprintCallable, BlueprintNativeEvent)
	void TriggerJumpScareAsKiller();

	UFUNCTION(BlueprintCallable, BlueprintNativeEvent)
	void TriggerJumpScare();

	UFUNCTION(BlueprintCallable, BlueprintNativeEvent)
	void StopKillerCorridorSequence();

	UFUNCTION(BlueprintCallable, BlueprintNativeEvent)
	void StopJumpScareAsKiller();

	UFUNCTION(BlueprintCallable, BlueprintNativeEvent)
	void StopCorridorSequence();

	UFUNCTION(BlueprintCallable, BlueprintNativeEvent)
	void StartKillerCorridorSequence(AKiller* killer);

	UFUNCTION(BlueprintCallable, BlueprintNativeEvent)
	void StartCorridorSequence(ASurvivor* survivor);

	UFUNCTION(BlueprintPure)
	bool IsJumpscarePlaying() const;

	UFUNCTION(BlueprintPure)
	bool IsCorridorSequencePlaying() const;

	UFUNCTION(BlueprintPure)
	AK40SecurityCorridorSurvivorCameraDolly* GetSurvivorCameraDolly() const;

public:
	AK40SecurityCorridor();
};

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