// 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;

/**
 * Le curseur entre ou sort d'une case de la barre rapide.
 *
 * La barre n'affiche rien elle-meme : le panneau de detail vit dans l'ecran
 * d'inventaire, qu'elle ne connait pas. C'est le PlayerController qui tient les
 * deux widgets et qui fait le pont -- il est deja le proprietaire du HUD.
 */
DECLARE_DYNAMIC_MULTICAST_DELEGATE_ThreeParams(FOnHotbarSlotHovered, UInventoryComponent*, Inventory, int32, SlotIndex, bool, bHovered);

/**
 * 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 EMBERWILD_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();

	/**
	 * Destination du clic droit pour les cases de la barre.
	 *
	 * La barre reste affichee et cliquable par-dessus l'ecran de coffre : sans
	 * ca, le clic droit marcherait dans la grille et pas dans la barre, ce qui
	 * passerait pour un bug. Le controller lui pousse le coffre a l'ouverture
	 * et nullptr a la fermeture.
	 */
	void SetQuickTransferTarget(UInventoryComponent* InTarget);

	UPROPERTY(BlueprintAssignable, Category = "Inventory")
	FOnHotbarSlotHovered OnSlotHovered;

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);

	/** Abonne aux cases : relaie le survol vers l'exterieur. */
	UFUNCTION()
	void HandleSlotHovered(int32 SlotIndex, bool bHovered);

	void RebuildSlots(int32 DesiredCount);

	UInventoryComponent* ResolveInventory() const;

	TWeakObjectPtr<UInventoryComponent> BoundInventory;

	/** Destination du clic droit, recopiee sur chaque case creee. */
	TWeakObjectPtr<UInventoryComponent> QuickTransferTarget;

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