#pragma once

#include "CoreMinimal.h"
#include "CommonActivatableWidget.h"
#include "Engine/EngineBaseTypes.h"
#include "UIActivatableScreen_Base.generated.h"

/**
 * Modo de input desejado pela tela (espelha o padrão do Lyra). O
 * UUIActivatableScreen_Base converte isto num FUIInputConfig em
 * GetDesiredInputConfig.
 */
UENUM(BlueprintType)
enum class EZMMOScreenInputMode : uint8
{
	Default,		// não força nada (herda do CommonUI)
	GameAndMenu,	// jogo + UI (ex.: HUD com cursor)
	Game,			// só jogo
	Menu			// só UI (telas de front-end — default)
};

/**
 * Base de TODAS as telas de front-end (Boot/Login/ServerSelect/Lobby/…).
 *
 * Fundação CommonUI (UCommonActivatableWidget) cuida de
 * ativação/foco/voltar/stack. Camada Abstract; o WBP concreto herda DIRETO
 * desta classe C++ (UMG não encadeia árvores — ARQUITETURA.md §3.3). Os WBPs
 * gerados pelo Zeus UMG Forge são reparented para cá (§4.8).
 *
 * Reage à troca de tema via UZMMOThemeSubsystem (mesmo padrão de
 * UUIButton_Base) e encaminha o "voltar" ao UUIFrontEndFlowSubsystem.
 */
UCLASS(Abstract, Blueprintable)
class ZMMO_API UUIActivatableScreen_Base : public UCommonActivatableWidget
{
	GENERATED_BODY()

public:
	/** Re-resolve os tokens do tema ativo e reaplica. WBP/filho sobrescreve. */
	UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "UI Style")
	void RefreshUIStyle();
	virtual void RefreshUIStyle_Implementation();

protected:
	// ---- Input config (desktop/gamepad) ----
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Input")
	EZMMOScreenInputMode InputConfig = EZMMOScreenInputMode::Menu;

	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Input")
	EMouseCaptureMode GameMouseCaptureMode = EMouseCaptureMode::CapturePermanently;

	virtual TOptional<FUIInputConfig> GetDesiredInputConfig() const override;

	// ---- Lifecycle (espelha o hook de tema de UUIButton_Base) ----
	virtual void NativeConstruct() override;
	virtual void NativeDestruct() override;
	virtual void NativeOnActivated() override;
	virtual void NativeOnDeactivated() override;

	/** "Voltar" (Esc/B): encaminha ao UUIFrontEndFlowSubsystem::RequestBack. */
	virtual bool NativeOnHandleBackAction() override;

	/** Hooks Blueprint para o WBP refinado. */
	UFUNCTION(BlueprintImplementableEvent, Category = "UI",
		meta = (DisplayName = "On Screen Activated"))
	void BP_OnScreenActivated();

	UFUNCTION(BlueprintImplementableEvent, Category = "UI",
		meta = (DisplayName = "On Screen Deactivated"))
	void BP_OnScreenDeactivated();

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

	bool bThemeBound = false;
};
