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

public class PiocheImpl extends UnicastRemoteObject implements IPioche
{
	/** Attribut symbolisant si la pioche est vide */
	private boolean vide; 								
	/** La pioche a proprement dite */
	private ArrayList<ICarte> pioche=new ArrayList<ICarte>();
	
	
	/**
	* CONSTRUCTEUR
	**/
	
	/**
	*Initialise la pioche avec 40 cartes
	* des bonnes couleurs
	*/
	public PiocheImpl() throws RemoteException
	{	
		super();
		vide=false;		
		
		//Construction de la pioche
		//Pour tous les elements du type enumere Couleur : 
		for(Couleur c: Couleur.values())
		{
			for(int i=1; i<8;i++)
			{
				pioche.add(new CarteImpl(i,c));
			}
			pioche.add(new CarteImpl(8,c,"Dame"));
			pioche.add(new CarteImpl(9,c,"Valet"));
			pioche.add(new CarteImpl(10,c,"Roi"));
		}
		//On melange
		melanger();
	}
	
	/**
	* METHODES
	**/
	
	/**
	*Permet de piocher une carte de la pioche
	*/
	public ICarte piocher() throws RemoteException
	{
		ICarte c = null;
		if (pioche.size() !=0)
		{
			c=pioche.get(pioche.size()-1);
			pioche.remove(c);
		}
		
		return c;

	}
	
	/**
	*Pour melanger, on cre une arrayList temporaire, on fait un random
	*et on enleve les CarteImpls (indice random) de la pioche pour les mettre dans le temporaire
	*Une fois ça finit, on copie le temporaire dans la pioche et le tour est joue
	*/
	public void melanger() throws RemoteException
	{
		ArrayList<ICarte> tmp;
		int i, n;
		
		tmp=new ArrayList<ICarte>();
		n=this.size();
		
		for (int x=0;x<n;n--)
		{		
			i=(int)(Math.random()*n);
			tmp.add(this.get(i));
			this.remove(i);
		}
		
		for (int j=0;j<tmp.size();j++ )
		{
			this.add(tmp.get(j));
		}
	}
	
	
	/**
	* METHODE D'AFFICHAGE 
	**/
	
	/** Affiche toute les cartes de la pioche */
	public String affiche() throws RemoteException
	{
		String s="";
		for(int i=0;i<pioche.size();i++)
		{
			s+="\tCarte n°"+(i+1)+"=>"+pioche.get(i).affiche();
		}
		
		return s;
	}
	
	
	/**
	* ACCESSEURS
	**/
	
	/** Retourne la taille de la pioche */
	public int size() throws RemoteException{ return pioche.size(); }
	/** Retourne true si la pioche est vide, false sinon */
	public boolean isEmpty() throws RemoteException{ return vide; }
	/** Retourne la carte de la pioche a l'indice passe en parametre */
	public ICarte get(int i) throws RemoteException{ return pioche.get(i); }
	/** Retire la carte a l'indice passe en parametre de la pioche */
	public void remove(int i) throws RemoteException{ pioche.remove(i); }
	/** Ajoute la carte passee en parametre a la pioche */
	public void add(ICarte c) throws RemoteException{ pioche.add(c); }
}
