package tpgenericite.abr;

import java.util.Random;
import entreprise.Employe;
import entreprise.Personne;
import java.util.Comparator;
import java.util.Iterator;

class TestArbreBinaireRecherche {
  public static void main(String[] args) {
    ArbreBinaireRecherche<Integer> abrInt
        = new ArbreBinaireRecherche<Integer>(45);
    Random gen = new Random(System.currentTimeMillis());
    for (int i = 0; i < 100; i++) {
      abrInt.insere(gen.nextInt(1000));
    }
    abrInt.afficheTesElements();

    // Arbre d'employés
    ArbreBinaireRecherche<Employe> abrEmployes
        = new ArbreBinaireRecherche<Employe>(new Employe("Toto"));
    Employe employe = new Employe("Bibi");
    employe.setSalaire(1800);
    abrEmployes.insere(employe);
    employe = new Employe("Boby");
    employe.setSalaire(2800);
    abrEmployes.insere(employe);
    employe = new Employe("Tom");
    employe.setSalaire(1700);
    abrEmployes.insere(employe);
    employe = new Employe("Fred");
    employe.setSalaire(2000);
    abrEmployes.insere(employe);
    abrEmployes.afficheTesElements();

    class CompareSalaire implements Comparator<Employe> {
      public int compare(Employe e1, Employe e2) {
        if (e1.getSalaire() > e2.getSalaire())
          return +1;
        else if (e1.getSalaire() < e2.getSalaire())
          return -1;
        else
          return 0;
      }
    }
    ArbreBinaireRecherche<Employe> abrEmployes2
        = new ArbreBinaireRecherche<Employe>(new CompareSalaire(),
                                             new Employe("Toto"));
    employe = new Employe("Bibi");
    employe.setSalaire(1800);
    abrEmployes2.insere(employe);
    employe = new Employe("Boby");
    employe.setSalaire(2800);
    abrEmployes2.insere(employe);
    employe = new Employe("Tom");
    employe.setSalaire(1700);
    abrEmployes2.insere(employe);
    employe = new Employe("Fred");
    employe.setSalaire(2000);
    abrEmployes2.insere(employe);
    // Pour voir le problème de compare pas compatible avec equals :
    employe = new Employe("Boby");
    employe.setSalaire(2800);
    abrEmployes2.insere(employe);
    // Rien vu de spécial !

    abrEmployes2.afficheTesElements();

    System.out.println("==========================");
    if (abrEmployes.contient(employe)) {
      System.out.println("oui");
    }
    else {
      System.out.println("non");
    }
    if (abrEmployes.contient(new Personne("bébert"))) {
      System.out.println("oui");
    }
    else {
      System.out.println("non");
    }
    try {
      if (abrEmployes.contient(new Integer(5))) {
	System.out.println("oui");
      }
      else {
	System.out.println("non");
      }
    }
    catch(ClassCastException e) {
      e.printStackTrace();
    }


    // Test de l'itérateur
    Iterator<Employe> it = abrEmployes2.iterator();
    // teste le cas où on modifie l'arbre après le renvoi de l'itérateur
    // abrEmployes2.insere(employe);
    while (it.hasNext()) {
      System.out.println(it.next());
    }

    // Test "for-each"
    for (Employe emp : abrEmployes2) {
      System.out.println(emp.getSalaire());
    }

    // Test de la 2ème implémentation de l'itérateur
    Iterator<Employe> it2 = abrEmployes2.iterator2();
    abrEmployes2.insere(employe);
    while (it2.hasNext()) {
      System.out.println(it2.next());
    }

  }
}
