package com.developpez.etat;

/**
 * Represente l'etat d'une banque valide et ayant des agences associees.
 */
public class EtatBanqueADesAgences implements EtatBanque {
	
	private final Banque banque;


	public EtatBanqueADesAgences(Banque banque) {
		if (null == banque) { // he he on represente l'etat d'une banque s'il vous plait
			throw new IllegalArgumentException("L'etat d'une banque est necessairement associe a la banque qu'il represente");
		}
		this.banque = banque;
	}

	/**
	 * ajout d'une agence
	 * @see com.developpez.etat.EtatBanque#addAgence(com.developpez.etat.Agence)
	 */
	public void addAgence(Agence agence) {
		if (null == agence) { // je n'ajoute que des agences qui sont effectivement des agences
			throw new IllegalArgumentException("Impossible d'ajouter une instance vide d'agence");
		}
		
		banque.getAgences().add(agence);
		
		// pas de transition vers un autre etat.
	}
	/**
	 * Suppression d'une agence et eventuellement retour dans l'etat initialise.
	 * @see com.developpez.etat.EtatBanque#delAgence(com.developpez.etat.Agence)
	 */
	public void delAgence(Agence agence) {
		// pas de garde precise mais on va quand meme verifier que l'agence n'est pas
		// nulle et qu'elle appartient bien a cette banque.

		if (null == agence) { // pas d'agence precisee.
			throw new IllegalArgumentException("Impossible de supprimer un agence vide");
		}
		
		if (! banque.getAgences().contains(agence)) { // c'est pas mon agence
			throw new IllegalArgumentException("Tentative de suppression d'une agence qui n'est pas associee a cette banque");		
		}
		
		banque.getAgences().remove(agence);
		
		// et la transition
		if (banque.getAgences().isEmpty()) { // retour a l'etat initialise
			banque.setEtat(new EtatBanqueInitialisee(banque));
		}
	}

	/**
	 * effacement de la banque impossible depuis cet etat
	 * @see com.developpez.etat.EtatBanque#delete()
	 */
	public void delete() {
		throw new IllegalStateException("Impossible de supprimer une banque qui contient encore des agences");
	}

	/**
	 * On a deja valider cet banque c'est assez inutile de recommencer, mais ce n'est pas grave
	 * donc je ne leve pas d'exception
	 * @see com.developpez.etat.EtatBanque#validate()
	 */
	public void validate() {
	}
 }
