#pragma once
#include "PlayerStateBase.Generated.h"

/*
	Base player state, keeping the team the player is in
	this class also keeps the ready state of players in the lobby and contains some functionality for joining/switching teams
*/
UCLASS()
class APlayerStateBase : public APlayerState
{
	GENERATED_BODY()
	friend class AGameStateBase;
	friend class AMenuGameMode;
public:
	APlayerStateBase();
	virtual void BeginPlay() override;

	UFUNCTION(Server, Reliable, WithValidation, Category = "Lobby")
	void SetReadyState(bool state);
	UFUNCTION(BlueprintCallable, Category = "Lobby")
	bool GetReadyState() const;

	// Used for seamless travel, this copies the previous player state into the current one
	void Transfer(APlayerStateBase* oldState);

	// Requests entry to a team
	UFUNCTION(Server, Reliable, WithValidation, Category = "Lobby")
	void RequestTeamEntry(uint8 team);
	// Automatically join the prefered team by the server
	UFUNCTION(Server, Reliable, WithValidation, BlueprintCallable, Category = "Lobby")
	void AutoAssignTeam();

	UFUNCTION(BlueprintCallable, Category = "Lobby")
	int32 GetTeam() const;

	// Updates the nickname and the avatar of the player using the online subsystem
	UFUNCTION(BlueprintCallable, Category = "Character")
	void UpdatePersona();

	UPROPERTY(BlueprintReadOnly, Category = "Character")
	UTexture2D* avatar;

	UPROPERTY(BlueprintReadOnly, Category = "Character")
	FString nickname;

private:
	UPROPERTY(Replicated)
	bool m_readyToStart;

	UPROPERTY(Replicated)
	int32 m_team;
};