#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "ZMMOEntityInterface.h"
#include "ZMMOEntityTypes.h"
#include "ZMMOEntity.generated.h"

/**
 *  AZMMOEntity
 *
 *  Classe base para entidades replicadas pelo servidor que NAO precisam de
 *  capsula + `UCharacterMovementComponent` — tipicamente NPCs estaticos,
 *  objetos dinamicos do mundo, mobs simples sem locomotion fisica.
 *
 *  Para personagens com capsula + CMC (proxy de jogador, mobs com locomotion
 *  por capsula), use `AZMMOPlayerProxy` ou uma futura `AZMMOMob` que herde
 *  de `ACharacter`.
 *
 *  Implementa `IZMMOEntityInterface` com:
 *    - getters para `EntityId` / `EntityType`;
 *    - `ApplyEntitySnapshot` default: `SetActorLocationAndRotation` (sem
 *      interpolacao temporal — V1 podera adicionar ring-buffer + lerp);
 *    - `SetEntityRelevant(false)` default: oculta + desativa collision +
 *      desativa tick (preserva o ator no mundo para futuro pooling).
 */
UCLASS(Blueprintable, BlueprintType)
class ZMMO_API AZMMOEntity : public AActor, public IZMMOEntityInterface
{
	GENERATED_BODY()

public:
	AZMMOEntity();

	// --- IZMMOEntityInterface ---
	virtual int64 GetZMMOEntityId() const override { return EntityId; }
	virtual EZMMOEntityType GetZMMOEntityType() const override { return EntityType; }
	virtual void ApplyEntitySnapshot(const FZMMOEntitySnapshot& Snapshot) override;
	virtual void SetEntityRelevant(bool bRelevant) override;

	/** Setter usado pelo `UZMMOWorldSubsystem` apos o spawn para registrar a identidade. */
	UFUNCTION(BlueprintCallable, Category = "ZMMO|Entity")
	void SetZMMOIdentity(int64 InEntityId, EZMMOEntityType InEntityType);

protected:
	/** Identificador autoritativo do servidor. Atribuido em `SetZMMOIdentity`. */
	UPROPERTY(VisibleInstanceOnly, BlueprintReadOnly, Category = "ZMMO|Entity")
	int64 EntityId = 0;

	/** Categoria autoritativa (Player/Mob/NPC/Object). */
	UPROPERTY(VisibleInstanceOnly, BlueprintReadOnly, Category = "ZMMO|Entity")
	EZMMOEntityType EntityType = EZMMOEntityType::Object;

	/** Estado de relevancia atual (espelha as transicoes Hidden<->Relevant do servidor). */
	UPROPERTY(VisibleInstanceOnly, BlueprintReadOnly, Category = "ZMMO|Entity")
	bool bIsZMMORelevant = true;
};
