#pragma once

#include "CoreMinimal.h"
#include "Presenter.h"
#include "Templates/SubclassOf.h"
#include "LobbyPreviewData.h"
#include "ELoadoutSlot.h"
#include "LobbyPresenter.generated.h"

class UUserWidget;
class ULobbySubPresenter;
class ULobbyCharactersSubPresenter;
class ULobbyLoadoutSubPresenter;
class ULobbyPlayerListSubPresenter;
class UChatSubPresenter;
class ULobbyPerkPreviewerSubPresenter;

UCLASS(Blueprintable, EditInlineNew)
class DBDUIPRESENTERS_API ULobbyPresenter : public UPresenter
{
	GENERATED_BODY()

public:
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	TSubclassOf<UUserWidget> LobbyWidgetClass;

private:
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient, meta=(AllowPrivateAccess=true))
	FLobbyPreviewData _previewData;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient, meta=(AllowPrivateAccess=true))
	ULobbySubPresenter* _activeSubPresenter;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient, meta=(AllowPrivateAccess=true))
	ULobbyCharactersSubPresenter* _charactersSubPresenter;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient, meta=(AllowPrivateAccess=true))
	ULobbyLoadoutSubPresenter* _loadoutSubPresenter;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient, meta=(AllowPrivateAccess=true))
	ULobbyPlayerListSubPresenter* _playerListSubPresenter;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient, meta=(AllowPrivateAccess=true))
	UChatSubPresenter* _chatSubPresenter;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient, meta=(AllowPrivateAccess=true))
	ULobbyPerkPreviewerSubPresenter* _perkPreviewerSubPresenter;

private:
	UFUNCTION(BlueprintCallable)
	void OnStoreButtonClicked();

	UFUNCTION(BlueprintCallable)
	void OnShrineButtonClicked();

	UFUNCTION(BlueprintCallable)
	void OnSettingsClicked();

	UFUNCTION(BlueprintCallable)
	void OnRoleButtonClicked();

	UFUNCTION(BlueprintCallable)
	void OnPerkPreviewClicked(const ELoadoutSlot slotIndex);

	UFUNCTION(BlueprintCallable)
	void OnMatchManagementClicked();

	UFUNCTION(BlueprintCallable)
	void OnLobbySubPageChanged();

	UFUNCTION(BlueprintCallable)
	void OnLobbyFinalCountdownTimeChanged();

	UFUNCTION(BlueprintCallable)
	void OnLoadoutButtonClicked();

	UFUNCTION(BlueprintCallable)
	void OnFriendsClicked();

	UFUNCTION(BlueprintCallable)
	void OnFooterStateChanged();

	UFUNCTION(BlueprintCallable)
	void OnFinalCountdownBeforeTrialStarted();

	UFUNCTION(BlueprintCallable)
	void OnEventButtonClicked();

	UFUNCTION(BlueprintCallable)
	void OnDisplayStandRotated(float distance);

	UFUNCTION(BlueprintCallable)
	void OnDailyRitualsClicked();

	UFUNCTION(BlueprintCallable)
	void OnCharacterButtonClicked();

	UFUNCTION(BlueprintCallable)
	void OnChallengesButtonClicked();

	UFUNCTION(BlueprintCallable)
	void OnBloodWebButtonClicked();

	UFUNCTION(BlueprintCallable)
	void OnBeginnerModeUpdated(bool beginnerModeActive);

	UFUNCTION(BlueprintCallable)
	void OnBack();

public:
	ULobbyPresenter();
};

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