// Project Lab - NHTV Igad

#pragma once

#include "Animation/AnimInstance.h"
#include "MinionAnimInstance.generated.h"

// Enum that shows in what state the Animation Instance is in.
UENUM(BlueprintType)
enum class EMinionAnimState : uint8
{
	MAS_Idle		UMETA(DisplayName = "Idle"),
	MAS_Pointing	UMETA(DisplayName = "Pointing"),
	MAS_Attacking	UMETA(DisplayName = "Attacking"),
	MAS_Casting		UMETA(DisplayName = "Casting"),
	MAS_Guarding	UMETA(DisplayName = "Guarding"),
	MAS_Staggered	UMETA(DisplayName = "Staggered"),
	MAS_Stunned		UMETA(DisplayName = "Stunned"),
	MAS_Killed		UMETA(DisplayName = "Killed"),
	MAS_Specific	UMETA(DisplayName = "Specific")
};

// Delegate declaration for when the Animation Instance changes its state from within.
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnAnimationStateChanged, EMinionAnimState, newState);

/**
 * Animation instance that handles all state changing, variable gathering and notifying the AI class.
 */
UCLASS()
class UNREALPROJECT_API UMinionAnimInstance : public UAnimInstance
{
	GENERATED_BODY()
public:
	UMinionAnimInstance(const FObjectInitializer& init);

	virtual void NativeInitializeAnimation() override;
	virtual void NativeUpdateAnimation(float deltaSeconds) override;

	// Function to get the animation state of the animation instance.
	EMinionAnimState GetAnimationState();
	// Helper function for checking if the minion is in a certain state.
	bool IsInAnimationState(const EMinionAnimState minionStateCheck);
	// Function that changes the state of the minion. Does not trigger OnAnimationStateChanged.
	UFUNCTION(BlueprintCallable, Category = "Animation State")
	void ChangeAnimationStateTo(EMinionAnimState newState);
	// Function that changes the state of the minion. Triggers OnAnimationStateChanged.
	// Made specifically for use in the Animation Blueprint.
	UFUNCTION(BlueprintCallable, Category = "Animation State")
	void BPChangeAnimationStateTo(EMinionAnimState newState);
	// Delegate for when the state of the minion changes.
	UPROPERTY(BlueprintAssignable, Category = "Animation State")
	FOnAnimationStateChanged OnAnimationStateChanged;

	UFUNCTION()
	void PlaySpecificAnimationByInt(int32 animationToPlay);

protected: // Member variables are protected.
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Animation State")
	EMinionAnimState m_animationState;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Animation State")
	float m_movementSpeed;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Animation State")
	FVector m_movementDirectionRelative;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Animation State")
	int32 m_specificAnimationIndex;
};
