#pragma once

#include "CoreMinimal.h"
#include "ZeusEntityTypes.generated.h"

/**
 *  Categoria autoritativa replicada pelo servidor. Determina que classe de ator
 *  o `UZeusWorldSubsystem` deve spawnar para um snapshot recebido.
 */
UENUM(BlueprintType)
enum class EZeusEntityType : uint8
{
	Player UMETA(DisplayName = "Player"),
	Mob    UMETA(DisplayName = "Mob"),
	NPC    UMETA(DisplayName = "NPC"),
	Object UMETA(DisplayName = "Object")
};

/**
 *  Snapshot autoritativo aplicado por `IZeusEntityInterface::ApplyEntitySnapshot`.
 *
 *  Construido pelo `UZeusWorldSubsystem` a partir dos delegates do
 *  `UZeusNetworkSubsystem` (`OnPlayerStateUpdate` em V0; opcodes para mobs/NPCs
 *  em V1+). Mantemos os campos minimos que o servidor ja replica hoje
 *  (`S_PLAYER_STATE`); novos campos sao adicionados aqui sempre que o protocolo
 *  evoluir, sem mexer nas classes de proxy.
 */
USTRUCT(BlueprintType)
struct FZeusEntitySnapshot
{
	GENERATED_BODY()

	/** EntityId autoritativo do servidor. */
	UPROPERTY(BlueprintReadOnly, Category = "Zeus|Entity")
	int64 EntityId = 0;

	/** Categoria do ator (define qual proxy class spawnar). */
	UPROPERTY(BlueprintReadOnly, Category = "Zeus|Entity")
	EZeusEntityType EntityType = EZeusEntityType::Player;

	/** Sequencia de input processada no servidor (so faz sentido para players). */
	UPROPERTY(BlueprintReadOnly, Category = "Zeus|Entity")
	int32 LastProcessedInputSeq = 0;

	/** Posicao mundo (cm). */
	UPROPERTY(BlueprintReadOnly, Category = "Zeus|Entity")
	FVector PositionCm = FVector::ZeroVector;

	/** Velocidade mundo (cm/s) — usada para network smoothing e drivers de animacao. */
	UPROPERTY(BlueprintReadOnly, Category = "Zeus|Entity")
	FVector VelocityCmS = FVector::ZeroVector;

	/** Yaw em graus (orientacao visual). */
	UPROPERTY(BlueprintReadOnly, Category = "Zeus|Entity")
	float YawDeg = 0.0f;

	/** Indica se o servidor considera o ator em solo. */
	UPROPERTY(BlueprintReadOnly, Category = "Zeus|Entity")
	bool bGrounded = false;

	/** Tempo do servidor (ms desde epoch) quando este snapshot foi gerado. */
	UPROPERTY(BlueprintReadOnly, Category = "Zeus|Entity")
	int64 ServerTimeMs = 0;
};
