#pragma once

#include "CoreMinimal.h"
#include "UObject/Interface.h"
#include "ZMMOEntityTypes.h"
#include "ZMMOEntityInterface.generated.h"

/**
 *  UZMMOEntityInterface
 *
 *  Marcador `UInterface` necessario para o sistema de reflexao da Unreal. Todo o
 *  contrato vive em `IZMMOEntityInterface` (puro C++).
 */
UINTERFACE(BlueprintType, MinimalAPI, meta = (CannotImplementInterfaceInBlueprint))
class UZMMOEntityInterface : public UInterface
{
	GENERATED_BODY()
};

/**
 *  IZMMOEntityInterface
 *
 *  Contrato comum de todas as entidades replicadas pelo Zeus Server (player
 *  local, players remotos, mobs, NPCs, objetos). Inspirado em `IZeusEntityInterface`
 *  (ZeusV1) e adaptado para o nosso modelo "cliente solto + servidor valida input".
 *
 *  Decisoes:
 *    1. **Identidade autoritativa**: `EntityId` e `EntityType` vem do servidor; o
 *       cliente nunca os altera.
 *    2. **Visibilidade gated por AOI**: o servidor envia spawn/despawn quando o
 *       target entra/sai da area de interesse. O cliente reage via
 *       `SetEntityRelevant(bool)`.
 *    3. **Player local nao reconcilia em V0**: para o `AZMMOPlayerCharacter` o
 *       `ApplyEntitySnapshot` e no-op (cliente solto controla landscape). Quando
 *       a colisao de objetos chegar no servidor podemos ligar reconciliacao
 *       horizontal opcional.
 *
 *  Por que UInterface (e nao heranca classica)?
 *    - `AZMMOPlayerCharacter` ja herda de `ACharacter`. Forcar uma classe base
 *      `AZMMOEntity : AActor` para todos perderia o `ACharacter` gratuito.
 *      A interface permite que o player local (`ACharacter`), o proxy remoto
 *      (`ACharacter`) e entidades genericas (`AActor`) implementem o mesmo
 *      contrato sem heranca multipla concreta.
 */
class ZMMO_API IZMMOEntityInterface
{
	GENERATED_BODY()

public:
	/** Identificador autoritativo da entidade no servidor. */
	virtual int64 GetZMMOEntityId() const = 0;

	/** Categoria da entidade (Player, Mob, NPC, Object). */
	virtual EZMMOEntityType GetZMMOEntityType() const = 0;

	/**
	 * Aplica um snapshot autoritativo. Implementacoes podem extender com
	 * interpolacao temporal ou logica especifica (anim drivers, etc.).
	 *
	 * Para o jogador local, este metodo e no-op em V0: o cliente conduz a
	 * fisica do landscape de forma autoritativa local, e o servidor apenas
	 * valida input/velocidade (ADR 0038).
	 */
	virtual void ApplyEntitySnapshot(const FZMMOEntitySnapshot& Snapshot) = 0;

	/**
	 * Alterna entre estado visivel/ativo (`true`) e oculto/desativado (`false`).
	 * Implementacao default das classes do projeto: `Hidden + DisableCollision +
	 * DisableTick` ao desativar (preserva o ator para futuro pooling).
	 *
	 * Para o jogador local, `bRelevant=false` e ignorado — nunca despawnamos o
	 * proprio personagem do cliente local.
	 */
	virtual void SetEntityRelevant(bool bRelevant) = 0;
};
