package fr.iutfbleau.projetIHM2022FI2.MP;
import fr.iutfbleau.projetIHM2022FI2.API.*;
import java.util.*;
/**
 * Une demande de changement de groupe
 * concerne un étudiant, qui est dans un groupe A et veut aller dans un groupe B.
 * 
 * Implémentation non persistante fournie avec l'API.
 */

public class ChangementNP implements Changement {

    //auto-incrément des changements
    private static int nextId=0;
		// id du changement
    private int id;
		// groupe d'origine et d'arrivée
    private Groupe a,b;
		// étudiant concerné
    private Etudiant e;
		// raison de la demande
    private String raison;
		/**
		 * Constructeur d'un changement.
		 * @param a le groupe de départ
		 * @param b le groupe d'arrivée
		 * @param e l'étudiant demandant le changement
		 * @param raison la raison du changement
		 */
    public ChangementNP(Groupe a, Etudiant e, Groupe b){
        Objects.requireNonNull(a,"On ne peut pas créer un changement avec un groupe à quitter null");
        Objects.requireNonNull(b,"On ne peut pas créer un changement avec un groupe à rejoindre null");
        Objects.requireNonNull(e,"On ne peut pas créer un changement concernant un étudiant null");
        this.raison=null;
        this.id=++this.nextId;
        this.a=a;
        this.b=b;
        this.e=e;
    }
		/**
		 * Constructeur d'un changement.
		 * @param a le groupe de départ
		 * @param b le groupe d'arrivée
		 * @param e l'étudiant demandant le changement
		 * @param raison la raison du changement
		 * 
		 */
    public ChangementNP(Groupe a, Etudiant e, Groupe b, String raison){
        Objects.requireNonNull(a,"On ne peut pas créer un changement avec un groupe à quitter null");
        Objects.requireNonNull(b,"On ne peut pas créer un changement avec un groupe à rejoindre null");
        Objects.requireNonNull(e,"On ne peut pas créer un changement concernant un étudiant null");
        this.raison=raison;
        this.id=++this.nextId;
        this.a=a;
        this.b=b;
        this.e=e;
    }
		/**
		 * Constructeur d'un changement.
		 * @param a le groupe de départ
		 * @param b le groupe d'arrivée
		 * @param e l'étudiant demandant le changement
		 * @param id l'id du changement
		 * 
		 */
    public ChangementNP(Groupe a, Etudiant e, Groupe b, int id){
        Objects.requireNonNull(a,"On ne peut pas créer un changement avec un groupe à quitter null");
        Objects.requireNonNull(b,"On ne peut pas créer un changement avec un groupe à rejoindre null");
        Objects.requireNonNull(e,"On ne peut pas créer un changement concernant un étudiant null");

        this.id=id;
        this.a=a;
        this.b=b;
        this.e=e;
        if(this.id>this.nextId){
            this.nextId=this.id;
        }
    }
		/**
		 * Constructeur d'un changement.
		 * @param a le groupe de départ
		 * @param b le groupe d'arrivée
		 * @param e l'étudiant demandant le changement
		 * @param id l'id du changement
		 * @param raison la raison du changement
		 * 
		 */
    public ChangementNP(Groupe a, Etudiant e, Groupe b, int id, String raison){
        Objects.requireNonNull(a,"On ne peut pas créer un changement avec un groupe à quitter null");
        Objects.requireNonNull(b,"On ne peut pas créer un changement avec un groupe à rejoindre null");
        Objects.requireNonNull(e,"On ne peut pas créer un changement concernant un étudiant null");
        this.raison=raison;
        this.id=id;
        this.a=a;
        this.b=b;
        this.e=e;
        if(this.id>this.nextId){
            this.nextId=this.id;
        }
    }
    
    /**
     * permet de récupérer l'identifiant du changement (référence interne sans intérêt irl).
     * @return l'identifiant.
     */
    public int getId(){
        return this.id;
    }

    /**
     * permet de récupérer le groupe de depart
     * @return ce groupe.
     */
    public Groupe getA(){
        return this.a;
    }

    /** e
     * @return ce groupe.
     */
    public Groupe getB(){
        return this.b;
    }

    /**
     * permet de récupérer l'étudiant demandant le changement
     * @return cet étudiant
     */
    public Etudiant getEtu(){
        return this.e;
    }
		/**	
		 * permet de récupérer la raison du changement
		 * @return la raison du changement
		 */
    @Override
    public String getRaison() {
        return this.raison;
    }

}
