using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class PoolManager : MonoBehaviour {
	/************************************************************
	**********************   PROPERTIES   ***********************
	*************************************************************/
	//public fields
	//quantidade inicial de objetos do tipo que está no pool
	public int poolAmount = 5;
	//tipo do objeto que está no pool
	public GameObject pooledObject;

	//private fields
	List<GameObject> pool;

	/************************************************************
	*****************   MONOBEHAVIOUR MESSAGES   ****************
	************************************************************/
	void Start () {	
		pool = new List<GameObject> ();
		//um for do valor 0 até o valor pré estabelecido através do inspector poolAmount
		//a cada iteração um novo objeto será instnaciado e, será feito "filho" do gameObject
		//que ESTE SCRIPT está fazendo parte...
		for (int i = 0; i < poolAmount; i++) {
			pool.Add (Instantiate (pooledObject,transform.position,Quaternion.identity) as GameObject);
			//aqui o transform.parent está recebendo o transform deste gameobject, ou seja, está
			//ajustando este gameobject para ser o pai do objeto que acabou de ser instanciado!
			pool [i].transform.parent = transform;
			//ajusta o objeto recem instanciado como desativado
			pool [i].SetActive (false);
		}
	}

	public GameObject Spawn() {
		//aqui ele vai varrer todo o pool procurando por um objeto que
		//esteja DESATIVADO na hierarchy, encontrando, retorna o objeto
		//abortando o método
		for (int i = 0; i < pool.Count; i++) {
			if (!pool [i].activeInHierarchy) {
				pool [i].SetActive (true);
				pool [i].SendMessage ("SpawnStart",SendMessageOptions.DontRequireReceiver);
				return pool [i];
			}
		}

		//caso não seja encontrado nenhum objeto desativado, significa que estão todos em cena
		//então, é instanciado um novo objeto e ele é colocado no pool e o pai é reajustado semelhantemente
		//como aconteceu no metodo Start
		pool.Add (Instantiate(pooledObject,transform.position,Quaternion.identity) as GameObject);
		pool [pool.Count - 1].transform.parent = transform;
		return pool [pool.Count - 1];
	}

	public GameObject SpawnAtPosition(Vector3 position) {
		GameObject spwnObject = Spawn ();
		spwnObject.transform.position = position;
		return spwnObject;
	}

}
