#pragma once

#include "CoreMinimal.h"
#include "Engine/DataTable.h"
#include "Engine/World.h"
#include "ZoneRow.h"
#include "MapDef.generated.h"

/**
 *  FZMMOMapSpawn
 *
 *  Ponto de spawn dentro de um mapa, identificado por `Tag`. Usado pelo
 *  server pra decidir onde materializar um char quando ele entra:
 *    - Char sem posicao salva: usa spawn com tag="default"
 *    - Char saindo de raid:    pode pedir tag="raid_return"
 *    - Char morto:             pode pedir tag="graveyard"
 *
 *  ZeusEditorTools pode auto-popular o `Spawns[]` do FZMMOMapDef varrendo
 *  todos APlayerStart (ou ator custom AZMMOMapSpawnPoint) presentes no
 *  `.umap` do `ClientLevel` — botao "Sync from level".
 */
USTRUCT(BlueprintType)
struct ZMMO_API FZMMOMapSpawn
{
	GENERATED_BODY()

	/** Identificador do spawn (ex.: "default", "raid_return"). "default" e obrigatorio. */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Spawn")
	FName Tag = TEXT("default");

	/** Posicao em cm (espaco do mundo). */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Spawn")
	FVector PositionCm = FVector::ZeroVector;

	/** Yaw em graus. */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Spawn")
	float YawDeg = 0.f;
};

/**
 *  FZMMOMapDef
 *
 *  Definicao canonica de um mapa do MMO. Linha da DT_Maps no cliente.
 *  Exportada para `Server/ZeusServerEngine/Config/DataTables/maps_config.json`
 *  pelo plugin ZeusEditorTools — o JSON e a fonte que o WorldServer consome.
 *
 *  Identidade:
 *    - `MapId` (uint16) e a chave estavel cross-cliente/server. 0 = invalido
 *      (detecta bug de leitura de DB / migration esquecida).
 *    - RowName na DataTable e o nome interno (ex.: "TestWorld") — usado no
 *      exporter como `name` do JSON. Nao duplicamos em campo `Name`.
 *
 *  Wire economy:
 *    - `S_CHAR_SELECT_OK` envia `mapId` como uint16 (2 bytes) em vez de
 *      `mapName` (string), evitando ~10-30 bytes por handoff.
 */
USTRUCT(BlueprintType)
struct ZMMO_API FZMMOMapDef : public FTableRowBase
{
	GENERATED_BODY()

	/** ID estavel uint16. 0 = invalido. int32 aqui pois UE nao expoe uint16 em UPROPERTY. */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Map", meta = (ClampMin = "1", ClampMax = "65535"))
	int32 MapId = 0;

	/** Nome de exibicao localizavel. Aparece em UI/loading screen. */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Map")
	FText DisplayName;

	/** Asset do level no cliente. Exporter converte pra string canonica no JSON do server. */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Map|Level")
	TSoftObjectPtr<UWorld> ClientLevel;

	/**
	 *  Pontos de spawn taggeados. Editavel inline na DataTable;
	 *  ZeusEditorTools pode auto-popular varrendo PlayerStart do .umap.
	 *  Pelo menos um com Tag="default" e esperado.
	 */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Map|Spawns")
	TArray<FZMMOMapSpawn> Spawns;

	/** Regras PvP/Safe/Dungeon. Reusa enum de FZoneRow. */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Map")
	EZoneRules Rules = EZoneRules::PvE;

	/** Faixa de level recomendada — display only. */
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Map|Display")
	int32 RecommendedLevelMin = 1;

	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Map|Display")
	int32 RecommendedLevelMax = 99;
};
