#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();

  public:
	World();
	~World();

	// Godot overrides
	void _ready() override;
	void _process(float delta);

	Player* GetPlayerById(PlayerID a_PlayerId);

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

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


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