package Controleurs;

import java.util.Calendar;

public class Utilisateur {

	// variable privée
	protected int sexe; // 0 pour un homme et 1 femme
	protected String prenom; 
	protected String nom;
	protected int AnneeNaissance; // l'annee de naissance est à renseigner uniquement
	protected int age;
	protected String mail;
	protected double poids; // en kg
	protected double taille; // en m
	protected int niveauActivite; // l'utilisateur doit saisir son niveau d'activité sur une échelle de 1 à 5
	
	

	/* création d'un utilisateur, il se doit de renseinger : 
	 * son sexe, 
	 * son nom, 
	 * son prénom, 
	 * son année de naissance, 
	 * son adresse mail,
	 * son poids (en kg),
	 * sa taile (en m),
	 * et son niveau d'activité (de 1 à 5)
	*/ 
	
	Utilisateur(int sexe, String prenom, String nom, int AnneeNaissance, String mail, double poids, double taille, int niveauActivite) {	
		
		Calendar c = Calendar. getInstance();
		int year = c. get(Calendar. YEAR);
		this.sexe = sexe;
		this.prenom = prenom;
		this.nom = nom;
		this.AnneeNaissance = AnneeNaissance;
		this.age = year-AnneeNaissance;
		this.mail = mail;
		this.poids = poids;
		
		this.taille = taille;
		this.niveauActivite = niveauActivite;
		
	}
	
	
	
	/* fonction qui calcule l'IMC 
	 * (indice de Masse Corporelle : grandeur qui permet d'estimer la corpulence d’une personne) 
	 * de l'utilisateur 
	*/
	public String calculerIMC() {
		
		// l'IMC se calcule en divisant le poids de l'utilisateur par sa taille au carré
		double IMC = (int) ((int) this.poids/(this.taille*this.taille));
		
		
		int NombreDeSituation = 0;
		
		while (IMC== 0 || IMC > 80) {
			NombreDeSituation = 8;
		 
		}
		
		// Inférieur à 16 Anorexie
		if (IMC< 16) {
			NombreDeSituation = 1;
		}
		// Entre 16.5 et 18.5 Maigreur
		else if (IMC>=16.5 && IMC<18.5) {
			NombreDeSituation = 2;
		}
		// Corpulence normale
		else if (IMC>=18.5 && IMC<25) {
			NombreDeSituation = 3;
		}
		// Surpoids
		else if (IMC>=25 && IMC<30) {
			NombreDeSituation = 4;
		}
		//Obésité modérée (Classe 1) 
		else if (IMC>=30 && IMC<35) {
			NombreDeSituation = 5;
		}
		// Obésité élevé (Classe 2)
		else if (IMC>=35 && IMC<40) {
			NombreDeSituation = 6;
		}
		// Obésité morbide ou massive
		else if (IMC>=40) {
			NombreDeSituation = 7;
		}
		
		String MessageConsequence;
		
		// résultat et conséquence en fonction de l'IMC
		switch (NombreDeSituation) {
        case 1:  MessageConsequence = "Anorexie ou dénutrition";
                 break;
        case 2:  MessageConsequence = "Maigreur";
                 break;
        case 3:  MessageConsequence = "Corpulence normale";
                 break;
        case 4:  MessageConsequence = "Surpoids";
                 break;
        case 5:  MessageConsequence = "Obésité modérée";
                 break;
        case 6:  MessageConsequence = "Obésité élevée";
                 break;
        case 7: MessageConsequence = "Obésité morbide";
                 break;
        default: MessageConsequence = "IMC erreur";
                 
                 
		}
		
		return(IMC+"\nSa consequence : "+MessageConsequence);
	}
	
	
	// calcul du nombre de Kcal par jour en fonction de l'objectif de l'utilisateur
	public double calculKcalAconsommeParJour(double poidsAjoute){
		double res=0;
		if(this.sexe == 0) { 
			// formule développée par Harris et Benedict en 1919 pour un homme
			res = (13.7516*(this.poids+poidsAjoute)) + (500.33*taille)-(6.7550 * this.age) + 66.473;
		}
		
		else {
			// formule développée par Harris et Benedict en 1919 pour une femme
			res = (9.5634*(this.poids+poidsAjoute)) + (184.96*taille)-(4.6756 * this.age) + 655.0955;
		}
		
		/* activité physique réalisée au quotidien 
		 * est à prendre en compte lors 
		 * du calcul des besoins caloriques journaliers*/
		
		// très faible activité physique
		if (this.niveauActivite == 1){
			res = res*1.375;
		}
		// faible activité physique
		else if (this.niveauActivite == 2){
			res =res*1.56;
		}
		// activité physique moyenne 
		else if (this.niveauActivite == 3){
			res = res*1.64;
		}
		// forte ou très forte acitivté physique
		else{
			res = res*1.82;
		}
		
		return res;
	}

	
	// calcul de la dépense d'énergie minimum quotidienne permettant à l'organisme de survivre
	
	public double calculMetabolismeBasal() {
		double res=0;
		if(sexe == 0) {
			// La formule de Harris et Benedict pour un homme
		res = (13.7516*this.poids) + (500.33*this.taille)-(6.7550 * this.age) + 66.473;
		}
		
		else {
			// La formule de Harris et Benedict pour une femme
			res = (9.5634*this.poids)+(184.96*this.taille)-(4.6756*this.age)+655.0955;
		}

		return res;
	}

	// calcul de l'objectif de l'utilisateur
	public double calculerOBJECTIF(String choix, double poidsActuel, double poidsObjectif) {
		
		
		double poidAprendreOuAPerdre=0;
		
		// calcul du poids que l'utilisateur veut perdre ou prendre 
		poidAprendreOuAPerdre = poidsObjectif-poidsActuel;
		
		//System.out.println("Nombre de kilos : " + poidAprendreOuAPerdre);
		return calculKcalAconsommeParJour(poidAprendreOuAPerdre);
		
	}
	

	@Override
	public String toString() {
		return "Utilisateur [sexe=" + sexe + ", prenom=" + prenom + ", nom=" + nom + ", dateDeNaissance="
				+ AnneeNaissance + ", age=" + age + ", mail=" + mail + ", poids=" + poids + ", taille=" + taille
				+ ", niveauActivite=" + niveauActivite + "]";
	}
	
	public static void main(String[] args) {
		Utilisateur Reda = new Utilisateur(0, "Reda", "Haidane", 2000, "reda.haidane@gmail.com", 70.00, 1.78, 3);
		System.out.println(Reda.toString());
		System.out.println();
		System.out.println("CALCUL DE L'IMC de M. " + Reda.nom + " :");
		System.out.println("Votre IMC : " + Reda.calculerIMC());
		System.out.println();
		System.out.println("Nombre de Kcal à consommer par jour : " + Reda.calculerOBJECTIF("gagner", 65, 130) + " Kcal/J");
		System.out.println(" Métabolisme de base : " + Reda.calculMetabolismeBasal() + " Kcal/J");
	}

}


