#ifndef GAME_SIM_H
#define GAME_SIM_H


#include <stdint.h>
#include <vector>


enum ObjectClass
{
  Terrain,
  Obstacle,
  Vehicle,
  WaterCraft,
  Pickup
  //Player
};


enum Movement
{
  Forward,
  Backward,
  Right,
  Left
};


enum ObjectType
{
  // Terrain
  Ground,
  Road,
  Rail,
  WaterLane,
  Water,

  // Obstacle
  Tree,
  Shrub,
  Building,
  Rocks,

  // Vehicle
  Bike,
  Car,
  Van,
  Truck,

  Train1,
  Train2,
  Train3,
  Train4,

  // WaterCraft
  Log,
  Boat,
  Crocodile,
  LilyPad,
  SteppingStone,

  // Pickup
  Coin,
  Food,
  Life,
  Bonus,

  // Player
  Player
};


class GameObject
{
public:
    ObjectType m_type = Ground;
    float m_x, m_y, m_z, m_w, m_h, m_d, m_dx, m_dy;
    uint32_t m_color; // type
};


typedef std::vector<GameObject> GameObjectList;


class GameSim
{
public:
    GameSim();
    ~GameSim();

    void reset();
    void movePlayer(Movement a_movement);
    bool isGameOver() { return m_gameOver; }
    bool hasWon()     { return m_won; }
    void update(float a_dt);

    std::vector<GameObjectList*> objectLists();

private:
    void generateLevel();
    bool checkGameOver();
    GameObjectList m_backgroundLevel;
    GameObjectList m_populationLevel;
    GameObjectList m_movingObjects;
    GameObjectList m_player;
    bool m_gameOver;
    bool m_won;
};


#endif // GAME_SIM_H

