#pragma once

#include "CoreMinimal.h"
#include "DebugHUDInterface.h"
#include "BasicChargeableInteraction.h"
#include "GameplayTagContainer.h"
#include "UObject/NoExportTypes.h"
#include "Engine/HitResult.h"
#include "K41ThrowProjectileInteraction.generated.h"

class UCurveFloat;
class ADBDPlayer;

UCLASS(Blueprintable, Abstract, EditInlineNew, meta=(BlueprintSpawnableComponent))
class UK41ThrowProjectileInteraction : public UBasicChargeableInteraction, public IDebugHUDInterface
{
	GENERATED_BODY()

private:
	UPROPERTY(EditAnywhere)
	FGameplayTag _killerProjectileAimStartGameEventTag;

	UPROPERTY(EditAnywhere)
	FGameplayTag _killerProjectileAimEndGameEventTag;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	int32 _numberOfPointsNeeded;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	UCurveFloat* _navigationSpeedWindUp;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	UCurveFloat* _navigationSpeedThrowing;

private:
	UFUNCTION(BlueprintCallable, Server, Reliable)
	void Server_OnThrowSuccess(ADBDPlayer* player);

	UFUNCTION(BlueprintCallable, NetMulticast, Reliable)
	void Multicast_OnThrowSuccess(ADBDPlayer* player);

protected:
	UFUNCTION(BlueprintCallable, BlueprintImplementableEvent, BlueprintCosmetic)
	void Cosmetic_OnProjectileShot();

	UFUNCTION(BlueprintImplementableEvent, BlueprintCosmetic)
	void Cosmetic_MakeArcPreview(const TArray<FVector>& points, const FHitResult& hitResult);

public:
	UK41ThrowProjectileInteraction();
};

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