package ufe.jpa;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.persistence.Query;

public class Test5 {

  public static void main(String[] args) {
    EntityManagerFactory emf = null;
    EntityManager em = null;
    EntityTransaction tx = null;
    try {
      emf = Persistence.createEntityManagerFactory("employes");
      em = emf.createEntityManager();

      // Noms de toutes les personnes (y compris les sous-classes)
      String texteQuery1 =
              "select p.nom from Personne as p";
      Query query1 = em.createQuery(texteQuery1);
      List<String> listeNoms = query1.getResultList();
      System.out.println("Noms des personnes");
      for (String nom : listeNoms) {
        System.out.println(nom);
      }

      // Noms de tous les clients
      String texteQuery2 =
              "select p.nom from Personne as p where type(p) = Client";
      Query query2 = em.createQuery(texteQuery2);
      List<String> listeNoms2 = (List<String>) query2.getResultList();
      System.out.println("Noms des clients");
      for (String nom : listeNoms2) {
        System.out.println(nom);
      }

      // Evidemment on peut aussi le faire comme ça :
      String texteQuery2Bis =
              "select c.nom from Client as c";
      Query query2Bis = em.createQuery(texteQuery2Bis);
      List<String> listeNoms2Bis = query2Bis.getResultList();
      System.out.println("Noms des clients, version 2");
      for (String nom : listeNoms2Bis) {
        System.out.println(nom);
      }

      // Noms de tous les employés, avec les projets auxquels ils participent
      
      // Jointure externe pour avoir tous les employés, même ceux 
      // qui ne participent à aucun projet.
      // Récupère l'id pour le cas où 2 employés auraient le même nom.
      String texteQuery3 =
              "select e.id, e.nom, particip.projet.nom "
              + "from Employe as e left outer join e.participations as particip "
              + "order by e.id";
      Query query3 = em.createQuery(texteQuery3);
      List<Object[]> listeProjets = query3.getResultList();
      System.out.print("Liste des participation des employés aux projets :");
      int idEmployeCourant = -1;
      for (Object[] infos : listeProjets) {
        int idEmploye = (int)infos[0];
        
        if (idEmployeCourant != idEmploye) {
          String nomEmploye = (String) infos[1];
          // Passe à la ligne
          System.out.println();
          // Affiche le nom
          System.out.print(nomEmploye);
          idEmployeCourant = idEmploye;
        }
        // Affiche le nom du projet s'il n'est pas null
        String nomProjet = (String) infos[2];
        if (nomProjet != null) {
          System.out.print(", " + nomProjet);
        }
      }
    } catch (Exception e) {
      // En "vrai" il faudrait affiner un peu plus...
      e.printStackTrace();
      if (tx != null) {
        tx.rollback();
      }
    } finally {
      if (em != null) {
        em.close();
      }
      if (emf != null) {
        emf.close();
      }
    }
  }
}
