package lab2;

import librairyMR.Affichable;

/**
 * player class
 * @author martin
Créez ensuite la classe Joueur qui comprendra la propriété nom et score. Ajoutez les méthodes
nécessaires pour que cette classe soit complète : Getteurs, setteurs, affiche, constructeurs et ajoute
qui accumulera les nouveaux points aux joueurs.
 */
public class Player implements Affichable{
	/*properties*/
	private final String _name;
	private final int _score;

	/*constructor*/
	/**
	 * private constructor
	 * use static factory
	 * @param name as player name String
	 * @param score as player score int
	 */
	private Player(String name, int score){
		//pas besoin de copie défensive, la string est immutable
		_name = name;
		_score = score;
	}

	/*static factory*/
	/**
	 * build Player from new name
	 * @param name as string
	 * @return new Player
	 */
	public static Player fromNewName(final String name){
		return new Player(name,0);
	}

	/**
	 * build player from existing player with new score
	 * @param p as Player
	 * @param score as int
	 * @return new Player
	 */
	public static Player fromPlayerWithScor(final Player p, int score){
		return new Player(p.getName(), score);
	}

	/*getter*/
	/**
	 * return player name
	 * @return player name
	 */
	public String getName(){
		return _name;
	}

	/**
	 * return player score
	 * @return player score
	 */
	public int getScore(){
		return _score;
	}

	/*immutator*/
	/**
	 * add score to player
	 * @param bonus as int bonus score
	 * @return new player with given score
	 */
	public Player addScore(int bonus){
		return Player.fromPlayerWithScor(this, getScore()+bonus);
	}

	/*method*/
	/**
	 * show player name and score
	 * @see librairyMR.Affichable#affiche()
	 */
	public void affiche(){
		System.out.print(_name);
		System.out.print(" ");
		System.out.println(_score);
	}

	/*main*/
	public static void main(String [ ] args){
		System.out.println("classe player");

		Player robert = Player.fromNewName("Robert");

		robert.affiche();

		robert = robert.addScore(4);

		robert.affiche();
	}
}
