// Copyright ExByte Studios. Item Interaction Ecosystem.

#pragma once

#include "CoreMinimal.h"
#include "InteractionAction.h"
#include "WorldInteractionActions.generated.h"

/**
 * World interaction actions (section 16). Each routes through the player's
 * UItemInteractionComponent::ServerExecuteMode so it shares the one validated
 * execution path (carry/equip/install/use live in UWorldInteractionComponent).
 */

UCLASS(meta = (DisplayName = "Action: Carry (Attached)"))
class ITEMWORLD_API UInteractionAction_CarryAttached : public UInteractionAction
{
	GENERATED_BODY()
public:
	UInteractionAction_CarryAttached();
	virtual void Execute_Implementation(const FInteractionContext& Context) override;
};

UCLASS(meta = (DisplayName = "Action: Carry (Physics)"))
class ITEMWORLD_API UInteractionAction_CarryPhysics : public UInteractionAction
{
	GENERATED_BODY()
public:
	UInteractionAction_CarryPhysics();
	virtual void Execute_Implementation(const FInteractionContext& Context) override;
};

UCLASS(meta = (DisplayName = "Action: Equip"))
class ITEMWORLD_API UInteractionAction_Equip : public UInteractionAction
{
	GENERATED_BODY()
public:
	UInteractionAction_Equip();
	virtual void Execute_Implementation(const FInteractionContext& Context) override;
};

UCLASS(meta = (DisplayName = "Action: Drop Held Item"))
class ITEMWORLD_API UInteractionAction_DropHeldItem : public UInteractionAction
{
	GENERATED_BODY()
public:
	UInteractionAction_DropHeldItem();
	virtual void Execute_Implementation(const FInteractionContext& Context) override;
};

UCLASS(meta = (DisplayName = "Action: Install Into World Slot"))
class ITEMWORLD_API UInteractionAction_InstallIntoWorldSlot : public UInteractionAction
{
	GENERATED_BODY()
public:
	UInteractionAction_InstallIntoWorldSlot();
	virtual void Execute_Implementation(const FInteractionContext& Context) override;
};

UCLASS(meta = (DisplayName = "Action: Remove From World Slot"))
class ITEMWORLD_API UInteractionAction_RemoveFromWorldSlot : public UInteractionAction
{
	GENERATED_BODY()
public:
	UInteractionAction_RemoveFromWorldSlot();
	virtual void Execute_Implementation(const FInteractionContext& Context) override;
};

UCLASS(meta = (DisplayName = "Action: Use Held On Target"))
class ITEMWORLD_API UInteractionAction_UseHeldOnTarget : public UInteractionAction
{
	GENERATED_BODY()
public:
	UInteractionAction_UseHeldOnTarget();
	virtual void Execute_Implementation(const FInteractionContext& Context) override;
};
