package client.model.problem;

import java.util.ArrayList;


/** <u><b>Explication générale de la classe :</b></u>
 * <P>Cette classe permet de créer un problème.
 *
 * @author Dream Team
 */
public class Probleme {
	
	private static int idGenerator = -1;

    //Déclaration des variables
    private int idProbleme;
    private int dimensionFonction;
    private int idGroup;
    
    private String nomProbleme;
    private String nomFonction;
    private String appelFonction;
    private String libelleFonction;
    private String solutionExacte;
    
    private ArrayList<Derive> vectDerive;
    private ArrayList<Contrainte> vectContraintes;

    /**<u><i>Explication générale du constructeur :</i></u>
     * <P> Constructeur de la classe permettant de créer un objet de type Methode.
     * 
     */
    public Probleme() {
    	vectContraintes = new ArrayList<Contrainte>();
    	vectDerive = new ArrayList<Derive>();
    }

    /**<u><i>Explication générale du constructeur :</i></u>
     * <P> Constructeur de la classe permettant de créer un objet de type Problème.
     * 
	 * @param nomProbleme nom du problème
	 * 
     */
    public Probleme(String nomProbleme) {
        this.idProbleme = ++idGenerator;
        this.nomProbleme = nomProbleme;
        vectContraintes = new ArrayList<Contrainte>();
        vectDerive = new ArrayList<Derive>();
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode retourne l'id du problème.
     * 
     * @return id du problème.
     * 
     */
    public int getIdProbleme() {
        return idProbleme;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet d'assigner un id au problème.
     * 
     * @param idProbleme Id probleme à assigner
     * 
     */
    public void setIdProbleme(int idProbleme) {
        this.idProbleme = idProbleme;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode retourne le nom du problème.
     * 
     * @return nom du problème.
     * 
     */
    public String getNomProbleme() {
        return nomProbleme;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet d'assigner un nom au problème.
     * 
     * @param nomProbleme Id probleme à assigner
     * 
     */
    public void setNomProbleme(String nomProbleme) {
        this.nomProbleme = nomProbleme;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode retourne le nom de la fonction.
     * 
     * @return nom de la fonction.
     * 
     */
	public String getNomFonction() {
		return nomFonction;
	}

	/**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet d'assigner un nom de fonction.
     * 
     * @param nomFonction nom de la fonction
     * 
     */
	public void setNomFonction(String nomFonction) {
		this.nomFonction = nomFonction;
	}
	
	/**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode retourne l'appel de fonction
     * 
     * @return l'appel de fonction.
     * 
     */
	public String getAppelFonction() {
		return appelFonction;
	}

	/**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet d'assigner l'appel de fonction
     * 
     * @param appelFonction nouvel appel de fonction
     * 
     */
	public void setAppelFonction(String appelFonction) {
		this.appelFonction = appelFonction;
	}

	/**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode retourne le libellé de la fonction
     * 
     * @return le libellé de la fonction.
     * 
     */
	public String getLibelleFonction() {
		return libelleFonction;
	}

	/**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet d'assigner un libellé de fonction
     * 
     * @param libelleFonction libellé de fonction
     * 
     */
	public void setLibelleFonction(String libelleFonction) {
		this.libelleFonction = libelleFonction;
	}

	/**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode retourne la dimension de la fonction
     * 
     * @return dimension de la fonction.
     * 
     */
	public int getDimensionFonction() {
		return dimensionFonction;
	}

	/**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet d'assigner une dimension de la fonction
     * 
     * @param dimensionFonction nouvel dimension de la fonction
     * 
     */
	public void setDimensionFonction(int dimensionFonction) {
		this.dimensionFonction = dimensionFonction;
	}

	/**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode retourne la référence de l'array des contraintes
     * 
     * @return l'array des contraintes
     * 
     */
	public ArrayList<Contrainte> getVectContraintes() {
		return vectContraintes;
	}

	/**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet d'assigner une nouvelle référence à l'array des contraintes
     * 
     * @param vectContraintes nouvelle référence à l'array des contraintes
     * 
     */
	public void setVectContraintes(ArrayList<Contrainte> vectContraintes) {
		this.vectContraintes = vectContraintes;
	}
	
	/**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet d'ajouter une contrainte
     * 
     * @param c contrainte à rajouter
     * 
     */
	public void addContraintes(Contrainte c){
		vectContraintes.add(c);
	}

	/**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode retourne la contrainte à l'indice i
     * 
     * @param i indice
     * 
     * @return contrainte recherchée
     * 
     */
	public Contrainte getContraintes(int i){
		return vectContraintes.get(i);
	}
	
	/**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de supprier une contrainte à un indice i
     * 
     * @param i indice
     * 
     */
	public void removeContraintes(int i){
		vectContraintes.remove(i);
	}
	
	/**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode retourne l'id du groupe
     *
     * @return l'array des contraintes
     * 
     */
	public int getIdGroup() {
		return idGroup;
	}

	/**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet d'assigner un nouvel id d'un groupe
     * 
     * @param idGroup nouvel id du groupe
     * 
     */
	public void setIdGroup(int idGroup) {
		this.idGroup = idGroup;
	}

	/**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode retourne la solution exacte
     * 
     * @return la solution exacte
     * 
     */
	public String getSolutionExacte() {
		return solutionExacte;
	}

	/**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet d'assigner une nouvelle solution exacte
     * 
     * @param solutionExacte nouvelle solution exacte
     * 
     */
	public void setSolutionExacte(String solutionExacte) {
		this.solutionExacte = solutionExacte;
	}

	/**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode retourne une référence à l'array derivée
     * 
     * @return l'array derivée
     * 
     */
	public ArrayList<Derive> getDeriveeOrdreUn() {
		return vectDerive;
	}

	/**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet d'assigner une nouvelle référence à l'array de la dérivée
     * 
     * @param deriveeOrdreUn nouvelle référence à l'array de la dérivée
     * 
     */
	public void setDeriveeOrdreUn(ArrayList<Derive> deriveeOrdreUn) {
		this.vectDerive = deriveeOrdreUn;
	}
	
	/**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet d'ajouter une dérivée
     * 
     * @param d dérivée à ajouter
     * 
     */
	public void addDerive(Derive d){
		vectDerive.add(d);
	}

	/**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode retourne une dérivée à l'indice i
     * 
     * @param i indice
     * 
     * @return la dérivée
     * 
     */
	public Derive getDerive(int i){
		return vectDerive.get(i);
	}
	
	/**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de supprimer une dérivée à l'indice i
     * 
     * @param i indice à supprimer
     * 
     */
	public void removeDerive(int i){
		vectDerive.remove(i);
	}

	/**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode affiche les informations du problème
     * 
     * @return String contenant les informations
     * 
     */
	public String toString(){
		return "nomProbleme : "+nomProbleme+"; nomFonction : "+nomFonction+"; appelFonction : "+appelFonction
		+"; dimension : "+dimensionFonction+"; contraintes : "+vectContraintes.size()+"; solutionExacte : "+solutionExacte+ (vectDerive.size() > 0  ? "; derivee 1 : "+vectDerive.get(0).getTabParameters().toString() : "no derivee");
	}
	
}