// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Engine/DataAsset.h"
#include "ItemDataAsset.generated.h"

class UStaticMesh;
class UTexture2D;

/**
 * Definition d'un TYPE d'objet : "Bois", "Pomme", "Corde".
 * Un asset par type, cree dans le Content Browser, edite a la main.
 *
 * C'est l'equivalent exact d'un ScriptableObject Unity : une donnee partagee
 * que tout le monde reference et que personne ne duplique. Cent buches dans
 * le monde pointent toutes vers le meme UItemDataAsset "Bois".
 *
 * Regle a ne jamais enfreindre : ceci decrit ce qu'est un objet, jamais son
 * etat. La quantite, la durabilite, l'usure appartiennent a l'inventaire ou
 * a l'acteur, pas ici -- sinon ramasser une pomme modifierait toutes les
 * pommes du jeu.
 */
UCLASS(BlueprintType)
class SURVIVAL_PROJET_API UItemDataAsset : public UPrimaryDataAsset
{
	GENERATED_BODY()

public:
	/** Identifiant stable, utilise par la sauvegarde et les recettes de craft. */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item")
	FName ItemId;

	/** Nom affiche au joueur. */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item")
	FText DisplayName;

	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item", meta = (MultiLine = "true"))
	FText Description;

	/** Icone affichee dans la grille d'inventaire. */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item")
	TObjectPtr<UTexture2D> Icon;

	/** Mesh utilise quand l'objet est pose au sol. */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item")
	TObjectPtr<UStaticMesh> WorldMesh;

	/**
	 * Nombre maximum d'exemplaires par slot.
	 * 1 = ne s'empile pas (outils, armes), 20 = ressource classique.
	 */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item", meta = (ClampMin = "1"))
	int32 MaxStackSize = 1;

	/**
	 * Nombre d'utilisations avant que l'objet soit consomme.
	 * 1 = objet a usage unique. 3 = une canette qu'on boit en trois gorgees.
	 *
	 * Les valeurs de restauration sont appliquees A CHAQUE utilisation, pas
	 * reparties : une canette a 3 usages et 20 de soif rend 20 par gorgee.
	 */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item", meta = (ClampMin = "1"))
	int32 MaxUses = 1;

	/**
	 * Taille de pile reellement applicable.
	 *
	 * Un objet a charges ne s'empile jamais : deux canettes entamees a des
	 * niveaux differents ne peuvent pas partager un slot, il faudrait stocker
	 * deux compteurs dans une seule case. La regle est centralisee ici pour
	 * qu'aucun appelant ne puisse l'oublier.
	 */
	UFUNCTION(BlueprintPure, Category = "Item")
	int32 GetEffectiveMaxStack() const { return MaxUses > 1 ? 1 : FMath::Max(1, MaxStackSize); }

	/**
	 * Slots ajoutes a l'inventaire quand cet objet est equipe comme sac.
	 * Laisse a 0 pour tout ce qui n'est pas un contenant.
	 */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Sac", meta = (ClampMin = "0"))
	int32 BonusInventorySlots = 0;

	// ------------------------------------------------------------------
	// Consommable
	// ------------------------------------------------------------------

	/** Coche pour qu'un clic gauche consomme l'objet et applique ses effets. */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Consommable")
	bool bIsConsumable = false;

	/** Faim rendue a la consommation. */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Consommable", meta = (EditCondition = "bIsConsumable"))
	float HungerRestore = 0.f;

	/** Soif rendue. Une valeur negative deshydrate -- utile pour l'eau salee. */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Consommable", meta = (EditCondition = "bIsConsumable"))
	float ThirstRestore = 0.f;

	/** Vie rendue. Negative pour un aliment avarie ou toxique. */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Consommable", meta = (EditCondition = "bIsConsumable"))
	float HealthRestore = 0.f;
};
