#pragma once

#include "CoreMinimal.h"
#include "LoadingTypes.generated.h"

/**
 *  Contexto do loading screen genérico. Cada contexto resolve um perfil
 *  (lista de etapas) no UZMMOLoadingProfilesDataAsset.
 *
 *  Cliente local rastreia o progresso assinando eventos próprios
 *  (HandlePostLoadMap, OnPlayerSpawned, etc) — server não envia opcode de
 *  progresso, ver decisão em [[project_ui_loading_dynamic]].
 */
UENUM(BlueprintType)
enum class EZMMOLoadingContext : uint8
{
	None,
	FrontEndEnteringWorld,	///< FrontEnd → mundo (handoff CharServer→WorldServer + spawn).
	InGameEnteringInstance,	///< Mundo → dungeon/instance (futuro).
	InGameRespawn,			///< Pós-morte, retorno ao mundo (futuro).
};

UENUM(BlueprintType)
enum class EZMMOLoadingStepStatus : uint8
{
	Pending,	///< Ainda não começou.
	Running,	///< Em andamento (o "barber pole").
	Done,		///< Concluída.
	Failed,		///< Falhou (com reason em Status).
};

/**
 *  Uma etapa do loading. StepId é o identificador estável usado por código
 *  pra chamar MarkStepDone(StepId); Label é o texto localizado mostrado.
 */
USTRUCT(BlueprintType)
struct FZMMOLoadingStepDef
{
	GENERATED_BODY()

	/** Id estável (ex.: "Travel", "MapLoaded", "Connect", "Spawn"). */
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Loading")
	FName StepId;

	/** Texto localizado ("Carregando mapa...", "Conectando..."). */
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Loading")
	FText Label;
};

/**
 *  Perfil de loading por contexto. Designer edita no DA — código só
 *  consulta StepId pra avançar etapa.
 */
USTRUCT(BlueprintType)
struct FZMMOLoadingProfile
{
	GENERATED_BODY()

	/** Etapas em ordem. ProgressBar = #Done / #Steps. */
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Loading")
	TArray<FZMMOLoadingStepDef> Steps;

	/** Título da tela (vazio = usa default da classe). */
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Loading")
	FText TitleOverride;
};
