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

#pragma once

#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "InputCoreTypes.h"
#include "SettingKeyRowWidget.generated.h"

class UButton;
class UTextBlock;

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnSettingKeyRebindRequested, FName, MappingName);

/**
 * Une ligne de remappage : un libelle, et un bouton portant la touche actuelle.
 *
 * Widget distinct de USettingRowWidget et non un mode de plus : une touche n'est
 * pas un index dans une liste de paliers, il n'y a ni fleches ni curseur, et
 * l'interaction est d'une autre nature -- on ouvre un voile de capture.
 *
 * Elle ne sait pas remapper. Elle previent via OnRebindRequested et c'est
 * l'onglet qui pilote, comme partout ailleurs dans les reglages.
 *
 * Classe Abstract : on cree un WBP_SettingKeyRow qui en herite.
 */
UCLASS(Abstract)
class EMBERWILD_API USettingKeyRowWidget : public UUserWidget
{
	GENERATED_BODY()

public:
	virtual void NativeOnInitialized() override;

	UPROPERTY(BlueprintAssignable, Category = "Reglages")
	FOnSettingKeyRebindRequested OnRebindRequested;

	/** Pose le libelle et la touche. Le nom de mapping est renvoye tel quel au clic. */
	UFUNCTION(BlueprintCallable, Category = "Reglages")
	void Setup(FName InMappingName, const FText& Label, const FKey& Key);

	/** Met a jour la seule touche affichee. */
	UFUNCTION(BlueprintCallable, Category = "Reglages")
	void SetKey(const FKey& Key);

	UFUNCTION(BlueprintPure, Category = "Reglages")
	FName GetMappingName() const { return MappingName; }

protected:
	UPROPERTY(meta = (BindWidget))
	TObjectPtr<UTextBlock> LabelText;

	UPROPERTY(meta = (BindWidget))
	TObjectPtr<UButton> KeyButton;

	UPROPERTY(meta = (BindWidget))
	TObjectPtr<UTextBlock> KeyText;

	/** Couleur du texte quand l'action n'a plus aucune touche. */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Reglages")
	FLinearColor UnboundColor = FLinearColor(0.9f, 0.2f, 0.2f);

	/** Couleur normale. Reprise telle quelle a la premiere affectation valide. */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Reglages")
	FLinearColor BoundColor = FLinearColor::White;

private:
	UFUNCTION()
	void HandleKeyButtonClicked();

	/** Identifiant Enhanced Input du mapping, pas le libelle affiche. */
	FName MappingName = NAME_None;
};
