#pragma once

#include "CoreMinimal.h"
#include "ChargeableInteractionDefinition.h"
#include "EScamperPhase.h"
#include "K34ScamperMovementSpeedSetting.h"
#include "DBDTunableRowHandle.h"
#include "K34ScamperChargeableInteraction.generated.h"

UCLASS(Blueprintable, EditInlineNew, meta=(BlueprintSpawnableComponent))
class UK34ScamperChargeableInteraction : public UChargeableInteractionDefinition
{
	GENERATED_BODY()

private:
	UPROPERTY(EditAnywhere, BlueprintReadWrite, ReplicatedUsing=OnRep_CurrentPhase, Transient, meta=(AllowPrivateAccess=true))
	EScamperPhase _currentPhase;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	TMap<EScamperPhase, FK34ScamperMovementSpeedSetting> _scamperMovementSpeedSettings;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	float _chainVaultDetectionRange;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	FDBDTunableRowHandle _chainingHeldInputBuffer;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	float _chainVaultSweepRadius;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	float _cameraTransitionToThirdPersonViewDuration;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	float _availabilityGracePeriodAfterScamper;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	float _cancelCooldownTime;

private:
	UFUNCTION(BlueprintCallable)
	void OnRep_CurrentPhase();

	UFUNCTION(BlueprintCallable)
	void OnDashingTimeoutTimerDone();

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

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

public:
	virtual void GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const override;

public:
	UK34ScamperChargeableInteraction();
};

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