#pragma once

#include "Entity.h"
#include "EntityType.h"

class PlayerEntityType;

class Player : public Entity
{
public:
    class Key
    {
    public:
        const static __int64 MOVE_FRONT = 0x1;
        const static __int64 MOVE_BACK = 0x2;
        const static __int64 MOVE_LEFT = 0x4;
        const static __int64 MOVE_RIGHT = 0x8;
        const static __int64 MOVE_UP = 0x10;
        const static __int64 MOVE_DOWN = 0x20;
        const static __int64 ROTATE_LEFT = 0x40;
        const static __int64 ROTATE_RIGHT = 0x80;
    };
private:
    Framework::Text name;
    __int64 keyState;

public:
    Player( Framework::Vec3<float> location, int dimensionId, int entityId );
    void setName( Framework::Text name );
    const char* getName() const;
    void tick( const Dimension* zDimension, Game* zGame ) override;

    void api( Framework::StreamReader* zRequest, NetworkResponse* zResponse ) override;

    friend PlayerEntityType;
};

class PlayerEntityType : public EntityType
{
    REGISTRABLE( PlayerEntityType )

protected:
    virtual void loadSuperEntity( Entity* zEntity, Framework::StreamReader* zReader ) const override;
    virtual void saveSuperEntity( Entity* zEntity, Framework::StreamWriter* zWriter ) const override;

public:
    PlayerEntityType();

    virtual Entity* createEntity( Framework::Vec3<float> position, int dimensionId, Game* zTarget, int entityId ) const override;
};

REGISTER( PlayerEntityType, EntityType )