// Copyright ExByte Studios. Item Interaction Ecosystem.

#pragma once

#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "ItemInstanceData.h"
#include "ItemFeatureLibrary.generated.h"

class UInventoryComponent;

/**
 * Feature processing (section 21). Everything is LAZY: nothing ticks per item.
 * Call these on events - container open, save load, interaction, world-time pulse.
 * State (freshness, last-update time, charge, fuel) lives in the item's runtime
 * properties so it travels with the instance.
 */
UCLASS()
class ITEMINVENTORY_API UItemFeatureLibrary : public UBlueprintFunctionLibrary
{
	GENERATED_BODY()

public:
	/**
	 * Recomputes time-based features (rotting) for one item up to "now".
	 * Returns true if the item changed. If the item should transform (e.g. raw_meat
	 * -> rotten_meat) OutTransformItemId is set to the replacement id.
	 */
	UFUNCTION(BlueprintCallable, Category = "Item|Features", meta = (WorldContext = "WorldContext"))
	static bool UpdateLazyFeatures(const UObject* WorldContext, UPARAM(ref) FItemInstanceData& Item, FName& OutTransformItemId);

	/** Server: run lazy updates across a whole inventory, applying any transforms. */
	UFUNCTION(BlueprintCallable, Category = "Item|Features", meta = (WorldContext = "WorldContext"))
	static void UpdateInventoryFeatures(const UObject* WorldContext, UInventoryComponent* Inventory);

	// --- Direct feature operations (debug tools, gameplay) ---

	UFUNCTION(BlueprintCallable, Category = "Item|Features", meta = (WorldContext = "WorldContext"))
	static void ForceRot(const UObject* WorldContext, UPARAM(ref) FItemInstanceData& Item, FName& OutTransformItemId);

	UFUNCTION(BlueprintCallable, Category = "Item|Features")
	static void BreakItem(UPARAM(ref) FItemInstanceData& Item);

	UFUNCTION(BlueprintCallable, Category = "Item|Features")
	static void DrainBattery(UPARAM(ref) FItemInstanceData& Item, float DrainPerSecond, float Seconds);

	UFUNCTION(BlueprintCallable, Category = "Item|Features")
	static float AddFuel(UPARAM(ref) FItemInstanceData& Item, float Amount, float MaxFuel);

	/** Moves up to Amount of fuel from one item to another, respecting ToMaxFuel. Returns moved. */
	UFUNCTION(BlueprintCallable, Category = "Item|Features")
	static float TransferFuel(UPARAM(ref) FItemInstanceData& From, UPARAM(ref) FItemInstanceData& To, float Amount, float ToMaxFuel);

	UFUNCTION(BlueprintCallable, Category = "Item|Features")
	static void SetWetness(UPARAM(ref) FItemInstanceData& Item, float Wetness);
};
