/**
 * Copyright (c) 2021 Dominic Masters
 * 
 * This software is released under the MIT License.
 * https://opensource.org/licenses/MIT
 */

#pragma once
#include "../../libs.h"
#include "../../display/spritebatch.h"
#include "../../display/texture.h"
#include "../../display/tileset.h"

/** Entity Texture Information */
#define ENTITY_ASSET_TEXTURE "world/entity.png"
#define ENTITY_WIDTH 32
#define ENTITY_HEIGHT ENTITY_WIDTH

/** Entity ID Definitions */
#define ENTITY_TYPE_NULL 0x00
#define ENTITY_TYPE_PLAYER 0x01

/** Max count of entities in the world */
#define ENTITY_COUNT 64

/** Count of different types of entities */
#define ENTITY_TYPE_COUNT ENTITY_TYPE_PLAYER + 1

#define ENTITY_DIRECTION_SOUTH  0x00
#define ENTITY_DIRECTION_NORTH  0x01
#define ENTITY_DIRECTION_WEST   0x02
#define ENTITY_DIRECTION_EAST   0x03

#define ENTITY_STATE_WALKING 0x01

/** Unique Entity ID */
typedef uint8_t entityid_t;

/** Unique Entity ID for the Entity Type */
typedef uint8_t entitytypeid_t;

/** Entity Definition */
typedef struct {
  entitytypeid_t type;
  int32_t gridX, gridY, gridZ;
  int32_t oldGridX, oldGridY, oldGridZ;
  float positionX, positionY, positionZ;
  uint8_t direction;
  uint32_t state;
} entity_t;

/** Definition for an entity type */
typedef struct {
  void (*entityInit)(entityid_t entityId, entity_t *entity);
  void (*entityUpdate)(entityid_t entityId, entity_t *entity);
  void (*entityRender)(entityid_t entityId, entity_t *entity);
  void (*entityDispose)(entityid_t entityId, entity_t *entity);
} entitytype_t;

/** Entity State Management */
typedef struct {
  /** Entities within the state */
  entity_t entities[ENTITY_COUNT];

  /** Sprite Batch in the state */
  spritebatch_t *spriteBatch;

  /** Texture for entities */
  texture_t *texture;

  /** Divided Tileset for entities */
  tileset_t *tileset;
} entitystate_t;

/** Global Entity State */
extern entitystate_t ENTITY_STATE;

/** Global Entity Type Definitions */
extern entitytype_t ENTITY_TYPES[ENTITY_TYPE_COUNT];