#pragma once

#include "CoreMinimal.h"
#include "LobbyLevel.h"
#include "UObject/NoExportTypes.h"
#include "UObject/SoftObjectPtr.h"
#include "EOfflineLobbyState.h"
#include "OfflineLobbyLevel.generated.h"

class APlayerStart;
class ADisplayStand;
class ADBDMenuSilhouette;
class AMenuMeatHook;
class ATargetPoint;
class ACharm;
class AActor;
class ADBDMenuPlayer;

UCLASS(Blueprintable)
class DEADBYDAYLIGHT_API AOfflineLobbyLevel : public ALobbyLevel
{
	GENERATED_BODY()

public:
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	FVector _partyLobbyInviteButtonOffset;

private:
	UPROPERTY(EditAnywhere)
	TArray<TWeakObjectPtr<APlayerStart>> _roleSelectionCamperSpawns;

	UPROPERTY(EditAnywhere)
	TArray<TWeakObjectPtr<APlayerStart>> _roleSelectionSlasherSpawns;

	UPROPERTY(EditAnywhere)
	TWeakObjectPtr<ADisplayStand> _offlineLobbyLocalSlasherSpawn;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	FVector _partyLobbyEmptySlotFxOffset;

	UPROPERTY(EditAnywhere)
	TWeakObjectPtr<ADisplayStand> _offlineLobbyLocalCamperSpawn;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	TArray<FVector> _partyLobbySlasherPOVTrackerOffsets;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	TSoftClassPtr<ADBDMenuSilhouette> _partyLobbyEmptySlotSilhouette;

	UPROPERTY(EditAnywhere)
	TArray<TWeakObjectPtr<ADisplayStand>> _partyLobbySlasherDisplayStands;

	UPROPERTY(EditAnywhere)
	TArray<TWeakObjectPtr<ADisplayStand>> _partyLobbyCamperDisplayStands;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	TSoftClassPtr<AMenuMeatHook> _meatHookForCustomization;

	UPROPERTY(EditAnywhere)
	TWeakObjectPtr<ATargetPoint> _meatHookSpawn;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	TSoftClassPtr<ACharm> _charmForCustomizationZoom;

	UPROPERTY(EditAnywhere)
	TWeakObjectPtr<ATargetPoint> _camperCharmSpawn;

	UPROPERTY(EditAnywhere)
	TWeakObjectPtr<ATargetPoint> _slasherCharmSpawn;

	UPROPERTY(Transient)
	TMap<TWeakObjectPtr<ADisplayStand>, TWeakObjectPtr<ADBDMenuSilhouette>> _partyLobbyEmptySlotPawns;

	UPROPERTY(BlueprintReadWrite, Transient, meta=(AllowPrivateAccess=true))
	TArray<AActor*> _destroyingPawns;

public:
	UFUNCTION(BlueprintCallable, BlueprintImplementableEvent)
	void OnStateChanged(EOfflineLobbyState lobbyState);

	UFUNCTION(BlueprintCallable, BlueprintImplementableEvent)
	void OnCharacterSpawned(ADBDMenuPlayer* player);

protected:
	UFUNCTION(BlueprintCallable)
	void CheckDestroyingPawns(AActor* DestroyedActor);

public:
	AOfflineLobbyLevel();
};

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