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

#pragma once

#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "HotbarWidget.generated.h"

class UHorizontalBox;
class UInventoryComponent;
class UInventorySlotWidget;

/**
 * Barre rapide en bas de l'ecran, affichee en permanence.
 *
 * Elle ne possede aucune donnee : elle montre les N premiers slots de
 * l'inventaire. Deplacer un objet de la grille vers la barre, c'est
 * simplement le deplacer vers un slot d'index bas -- le glisser-deposer
 * existant s'en occupe deja sans aucun code supplementaire.
 */
UCLASS(Abstract)
class SURVIVAL_PROJET_API UHotbarWidget : public UUserWidget
{
	GENERATED_BODY()

public:
	virtual void NativeConstruct() override;
	virtual void NativeDestruct() override;

	/** Remet a jour contenu et selection. */
	UFUNCTION(BlueprintCallable, Category = "Inventaire")
	void Refresh();

	/** (Re)branche sur l'inventaire du pawn possede. Voir UInventoryWidget. */
	void BindToOwningPawn();

protected:
	/** A nommer exactement "SlotContainer" dans le Widget Blueprint. */
	UPROPERTY(meta = (BindWidget))
	TObjectPtr<UHorizontalBox> SlotContainer;

	/** Le meme WBP_InventorySlot que la grille : une seule apparence a maintenir. */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Inventaire")
	TSubclassOf<UInventorySlotWidget> SlotWidgetClass;

	/** Espacement entre les cases. */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Inventaire", meta = (ClampMin = "0"))
	float SlotPadding = 4.f;

private:
	UFUNCTION()
	void HandleInventoryChanged();

	UFUNCTION()
	void HandleSelectionChanged(int32 NewIndex);

	void RebuildSlots(int32 DesiredCount);

	UInventoryComponent* ResolveInventory() const;

	TWeakObjectPtr<UInventoryComponent> BoundInventory;

	/** UPROPERTY obligatoire : sans ca le GC collecterait les cases. */
	UPROPERTY(Transient)
	TArray<TObjectPtr<UInventorySlotWidget>> SlotWidgets;
};
