#pragma once

#include "CoreMinimal.h"
#include "CommonUserWidget.h"
#include "UI/UIStyleTypes.h"
#include "UI/UIStyleTokens.h"
#include "UIPanel_Base.generated.h"

class UBorder;

/**
 * Painel base do ZMMO — mesmo padrão do UUIButton_Base, mas container.
 * Fundação CommonUI (UCommonUserWidget). Camada Abstract; o WBP concreto
 * (UI_Panel_Master) herda DIRETO desta classe C++ (UMG não encadeia árvores
 * de WBP — ver ARQUITETURA.md §3.3).
 *
 * Visual data-driven por FUIStyle.Panel (UZMMOThemeSubsystem). Designers
 * injetam o conteúdo no NamedSlot "Content".
 */
UCLASS(Abstract, Blueprintable)
class ZMMO_API UUIPanel_Base : public UCommonUserWidget
{
	GENERATED_BODY()

public:
	/**
	 * true  = lê brushes da DT_UI_Styles (FUIStylePanel) — tema centralizado.
	 * false = ignora a DT e usa apenas `Panels` (brushes manuais no Details).
	 */
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Panel")
	bool bUseTheme = true;

	// ---- Modo TEMA: chave FName do TMap FUIStylePanel pra cada Border. ----
	//
	// GetOptions popula dropdown lendo DT_UI_Styles row "Default" — adicione
	// uma entry em FUIStylePanel.PanelBackgroundByName no DT e a categoria
	// aparece aqui sem recompilar C++. Vazio = sem brush (NoDrawType).

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Panel",
		meta = (EditCondition = "bUseTheme", EditConditionHides,
		        GetOptions = "GetPanelBackgroundOptions"))
	FName BackgroundKey;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Panel",
		meta = (EditCondition = "bUseTheme", EditConditionHides,
		        GetOptions = "GetPanelOutlineOptions"))
	FName OutlineKey;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Panel",
		meta = (EditCondition = "bUseTheme", EditConditionHides,
		        GetOptions = "GetPanelOutlineEffectOptions"))
	FName OutlineEffectKey;

	// ---- Modo MANUAL: 3 brushes editáveis direto no Details. ----

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Panel",
		meta = (EditCondition = "!bUseTheme", EditConditionHides))
	FUIPanelBrushSet Panels;

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

	/**
	 *  Populadores do dropdown (meta=GetOptions) das chaves de textura.
	 *  Lêem DT_UI_Styles row "Default" e retornam as FName de cada sub-mapa
	 *  do FUIStylePanel. Editar o DT no editor reflete aqui sem recompilar.
	 *  São métodos de instância porque o UE precisa de UFUNCTION reflexável;
	 *  o conteúdo não usa estado da instância (poderia ser estático).
	 */
	UFUNCTION()
	TArray<FString> GetPanelBackgroundOptions() const;

	UFUNCTION()
	TArray<FString> GetPanelOutlineOptions() const;

	UFUNCTION()
	TArray<FString> GetPanelOutlineEffectOptions() const;

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

	/** Hook opcional: o WBP pode estender/sobrescrever a aplicação visual. */
	UFUNCTION(BlueprintImplementableEvent, Category = "UI Style",
		meta = (DisplayName = "Apply Panel Style"))
	void BP_ApplyPanelStyle(const FUIStylePanel& Panel);

	/** Widgets visuais opcionais. */
	UPROPERTY(meta = (BindWidgetOptional))
	TObjectPtr<UBorder> Background;

	/** Contorno texturizado por cima do fundo (modo textura, padrão Hyper). */
	UPROPERTY(meta = (BindWidgetOptional))
	TObjectPtr<UBorder> Outline;

	/** Efeito sobre o contorno (glow/embossing/etc.) — pintado acima do Outline. */
	UPROPERTY(meta = (BindWidgetOptional))
	TObjectPtr<UBorder> OutlineEffect;

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

	bool bThemeBound = false;
};
