/**
*Programme cree par The Clusters
*Classe Main 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 Main
*/

public class MainImpl extends UnicastRemoteObject implements IMain
{
	/** Attribut contenant les cartes.<br/> Il symbolise la main */
	private ArrayList<ICarte> main=new ArrayList<ICarte>();
	
	/**
	* CONSTRUCTEUR
	**/
	
	/**
	*Constructeur par defaut
	*/
	public MainImpl() throws RemoteException
	{
		for ( int i=0;i<3;i++)
		{
			main.add(PlateauImpl.p.piocher());
		}
	}
	/**
	*Constructeur paur les mains en reseaux
	*@param serveur , booleen pour savoir si l'on est en mode serveur
	*/
	public MainImpl(boolean serveur) throws RemoteException
	{
		super();
		for ( int i=0;i<3;i++)
		{
			
			main.add(PlateauImpl.p.piocher());
		}
	}
	
	/**
	* METHODES
	**/
	
	/**
	*Retire toutes les cartes dans l'arrylist de la main
	*@param array , araylist de toutes les cartes a retirer
	*/
	public void removeAll( ArrayList<ICarte> array ) throws RemoteException
	{
		for ( int i=0; i<array.size(); i++)
		{
			this.remove(array.get(i));
		}
		if ( main.size() == 0 )
			this.remplirMain();
	}
	
	/**
	*Retire la carte passe en parametre
	*@param c , carte a retirer
	*/
	public void remove( ICarte c ) throws RemoteException
	{		
		main.remove(c);
		
		if ( main.size() == 0 )
			this.remplirMain();
	}
	
	/**
	*Retire la carte a l'indice passe en parametre
	*@param i , indice de la carte a retirer
	*/
	public void remove( int i ) throws RemoteException
	{			
		main.remove(i);
		
		if ( main.size() == 0 )
			this.remplirMain();
	}
	
	/**
	*Ajoute une carte de la pioche
	*/
	public void add() throws RemoteException
	{
		main.add(PlateauImpl.p.piocher());
	}
	
	/**
	*Retourne l'indice de la carte passe en parametre
	*@param c , carte dont on veut savoir l'indice
	*/
	public int indexOf(ICarte c) throws RemoteException
	{
		return main.indexOf(c); 
	}
	
	/**
	*Ajoute la carte passe en parametre
	* a l'indice passe en parametre
	*@param index , entier symbolisant l'indice
	*@param c , carte a ajouter
	*/
	public void add(int index, ICarte c) throws RemoteException
	{
		main.add(index, c);
	}
	
	/**
	*Remplit la main
	*/
	public void remplirMain() throws RemoteException
	{
		for ( int i=0;i<3;i++)
		{
			if ( PlateauImpl.p.size() != 0 )
				this.add();
		}
	}
	
	/**
	* ACCESSEURS
	**/
	
	/** Retourne la carte a l'indice donne */
	public ICarte get(int i) throws RemoteException { return main.get(i); }
	/** Retourne la taille de la main */
	public int size() { return main.size(); }
	/** Switch la valeur de "vide" a false si elle est egale a true et vice-versa */
	public boolean estVide() throws RemoteException
	{
		if ( main.size() == 0 )
			return true;
		else
			return false;
	}
	
	/**
	* AFFICHAGE
	**/	
	/** Affichage de toutes les cartes dans la main */
	public String affiche() throws RemoteException
	{
		String s="";
		
		for (int i=0;i<main.size();i++)
		{
			s+="\t"+main.get(i).affiche();
		}
		return s;
	}
}
