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

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Interactable.h"
#include "PickupItem.generated.h"

class UItemDataAsset;
class USphereComponent;
class UStaticMeshComponent;

/**
 * Un objet pose dans le monde. Il ne DECRIT pas l'objet, il ne fait que
 * pointer vers son UItemDataAsset et porter une quantite.
 *
 * Consequence pratique : pour creer un nouveau type de ramassable, tu n'as
 * plus besoin d'un Blueprint par objet. Un seul BP_Pickup suffit, tu changes
 * juste l'ItemData sur chaque instance posee dans le niveau.
 */
UCLASS()
class SURVIVAL_PROJET_API APickupItem : public AActor, public IInteractable
{
	GENERATED_BODY()

public:
	APickupItem();

	/**
	 * Configure un pickup engendre a l'execution (objet jete au sol).
	 * A appeler entre SpawnActorDeferred() et FinishSpawning() pour que
	 * OnConstruction ait deja les bonnes donnees et pose le bon mesh.
	 */
	UFUNCTION(BlueprintCallable, Category = "Item")
	void InitPickup(UItemDataAsset* InItemData, int32 InQuantity, int32 InRemainingUses = -1);

	// --- IInteractable ---
	virtual FText GetInteractionPrompt_Implementation() const override;
	virtual bool CanInteract_Implementation(AActor* Interactor) const override;
	virtual void Interact_Implementation(AActor* Interactor) override;
	virtual void OnBeginFocus_Implementation() override;
	virtual void OnEndFocus_Implementation() override;

protected:
	/**
	 * Sans garde WITH_EDITOR : on veut aussi que le mesh se pose correctement
	 * sur les pickups engendres a l'execution quand on jette un objet.
	 */
	virtual void OnConstruction(const FTransform& Transform) override;

	/** Visuel uniquement, sans collision. */
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Item")
	TObjectPtr<UStaticMeshComponent> Mesh;

	/**
	 * Volume que le trace d'interaction vient toucher.
	 * Volontairement separe du mesh : beaucoup de meshes d'asset packs,
	 * en particulier la vegetation, n'ont aucune geometrie de collision.
	 * Avec une sphere dediee, le pickup fonctionne quel que soit le visuel.
	 */
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Item")
	TObjectPtr<USphereComponent> InteractionSphere;

	/** Quel objet ce pickup represente. A assigner sur chaque instance. */
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Item")
	TObjectPtr<UItemDataAsset> ItemData;

	/** Combien d'exemplaires ce tas contient. */
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Item", meta = (ClampMin = "1"))
	int32 Quantity = 1;

	/**
	 * Charges restantes pour un objet a usages multiples.
	 * -1 = plein, ce qui est le cas de tout objet pose a la main dans le niveau.
	 */
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Item")
	int32 RemainingUses = -1;

	/**
	 * Reprend automatiquement le WorldMesh de l'ItemData dans l'editeur.
	 * Decoche pour imposer un mesh different sur une instance precise.
	 */
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Item")
	bool bUseMeshFromItemData = true;

	/** Active le Custom Depth quand l'objet est vise. */
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Item")
	bool bHighlightOnFocus = true;
};
