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

#pragma once

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

class UBorder;
class UButton;
class UImage;
class UTextBlock;
class UTexture2D;

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnCustomizationOptionClicked, int32, OptionIndex);

/**
 * Une case de la grille de customisation.
 *
 * La MEME classe sert les vignettes de pieces et les pastilles de couleur :
 * dans les deux cas c'est un bouton carre qui porte un visuel et sait s'il est
 * selectionne. Deux widgets auraient eu la meme logique de selection a tenir a
 * jour en double, pour la seule difference d'afficher une texture plutot qu'un
 * aplat.
 *
 * Classe Abstract : on cree un WBP_CustomizationOption qui en herite.
 */
UCLASS(Abstract)
class EMBERWILD_API UCustomizationOptionWidget : public UUserWidget
{
	GENERATED_BODY()

public:
	virtual void NativeOnInitialized() override;

	/** Previent d'un clic du joueur, jamais d'un rafraichissement. */
	UPROPERTY(BlueprintAssignable, Category = "Customization")
	FOnCustomizationOptionClicked OnOptionClicked;

	/**
	 * Mode piece : affiche la vignette du catalogue.
	 *
	 * @param Icon peut etre nul -- la case retombe alors sur son numero. Une
	 *        option sans vignette doit rester choisissable, sinon le catalogue
	 *        est inutilisable tant que les trente-six textures ne sont pas
	 *        rendues, et on veut justement les capturer depuis cet ecran.
	 */
	UFUNCTION(BlueprintCallable, Category = "Customization")
	void SetupAsPart(int32 InIndex, UTexture2D* Icon);

	/** Mode couleur : la pastille EST le visuel, aucune texture necessaire. */
	UFUNCTION(BlueprintCallable, Category = "Customization")
	void SetupAsColor(int32 InIndex, const FLinearColor& Color);

	/** Encadre la case si elle porte le choix courant. */
	UFUNCTION(BlueprintCallable, Category = "Customization")
	void SetSelected(bool bInSelected);

	UFUNCTION(BlueprintPure, Category = "Customization")
	int32 GetOptionIndex() const { return OptionIndex; }

protected:
	UPROPERTY(meta = (BindWidget))
	TObjectPtr<UButton> OptionButton;

	/** Porte la vignette en mode piece, la couleur en mode couleur. */
	UPROPERTY(meta = (BindWidget))
	TObjectPtr<UImage> OptionImage;

	/**
	 * Le numero de repli, montre uniquement quand une piece n'a pas de
	 * vignette. BindWidgetOptional : un WBP qui s'en passe reste valide, il
	 * affichera simplement des cases vides.
	 */
	UPROPERTY(meta = (BindWidgetOptional))
	TObjectPtr<UTextBlock> IndexText;

	/** Le cadre de selection. Optionnel : on peut le rendre autrement. */
	UPROPERTY(meta = (BindWidgetOptional))
	TObjectPtr<UBorder> SelectionBorder;

	/** Couleur du cadre quand la case porte le choix courant. */
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Customization")
	FLinearColor SelectedBorderColor = FLinearColor(1.f, 0.78f, 0.35f, 1.f);

	/** Couleur du cadre au repos. Transparente par defaut : il disparait. */
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Customization")
	FLinearColor UnselectedBorderColor = FLinearColor(1.f, 1.f, 1.f, 0.f);

private:
	UFUNCTION()
	void HandleButtonClicked();

	int32 OptionIndex = 0;
};
