#pragma once

#include "CoreMinimal.h"
#include "PoolableActor.h"
#include "GameFramework/Actor.h"
#include "ImpactInfo.h"
#include "UObject/NoExportTypes.h"
#include "K40EnvironmentAttachedProjectile.generated.h"

class UFloatValueStrategy;

UCLASS(Blueprintable, Abstract)
class AK40EnvironmentAttachedProjectile : public AActor, public IPoolableActor
{
	GENERATED_BODY()

protected:
	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float _cleanupTime;

	UPROPERTY(EditAnywhere, BlueprintReadWrite)
	float _warningTime;

private:
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced, meta=(AllowPrivateAccess=true))
	UFloatValueStrategy* _initialAOESize;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced, meta=(AllowPrivateAccess=true))
	UFloatValueStrategy* _AOESize;

public:
	UFUNCTION(BlueprintPure)
	bool IsActive() const;

protected:
	UFUNCTION(BlueprintPure)
	float GetInitialAoERadius() const;

	UFUNCTION(BlueprintPure)
	float GetFinalAoERadius() const;

	UFUNCTION(BlueprintPure)
	float GetAOEShrinkingDuration() const;

	UFUNCTION(BlueprintPure)
	float GetAOEExpansionDuration() const;

	UFUNCTION(BlueprintCallable, BlueprintImplementableEvent, BlueprintCosmetic)
	void Cosmetic_OnSpawned(FImpactInfo impactInfo, FVector launchDirection);

	UFUNCTION(BlueprintCallable, BlueprintImplementableEvent, BlueprintCosmetic)
	void Cosmetic_OnProjectileRetrieved();

	UFUNCTION(BlueprintCallable, BlueprintImplementableEvent, BlueprintCosmetic)
	void Cosmetic_OnAOESizeChanged(const float currentAOESize);

	UFUNCTION(BlueprintCallable, BlueprintImplementableEvent, BlueprintCosmetic)
	void Cosmetic_OnAoERemoved();

	UFUNCTION(BlueprintCallable, BlueprintImplementableEvent, BlueprintCosmetic)
	void Cosmetic_OnAoERemovalWarningStart(float warningDuration);

public:
	AK40EnvironmentAttachedProjectile();
};

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