/**
*Programme cree par The Clusters
*Classe tapis du jeu "Chkoba"
*@author The Clusters
*@version 1.0
**/

package chkoba;
import chkoba.*;
import java.util.*;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

/**
*	Classe Tapis
*/

public class TapisImpl extends UnicastRemoteObject implements ITapis
{
	/** Le tapis a proprement dit */
	private ArrayList<ICarte> tapis=new ArrayList<ICarte>();
	
	/**
	* CONSTRUCTEUR
	**/
	
	/**
	*Constructeur du tapis
	*a partir de la pioche
	*@param p , pioche a partir de laquelle on piochera
	*/
	public TapisImpl(IPioche p) throws RemoteException
	{
		int i;
		for ( i=0;i<4;i++)
		{
			tapis.add(p.piocher());
		}
	}
	
	/**
	* METHODES
	**/
	
	/**
	*Permet de retirer toutes les cartes dans l'arrayList
	*du tapis concerne
	*@param array , arraylist de cartes a enlever
	*/
	public boolean removeAll( ArrayList<ICarte> array ) throws RemoteException
	{
		boolean b=false;
		
		for ( int i=0; i<array.size(); i++)
		{
			if ( b == false )
				b=this.remove(array.get(i));
			else
				this.remove(array.get(i));
		}
		return b;
	}
	
	/**
	*Permet de retirer une carte du tapis
	*@param c , carte a enlever
	*/
	public boolean remove( ICarte c ) throws RemoteException
	{
		boolean b=false;
		tapis.remove(c);
		
		if ( tapis.size() == 0 )
			b=true;
		return b;
	}
	
	/**
	*Retire la carte a l'indice passe en parametre
	*@param i , indice de la carte a enlever
	*/
	public boolean remove( int i ) throws RemoteException
	{
		boolean b=false;
		tapis.remove(i);
		
		if ( tapis.size() == 0 )
		{
			for ( int j=0;j<4;j++)				
				this.add();
			b=true;
		}
		return b;
	}
	
	/**
	*Ajoute une carte au tapis
	*La carte vient de la pioche
	*/
	public void add() throws RemoteException
	{
		tapis.add(PlateauImpl.p.piocher());
	}
	
	/**
	*Ajoute une carte au tapis
	*La carte est passe en parametre
	*@param c , carte a ajouter
	*/
	public void add( ICarte c) throws RemoteException
	{
		tapis.add(c);
	}
	
	/**
	*Calcul la somme des valeurs
	*des cartes se trouvant sur le tapis
	*/
	public int somme() throws RemoteException
	{
		int total=0;
		
		for ( int i=0; i<tapis.size(); i++)
		{
			total+=tapis.get(i).getValeur();
		}
		
		return total;
	}
	
	/**
	* ACCESSEURS
	**/
	/** Retourne la carte a l'indice passe en parametre */
	public ICarte get(int i) throws RemoteException
	{
		return tapis.get(i);
	}
	
	/** Retourne la carte passe en parametre */
	public ICarte get( ICarte c ) throws RemoteException
	{
		int i=tapis.indexOf(c);
		return tapis.get(i);
	}
	
	/** Retourne la taille du tapis */
	public int size() throws RemoteException
	{
		return tapis.size();
	}
	
	/**
	* AFFICHAGE
	**/
	/** Affiche toutes les cartes contenues par le tapis */
	public String affiche() throws RemoteException
	{
		String s="";
		
		for (int i=0;i<tapis.size();i++)
		{
			s+="\t"+tapis.get(i).affiche();
		}
		return s;
	}
}
