package classes.matuto.model
{
	
	
	import classes.matuto.interfaces.ICollection;
	import classes.matuto.utils.model.MathG;
	
	import flash.events.EventDispatcher;
	
	
	public class ModelCollection extends EventDispatcher implements ICollection
	{
		
		
		private     var 	CLASS 					:			Class;
	
		private 	var 	dados					:			Array;
		private 	var 	colecao					:			Array;
		private 	var 	colecaoPagina			:			Array;
		
		private 	var 	total					:			int;
		private 	var  	quantidadePorPagina		:			int;	
		private 	var 	totalPaginacao			:			int;
		public 		var 	index					:			int    = 0;
		public 		var 	indexPage				:			int    = 0;
		
			
		public function ModelCollection(_dados:Array,_CLASS:Class,_quantidadePorPagina:int=10)
		{
			
			dados 							= _dados;
			CLASS 							= _CLASS;
			quantidadePorPagina 			= _quantidadePorPagina;
			
			total 							= dados.length-1;
			colecao 						= new Array();
			totalPaginacao					= Math.ceil(total / quantidadePorPagina)-1;	

			popule();	
		
		}
		
		public function popule():void
		{
				
			for each(var object:* in dados)
			{
				var info:ModelItem = new CLASS(object);
				colecao.push(info);	
			}
			
			return;
		}
		
		public function add(item:ModelItem):void
		{
			colecao.push(item);	
			return;			
		}
		
		public function remove(posicao:int):void
		{
			colecao[posicao]  =  null;	
			return;			
		}
		
		
		//======================= GET PAGINATION SIMPLES =================================//
		
		
		public function get next():*
		{
			return colecao[index+=1];
		}
		
		public function get prev():*
		{
		   return colecao[index-=1];
		}
		
		public function get random():*
		{
		  return colecao[Math.round(Math.random()*total)];
		}
		
		public function get firts():*
		{
		  return colecao[0];	
		}
		
		public function get last():*
		{
		  return colecao[total];	
		}
		
		public function get getCollection():Array
		{
		   return colecao;
		}
		
		public function get getRandomCollection():Array
		{
			
			var indicesRandom:Array = MathG.randomInt(colecao.length-1);
			var colecaoRandom:Array = [];
			
			var aux:int = 0;
			for each(var item:ModelItem in colecao)
			{
			   colecaoRandom[aux] = colecao[indicesRandom[aux]]; 
			   aux++;
			}
			
			
			return colecaoRandom;
		}

		
	    //====================================================================================//	
		
		
		
		//======================= GET PAGINATION ============================================//
		
		
		public function getCollectionPagination(page:int):Array
		{
			
			colecaoPagina = [];
			
			for (var i:int = page*quantidadePorPagina; i < page * quantidadePorPagina+quantidadePorPagina; i++)  
			{
				if (i > total-1) continue;		
				{
					
					colecaoPagina.push(dados[i]);
					
				}
					
			}
			
			return colecaoPagina;
		}
		
		
		public function get nextPag():Array
		{
			return getCollectionPagination(indexPage+=1);
		}
		
		public function get prevPag():Array
		{
			return getCollectionPagination(indexPage-=1);
		}
		
		public function get firtsPag():Array
		{
			return getCollectionPagination(0);
		}
		
		public function get lastPag():Array
		{
			return getCollectionPagination(totalPaginacao);
		}
		
		public function get getTotalPaginacao():int
		{
			return totalPaginacao;
		}
		
		
		//====================================================================================//	
		
		
		
		
		
		
		
		
	}//end clas
}