#pragma once

#include "CoreMinimal.h"
#include "ESurvivorGrouping.h"
#include "ArrayOfSceneComponent.h"
#include "Dependency.h"
#include "ForceSpawnTileData.h"
#include "TileEventSpawnerData.h"
#include "GeneratedLevelData.generated.h"

class USceneComponent;
class AActor;

USTRUCT(BlueprintType)
struct FGeneratedLevelData
{
	GENERATED_BODY()

public:
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	FString UsedPaperTileMap;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	int32 StreamRelatedSeed;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	int32 AvailableSurvivorItemCount;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	ESurvivorGrouping GroupingType;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced)
	USceneComponent* KillerSpawnPoint;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced)
	TArray<USceneComponent*> AdditionalKillerSpawnPoints;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced)
	TArray<USceneComponent*> SurvivorSpawnPoints;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced)
	TArray<USceneComponent*> InteractableElementsSpawnPoints;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced)
	TArray<USceneComponent*> KillerItemsSpawnPoints;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	TMap<FName, int32> SpecialBehaviourRequestCounts;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	TMap<FName, FArrayOfSceneComponent> SpecialBehaviourSpawnPoints;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	TMap<FName, FArrayOfSceneComponent> SpecialBehaviourActorSpawners;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced)
	TArray<USceneComponent*> SearchableSpawners;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced)
	TArray<USceneComponent*> HexSpawners;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced)
	TArray<USceneComponent*> KillerLairSpawners;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced)
	TArray<USceneComponent*> HatchSpawners;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced)
	TArray<USceneComponent*> MainBuildingHatchSpawners;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced)
	TArray<USceneComponent*> ShackHatchSpawners;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced)
	TArray<USceneComponent*> BreakableWallSpawners;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced)
	TArray<USceneComponent*> EscapeSpawners;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced)
	TArray<USceneComponent*> BookshelfSpawners;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced)
	TArray<USceneComponent*> MeatHookSpawners;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	TArray<FDependency> LevelDependencies;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	TArray<FDependency> LateLevelDependencies;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced)
	TArray<USceneComponent*> FinisherMoriSpawnPoints;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced)
	TArray<USceneComponent*> SteamPipeSpawners;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced)
	TArray<USceneComponent*> SteamPipeButtonSpawners;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced)
	TArray<USceneComponent*> BasementSeanceSpawners;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced)
	TArray<USceneComponent*> VoidSpawners;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	FName SpecialEventId;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	bool UseForcedMap;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	FString GenerationLogs;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	FString GenerationErrors;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	int32 GenerationPlayerCount;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	TArray<FForceSpawnTileData> ForceSpawnTileData;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	TArray<AActor*> LevelLightings;

	UPROPERTY(BlueprintReadWrite, Transient)
	FTileEventSpawnerData UsedEventSpawnerSettings;

public:
	DEADBYDAYLIGHT_API FGeneratedLevelData();
};

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