package fr.iutfbleau.projetIHM2022FI2.API;

import java.util.Set;
import javax.swing.JFrame;
/**
 * Le Model de L'IHM
 */
public interface Model {
/**
 * Fonction pour refresh/changer de groupe d'affichage
 * @param g le groupe a afficher
 */
public void showGroupe(Groupe g);
  /**
   * getteur de la fenetre
   * @return JFrame la fenetre
   */
  public JFrame getFenetre();
  /**
	 * permet d'obtenir l'ensemble des etudiants
	 * @return
	 */
  public Set<Etudiant> getEtudiant();

   // ***********************
  // FONCTION POUR SUPRIMER UN ETUDIANT
  // ***********************
/**
 * Fonction pour supprimer un etudiant.
 * @param e l'etudiant a supprimer
 * @return boolean true si l'etudiant a ete supprimer, false sinon
 */
  public boolean deleteEtu(Etudiant e);


  // ***********************
  // FONCTION POUR Ajouter UN ETUDIANT
  // ***********************
  
  /**
   * Fonction pour ajouter un étudiant au groupe
   * @param g
   * @param e
   * @return boolean pour savoir si il a pus être ajouter
   */
  public boolean addEtudiant(Groupe g, Etudiant e);



  // ***********************
  // FONCTION POUR SUPRIMER UN GROUPE
  // ***********************

  /**
   * Fonction pour supprimer un groupe
   * @param g le groupe a supprimer
   */
  public void delete(Groupe g);

  // ***********************
  // FONCTION POUR RENOMER UN GROUPE
  // ***********************

   /**
   * Fonction pour renomer un groupe
   * @param name
   * @param g
   */
  public void rename(String name, Groupe g);


  // **********************
  // FONCTION POUR CREER UN GROUPE
  // **********************


  /**
   * Fonction permetant de créer une partition d'un groupe
   * @param g le groupe a partitionner
   * @param n le nombre de partition
   * @param name le nom des partition
   */
  public void partition(Groupe g, int n, String name);

  /**
   * Fonction permettant de créer un sous-groupe d'un groupe
   * @param g le groupe parent
   * @param name le nom du sous-groupe
   * @param min le nombre min d'etudiant
   * @param max le nombre max d'etudiant
   * @param ajout la liste des étudiants a ajouter au groupe
   */
  public void free(Groupe g, String name, int min, int max, Set<Etudiant> ajout);

  /**
   * ajoute une nouvelle promotion
   * @param min le nombre min
   * @param max le nombre max
   * @param name le nom
   * @param ajout les etudiant a ajouter a la promo
   */
  public void addPromo(int min, int max, String name, Set<Etudiant> ajout);

  // **************************
  // FONCTION POUR LES CHANGEMENTS
  // ******************************

  /**
   * Créer un changement depuis le groupe courant
   * @param e l'etudiant
   * @param b le groupe a changer
   */
  public void changeGroupe(Etudiant e, Groupe b);

    /**
     * Retourn les groupe auquel on  peut demander a changer depuis le groupe courant
     *
     * @return la liste des groupes
     */
  public Set<Groupe> getGroupePartition();

  /**
   * Fonction pour afficher une fenetre listnatn les changements
   * 
   */
  public void listChange();


  /**
   * Fonction pour effectuer un changement
   * @param Changement le changement a effecteur
   */
  public void change(Changement change);

  /**
   * Fonction supprimant un changement
   * 
   * @param to_delete la changement a delete
   */
  public void deleteChange(Changement to_delete);


  /**
   * Fonction affichant les raison d'un changement
   * 
   * @param change le changement
   */
  public void showRaisonChange(Changement change);


  /**
   * Fonction affichant une fentre pour trouver un etudiant et tous ses groupes asociée
   */
  public void findEtu();

  /**
   * Fonction pour recuperer les etudiant avec ce nom
   * @param name le nom de(s) etudiants
   * @return la liste
   */
  public Set<Etudiant> getEtu(String name);

  /**
   *affiche les groupe d'un etudiant
   * @param e l'etudiant
   */
  public void showGroupOfEtudiant(Etudiant e);
}
