//  BlockyFroggy
//  Copyright © 2017 John Ryland.
//  All rights reserved.
#include "Scene.h"
#include "Debug.h"


void Scene::reset(const std::vector<GameSim::GameObjectList*>& a_objectLists)
{
  // pre-process and split out objects by type
  /*
  m_trucks.clear();
  m_cars.clear();
  m_vans.clear();
  m_bikes.clear();
  m_trains.clear();
  m_road.clear();
  m_water.clear();
  m_tracks.clear();
  m_trees.clear();

  m_shrubs.clear();
  m_buildings.clear();
  m_rocks.clear();
  m_logs.clear();
  m_boats.clear();
  m_crocs.clear();

  m_rest.clear();
  */
  
  m_trucks.resize(0);
  m_cars.resize(0);
  m_vans.resize(0);
  m_bikes.resize(0);
  m_trains.resize(0);
  m_road.resize(0);
  m_water.resize(0);
  m_tracks.resize(0);
  m_trees.resize(0);
  m_shrubs.resize(0);
  m_buildings.resize(0);
  m_rocks.resize(0);
  m_logs.resize(0);
  m_boats.resize(0);
  m_crocs.resize(0);
  m_rest.resize(0);
  
  // Gather the counts for all the types
  int sizes[GameSim::ObjectType::COUNT] = { 0 };
  for (GameSim::GameObjectList* objList : a_objectLists)
    for (auto obj : *objList)
      sizes[obj.m_type]++;
  m_trucks.reserve(sizes[GameSim::Truck]);
  m_cars.reserve(sizes[GameSim::Car]);
  m_vans.reserve(sizes[GameSim::Van]);
  m_bikes.reserve(sizes[GameSim::Bike]);
  m_trains.reserve(sizes[GameSim::Train1] + sizes[GameSim::Train2] + sizes[GameSim::Train3] + sizes[GameSim::Train4]);
  m_road.reserve(sizes[GameSim::Road]);
  m_water.reserve(sizes[GameSim::Water] + sizes[GameSim::WaterLane]);
  m_tracks.reserve(sizes[GameSim::Rail]);
  m_trees.reserve(sizes[GameSim::Tree]);
  m_shrubs.reserve(sizes[GameSim::Shrub]);
  m_buildings.reserve(sizes[GameSim::Building]);
  m_rocks.reserve(sizes[GameSim::Rocks]);
  m_logs.reserve(sizes[GameSim::Log]);
  m_boats.reserve(sizes[GameSim::Boat]);
  m_crocs.reserve(sizes[GameSim::Crocodile]);
  int otherSize = sizes[GameSim::Ground] +
  sizes[GameSim::LilyPad] +
  sizes[GameSim::SteppingStone] +
  sizes[GameSim::Coin] +
  sizes[GameSim::Food] +
  sizes[GameSim::Life] +
  sizes[GameSim::Bonus] +
  sizes[GameSim::Player];
  m_rest.reserve(otherSize);

  
  for (GameSim::GameObjectList* objList : a_objectLists)
  {
    if (objList->size() && objList->back().m_type != GameSim::Player)
      for (unsigned i = 0; i < objList->size(); i++)
      {
        const GameSim::GameObject& obj = objList->at(i);

        //! @todo switch to a switch

        if (obj.m_type == GameSim::Truck)
          m_trucks.push_back(obj);
        else if (obj.m_type == GameSim::Car)
          m_cars.push_back(obj);
        else if (obj.m_type == GameSim::Van)
          m_vans.push_back(obj);
        else if (obj.m_type == GameSim::Bike)
          m_bikes.push_back(obj);
        else if (obj.m_type == GameSim::Train1)
          m_trains.push_back(obj);
        else if (obj.m_type == GameSim::Train2)
          m_trains.push_back(obj);
        else if (obj.m_type == GameSim::Train3)
          m_trains.push_back(obj);
        else if (obj.m_type == GameSim::Train4)
          m_trains.push_back(obj);


        else if (obj.m_type == GameSim::Road)
          m_road.push_back(obj);
        else if (obj.m_type == GameSim::Rail)
          m_tracks.push_back(obj);
        else if (obj.m_type == GameSim::Water)
          m_water.push_back(obj);
        else if (obj.m_type == GameSim::WaterLane)
          m_water.push_back(obj);


        else if (obj.m_type == GameSim::Tree)
          m_trees.push_back(obj);


        else if (obj.m_type == GameSim::Shrub)
          m_shrubs.push_back(obj);
        else if (obj.m_type == GameSim::Building)
          m_buildings.push_back(obj);
        else if (obj.m_type == GameSim::Rocks)
          m_rocks.push_back(obj);
        else if (obj.m_type == GameSim::Log)
          m_logs.push_back(obj);
        else if (obj.m_type == GameSim::Boat)
          m_boats.push_back(obj);
        else if (obj.m_type == GameSim::Crocodile)
          m_crocs.push_back(obj);

        /*
    case Game::Ground:        color = 0x47bd37; break;
    case Game::LilyPad:       color = 0x71df1f; break;
    case Game::SteppingStone: color = 0x71df1f; break;
        */

        else
          m_rest.push_back(obj);
      }
  }
  /*
     for (const Game::GameObject& obj : a_carModels)
     {
     m_cars.push_back(obj);
     }
   */


  setDebugValue("cars:",   int(m_cars.size()));
  setDebugValue("bikes:",  int(m_bikes.size()));
  setDebugValue("trucks:", int(m_trucks.size()));
  setDebugValue("vans:",   int(m_vans.size()));
  setDebugValue("trains:", int(m_trains.size()));
  setDebugValue("road:",   int(m_road.size()));
  setDebugValue("tracks:", int(m_tracks.size()));
  setDebugValue("water:",  int(m_water.size()));
  setDebugValue("trees:",  int(m_trees.size()));
}



