package carte;
/**
 * classe pour représenter une carte d'un jeu de 32 cartes classiques
 * l'ordre des valeurs des cartes est défini de manière classique 7, 8, 9, 10, V, D, R
 * l'ordre des familles est prioritaire sur les valeurs et comme suit : Coeur, Carreau, Pique, Trefle
 * pour un jeu qui nécéssite un autre ordre, créer un Comparator<Carte> externe
 
 * @author Matthias Colin
 * @version 1.0 (31/05/2011)
 */

import java.util.*;

public class Carte implements Comparable<Carte> {
	// valeur d'une carte
	private Valeur valeur;
	
	// famille d'une carte
	private Famille famille;
	
	/**
	 * constructeur d'une carte à partir de sa valeur et de sa famille
	 * @param valeur valeur de la carte
	 * @param famille famille de la carte
	 */
	public Carte(Valeur valeur, Famille famille) {
		this.valeur = valeur;
		this.famille = famille;
	}
	
	/**
	 * @return la valeur de la carte
	 */
	public Valeur getValeur() {
		return valeur;
	}
	
	/**
	 * @return la famille de la carte
	 */
	public Famille getFamille() {
		return famille;
	}
	
	/**
	 * égalité de deux cartes (si valeurs et familles identiques)
	 * @return true si la carte courante est égale à l'objet en paramètre,
	 * false si le paramètre est nul, n'est pas une carte ou carte différente
	 */
	@Override
	public boolean equals(Object o) {
		if (o == null || (! (o instanceof Carte))) {
			return false;
		}
		Carte carte = (Carte) o;
		return (this.getValeur() == carte.getValeur()) 
				&& (this.getFamille() == carte.getFamille()) ;
	}	
	
	/**
	 * hashCode d'une carte à partir des hashCodes de sa famille et de sa valeur
	 * @return le hasCode de la carte
	 */
	@Override
	public int hashCode() {
		return valeur.hashCode() + famille.hashCode();
	}
	
	/**
	 * compare la carte courante à une autre carte
	 * - 1er critère : l'ordre naturel des familles
	 * - 2ème critère : l'ordre naturel des valeurs
	 * @param carte à comparer avec l'objet courant
	 * @return un nombre négatif, nul ou positif si, respectivement,
	 * la carte courante est plus petite, égale ou plus grande que la carte
	 * en paramètre
	 */
	@Override
	public int compareTo(Carte carte) {
		int res;
		res = this.getFamille().compareTo(carte.getFamille());
		if (res == 0) { // même famille
			res = this.getValeur().compareTo(carte.getValeur());
		}
		return res;
	}
	
	/**
	 * représentation textuelle d'une carte (valeur famille)
	 * @return la représentation textuelle
	 */
	@Override
	public String toString() {
		return valeur + " " + famille;
	}
	
}