#pragma once

#include "CoreMinimal.h"
#include "Collectable.h"
#include "DBDTunableRowHandle.h"
#include "Templates/SubclassOf.h"
#include "CartersSpark.generated.h"

class USurvivorCartersSparkComponent;
class UStatusEffect;
class UCartersSparkComponent;
class UInteractionAttacherComponent;
class ADBDPlayer;
class ASurvivor;

UCLASS(Blueprintable)
class ACartersSpark : public ACollectable
{
	GENERATED_BODY()

private:
	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	FDBDTunableRowHandle _shockAttackComboTimerDuration;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	TSubclassOf<USurvivorCartersSparkComponent> _survivorCartersSparkComponentClass;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	TSubclassOf<UStatusEffect> _doctorBlockInterruptEffect;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	TSubclassOf<UStatusEffect> _madnessStatusEffect;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, meta=(AllowPrivateAccess=true))
	TSubclassOf<UStatusEffect> _illusionaryDoctorEffect;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced, meta=(AllowPrivateAccess=true))
	UCartersSparkComponent* _cartersSparkComponent;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Instanced, meta=(AllowPrivateAccess=true))
	UInteractionAttacherComponent* _interactionAttacherComponent;

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

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

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

public:
	UFUNCTION(BlueprintCallable, BlueprintImplementableEvent, BlueprintCosmetic)
	void Cosmetic_OnShockTherapyZoneDetonated(ADBDPlayer* killer, const int32 survivorsHitCount);

	UFUNCTION(BlueprintPure)
	bool CancelSurvivorInteraction(ASurvivor* survivor) const;

	UFUNCTION(BlueprintCallable)
	void Authority_StartShockAttackComboTimer(ASurvivor* shockedSurvivor);

public:
	ACartersSpark();
};

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