#pragma once

#include <godot_cpp/classes/node3d.hpp>

#include <blitz/protocol/PacketHandler.h>

namespace blitz {

class Player;
class NetworkInterface;

class World : public godot::Node3D, public protocol::PacketHandler {
	GDCLASS(World, godot::Node3D)
  protected:
	static void _bind_methods();

	World();
	~World();

  public:
	// Godot overrides
	void _ready() override;

	Player* GetPlayerById(PlayerID a_PlayerId);

	void HandlePacket(const protocol::packets::PlayerJoin&) override;
	void HandlePacket(const protocol::packets::PlayerLeave&) override;

  protected:
	NetworkInterface* m_NetworkInterface;
	godot::Node* m_Players;
	float m_PassedTime;


	virtual void AddPlayer(PlayerID a_PlayerId, godot::String a_PlayerName);
	virtual void RemovePlayer(PlayerID a_PlayerId);
	virtual void SetPlayerPositionAndRotation(
		PlayerID a_PlayerId, const godot::Vector3& a_Position, const godot::Vector3& a_Rotation, const godot::Vector3& a_Velocity);
};
}  // namespace blitz