#pragma once

#include "CoreMinimal.h"
#include "CommonButtonBase.h"
#include "UI/UIStyleTypes.h"
#include "UI/UIStyleTokens.h"
#include "UIButton_Base.generated.h"

/**
 * Botão base do ZMMO. Camada de fundação (não instanciável direto — padrão
 * "_Abstract" do Hyper, mas em C++).
 *
 * Divisão de responsabilidade (ARQUITETURA.md §3.3, exceção de UI):
 *  - CommonUI (UCommonButtonBase): input teclado/gamepad, foco, click.
 *  - Este C++: resolve QUAIS tokens usar (variante + tema via
 *    UZMMOThemeSubsystem::GetActiveUIStyle()) e reage à troca de tema.
 *  - O WBP que herda (UI_Button_Master): decide COMO pintar, recebendo os
 *    tokens resolvidos em BP_ApplyUIStyle.
 *
 * Hierarquia esperada: UUIButton_Base (C++ Abstract)
 *   → UI_Button_Base (WBP abstrato) → UI_Button_Master → UI_Button_<Feature>.
 */
UCLASS(Abstract, Blueprintable)
class ZMMO_API UUIButton_Base : public UCommonButtonBase
{
	GENERATED_BODY()

public:
	/** Variante visual; o designer escolhe no WBP/instância. */
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "UI Style")
	EUIButtonVariant Variant = EUIButtonVariant::Primary;

	/** Re-resolve os tokens do tema ativo e reaplica (chama BP_ApplyUIStyle). */
	UFUNCTION(BlueprintCallable, Category = "UI Style")
	void RefreshUIStyle();

protected:
	virtual void NativePreConstruct() override;
	virtual void NativeConstruct() override;
	virtual void NativeDestruct() override;

	/**
	 * Implementado no WBP: aplica os tokens resolvidos nos widgets visuais
	 * (Border/Text/etc.) que só o Blueprint conhece.
	 */
	UFUNCTION(BlueprintImplementableEvent, Category = "UI Style",
		meta = (DisplayName = "Apply UI Style"))
	void BP_ApplyUIStyle(const FUIStyleButton& Button, const FUIStyleButtonVariant& VariantStyle);

	/** Seleciona o sub-struct da variante atual dentro de FUIStyleButton. */
	const FUIStyleButtonVariant& ResolveVariant(const FUIStyleButton& Button) const;

private:
	UFUNCTION()
	void HandleThemeChanged(FName NewThemeId);

	/** Evita rebind duplicado do delegate OnThemeChanged. */
	bool bThemeBound = false;
};
