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

#pragma once

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

class UInteractionComponent;
class UTextBlock;

/**
 * Affiche "Appuyez sur E pour Ramasser Objet" quand le joueur vise quelque
 * chose d'interactif, et se cache sinon.
 *
 * La classe est Abstract : on ne l'instancie jamais directement, on cree un
 * Widget Blueprint (WBP_InteractionPrompt) qui en herite. Le C++ porte la
 * logique, le Blueprint porte la mise en page. C'est la separation standard
 * en UMG, l'equivalent d'un prefab d'UI avec son script en Unity.
 *
 * Le widget ne fait AUCUN travail par frame : il s'abonne au delegue
 * OnPromptChanged du composant d'interaction et ne se met a jour que lorsque
 * le texte change reellement.
 *
 * OnPromptChanged et pas OnFocusChanged : le texte peut bouger sans que la
 * cible change -- un feu de camp qui egrene son compte a rebours, ou le regard
 * qui glisse d'un emplacement du grill a l'autre sur le meme acteur.
 */
UCLASS(Abstract)
class EMBERWILD_API UInteractionPromptWidget : public UUserWidget
{
	GENERATED_BODY()

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

	/** (Re)branche sur le composant d'interaction du pawn possede. */
	void BindToOwningPawn();

protected:
	/**
	 * meta = (BindWidget) : Unreal relie automatiquement ce pointeur au widget
	 * nomme exactement "PromptText" dans le Widget Blueprint enfant. Si tu
	 * oublies de le creer ou que tu le renommes, le Blueprint refuse de
	 * compiler avec un message clair -- pas de crash silencieux au runtime.
	 */
	UPROPERTY(meta = (BindWidget))
	TObjectPtr<UTextBlock> PromptText;

	/**
	 * Texte affiche. {0} sera remplace par la touche, {1} par l'action.
	 * Editable dans le Widget Blueprint pour ajuster la formulation.
	 */
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Interaction")
	FText PromptFormat;

	UInteractionPromptWidget(const FObjectInitializer& ObjectInitializer);

private:
	/** Appele par le composant d'interaction a chaque changement du texte affiche. */
	UFUNCTION()
	void HandlePromptChanged(const FText& NewPrompt);

	/** Recalcule le texte et la visibilite. */
	void Refresh();

	/** Nom lisible de la touche actuellement mappee sur l'action Interagir. */
	FText GetInteractKeyDisplayName() const;

	/** Le composant auquel on est abonne, pour pouvoir se desabonner proprement. */
	TWeakObjectPtr<UInteractionComponent> BoundComponent;
};
