// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/PlayerController.h"
#include "AgrarianGamePlayerController.generated.h"

class UInputMappingContext;
class UUserWidget;
class AAgrarianShelterActor;

/**
 *  Basic PlayerController class for a third person game
 *  Manages input mappings
 */
UCLASS(abstract)
class AAgrarianGamePlayerController : public APlayerController
{
	GENERATED_BODY()
	
protected:

	/** Input Mapping Contexts */
	UPROPERTY(EditAnywhere, Category ="Input|Input Mappings")
	TArray<UInputMappingContext*> DefaultMappingContexts;

	/** Input Mapping Contexts */
	UPROPERTY(EditAnywhere, Category="Input|Input Mappings")
	TArray<UInputMappingContext*> MobileExcludedMappingContexts;

	/** Mobile controls widget to spawn */
	UPROPERTY(EditAnywhere, Category="Input|Touch Controls")
	TSubclassOf<UUserWidget> MobileControlsWidgetClass;

	/** Pointer to the mobile controls widget */
	UPROPERTY()
	TObjectPtr<UUserWidget> MobileControlsWidget;

	/** If true, the player will use UMG touch controls even if not playing on mobile platforms */
	UPROPERTY(EditAnywhere, Config, Category = "Input|Touch Controls")
	bool bForceTouchControls = false;

	/** Gameplay initialization */
	virtual void BeginPlay() override;

	/** Input mapping context setup */
	virtual void SetupInputComponent() override;

	/** Returns true if the player should use UMG touch controls */
	bool ShouldUseTouchControls() const;

public:
	UFUNCTION(Exec)
	void AgrarianGrantItem(FName ItemId, int32 Quantity);

	UFUNCTION(Exec)
	void AgrarianSaveWorld();

	UFUNCTION(Exec)
	void AgrarianLoadWorld();

	UFUNCTION(Exec)
	void AgrarianSurvival();

	UFUNCTION(Exec)
	void AgrarianHeal();

	UFUNCTION(Exec)
	void AgrarianRespawn();

	UFUNCTION(Exec)
	void AgrarianDropItem(FName ItemId, int32 Quantity);

	UFUNCTION(Exec)
	void AgrarianSplitStack(int32 StackIndex, int32 SplitQuantity);

	UFUNCTION(Exec)
	void AgrarianUseItem(FName ItemId, int32 Quantity);

	UFUNCTION(Exec)
	void AgrarianCraft(FName RecipeId);

	UFUNCTION(Exec)
	void AgrarianCraftStatus();

	UFUNCTION(Exec)
	void AgrarianTravel(float X, float Y, float Z);

	UFUNCTION(Exec)
	void AgrarianTravelHome();

	UFUNCTION(Exec)
	void AgrarianServerTravel(FName MapName);

protected:
	UFUNCTION(Server, Reliable)
	void ServerAgrarianGrantItem(FName ItemId, int32 Quantity);

	UFUNCTION(Server, Reliable)
	void ServerAgrarianSaveWorld();

	UFUNCTION(Server, Reliable)
	void ServerAgrarianLoadWorld();

	UFUNCTION(Server, Reliable)
	void ServerAgrarianHeal();

	UFUNCTION(Server, Reliable)
	void ServerAgrarianRespawn();

	UFUNCTION(Server, Reliable)
	void ServerAgrarianDropItem(FName ItemId, int32 Quantity);

	UFUNCTION(Server, Reliable)
	void ServerAgrarianSplitStack(int32 StackIndex, int32 SplitQuantity);

	UFUNCTION(Server, Reliable)
	void ServerAgrarianUseItem(FName ItemId, int32 Quantity);

	UFUNCTION(Server, Reliable)
	void ServerAgrarianCraft(FName RecipeId);

	UFUNCTION(Server, Reliable)
	void ServerAgrarianTravel(FVector Destination);

	UFUNCTION(Server, Reliable)
	void ServerAgrarianServerTravel(FName MapName);
};
