import java.util.LinkedList;
import java.util.Queue;

public class CompteSécurisé extends Compte {
  private static final int duréePériode = 5;

  private long cumulMax;
  private Queue<Retrait> derniersRetraits;

  public CompteSécurisé(long soldeInitial, long cumulMax) {
    super(soldeInitial);
    assert(cumulMax > 0);
    this.cumulMax = cumulMax;
    this.derniersRetraits = new LinkedList<Retrait>();
  }

  // Ce constructeur est ajouté pour pouvoir tester la sécurisation.
  // Il est artificiel et devrait être retiré de la classe.
  // Il permet de construire un compte sécurisé ayant déjà des anciens retraits.
  // Le deuxième paramètre correspond à un nombre variable (mais supérieur
  // ou égal à 1) d'entiers. Chacun de ses entiers va correspondre à un
  // retrait passé du compte.
  public CompteSécurisé(long soldeInitial, long cumulMax, long... montants) {
    this(soldeInitial, cumulMax);
    int nbj = duréePériode + 1;
    for (long montant : montants)
      derniersRetraits.add(new Retrait(montant, nbj--));
  }

  @Override
  public boolean retraitPossible(long val) {
    if (!super.retraitPossible(val))
      return false;
    long cumul = val;
    for (Retrait r : derniersRetraits)
      if (r.age() <= duréePériode)
        cumul += r.montant();
    return cumul <= cumulMax;
  }

  @Override
  public void retirer(long val) {
    super.retirer(val);
    while (!derniersRetraits.isEmpty()
        && derniersRetraits.element().age() > duréePériode)
      derniersRetraits.remove();
    derniersRetraits.add(new Retrait(val));
  }

  @Override
  public String toString() {
    String s = super.toString() + " (" + cumulMax + "€)\n";
    for (Retrait r : derniersRetraits)
      s += "  " + r + "\n";
    return s;
  }

  public static void main(String[] args) {
    System.out.println(new CompteSécurisé(1234, 250));
    
    CompteSécurisé cs = new CompteSécurisé(1000, 500, 300, 50, 280);
    System.out.println(cs);
    long val = 100;
    if (cs.retraitPossible(val)) {
      cs.retirer(val);
      System.out.println(cs);
    }
    else
      System.out.println("retrait de " + val + "€ impossible");
  }
}
