// Copyright ExByte Studios. Item Interaction Ecosystem.

#pragma once

#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "ItemSaveGame.h"
#include "ItemSaveLibrary.generated.h"

class UInventoryComponent;

/**
 * Save / load of inventories with redirect + version migration (section 26).
 * Stores only ItemId/InstanceId/Quantity/RuntimeProperties/StateTags/container/slot
 * - never icons, meshes, names or actor pointers (section 26 "do not save").
 */
UCLASS()
class ITEMINVENTORY_API UItemSaveLibrary : public UBlueprintFunctionLibrary
{
	GENERATED_BODY()

public:
	/** Snapshots an inventory's items + containers (drops transient locks). */
	UFUNCTION(BlueprintCallable, Category = "Item|Save")
	static FInventorySaveData CaptureInventory(UInventoryComponent* Inventory);

	/** Server: rebuilds an inventory from a snapshot, migrating each item. */
	UFUNCTION(BlueprintCallable, Category = "Item|Save", meta = (WorldContext = "WorldContext"))
	static void RestoreInventory(const UObject* WorldContext, UInventoryComponent* Inventory, const FInventorySaveData& Data);

	/** Writes one inventory under Key into a save slot (loads/creates the slot file). */
	UFUNCTION(BlueprintCallable, Category = "Item|Save")
	static bool SaveInventoryToSlot(UInventoryComponent* Inventory, const FString& SlotName, FName Key);

	/** Server: loads one inventory under Key from a save slot. */
	UFUNCTION(BlueprintCallable, Category = "Item|Save", meta = (WorldContext = "WorldContext"))
	static bool LoadInventoryFromSlot(const UObject* WorldContext, UInventoryComponent* Inventory, const FString& SlotName, FName Key);
};
