import java.util.Date;
import java.util.Scanner;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Hashtable;
import java.text.ParseException;



//class principale 
public class Main {

	public Main() {}
	
	
//class pour récupérer la saisie de l'util
 static class Enter {
		
		public String ar="";
		public Date date_day=null;
		public Date[] date_dayPlus =new Date[6];
		 Enter() {
		}
		
		//méthode saisie article 
	public String Enter_article()
		{
			System.out.println("Tapez votre article (par exemple lait,tomate....)");
			Scanner article=new Scanner(System.in);
		     ar=article.next();
		     return ar;
		}
		
		//méthode saisie date 
	public Date Enter_date()
		{
			Date datev = null;
			SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yy");
			Scanner date=new Scanner(System.in);
			int drap=1;
			while(drap==1)
			{
				formatter.setLenient(false);
			    System.out.println("Tapez sa date de peremption sous forme dd/MM/yy :");
			    
			    String d=date.next();
			     
				Date debut20emeSiecle = new GregorianCalendar(2000,1,1).getTime();
			    formatter.set2DigitYearStart(debut20emeSiecle);
			    
				try {
					datev = formatter.parse(d);
					drap=0;
				} catch (ParseException e) {	
					System.out.println("error");
					date.nextLine();
				}
			}
		return datev;
		}

	//méthode pour convertir la date en String 
	public String date_to_string(Date d)
		{
			String d_s;
			SimpleDateFormat f = new SimpleDateFormat("dd/MM/yyyy");
			d_s=f.format(d);
			return d_s;
		}
		
	//méthode pour ajouter des jours pour la date d'aujrd
	public String[] date_dayPlus3() 
		{
			String[] date_enter=new String[6];
			Calendar calendar[]=new Calendar[6];
			SimpleDateFormat format = new SimpleDateFormat("dd/MM/y");
			for (int i = 1; i <= 5; i++) {
				calendar[i] = Calendar.getInstance();
				calendar[i].add(Calendar.DATE, i);
				date_enter[i]=format.format(calendar[i].getTime());
				try {
					date_dayPlus[i]=format.parse(date_enter[i]);
				} catch (ParseException e) {
					System.out.println("error");
				}
			}	
		return date_enter;
		}
		
	//méthode de la date d'aujrd
	public void date_day() {
			Calendar calendar = Calendar.getInstance();
			SimpleDateFormat format = new SimpleDateFormat("dd/MM/y");
			String date_enter=format.format(calendar.getTime());
			try {
				date_day=format.parse(date_enter);
			} catch (ParseException e) {
				System.out.println("error");
			}
		}
		
	//méthode pour la comparaison des dates 
	public void compare_date(Date d_exp)
		{   
			if(d_exp.compareTo(date_dayPlus[1])==0)
				System.out.println("le produit expire dans 1 jour");
			if(d_exp.compareTo(date_dayPlus[2])==0)
				System.out.println("le produit expire dans 2 jours");
			 if(d_exp.compareTo(date_dayPlus[3])==0)
				System.out.println("le produit expire dans 3 jours");
			 if(d_exp.compareTo(date_dayPlus[4])==0)
				System.out.println("le produit expire dans 4 jours");
			 if(d_exp.compareTo(date_dayPlus[5])==0)
				System.out.println("le produit expire dans 5 jours");
			else if(d_exp.compareTo(date_day)==0)
				System.out.println("le produit expire aujourd'hui ");
			else if (d_exp.compareTo(date_day)<0)
				System.out.println("le produit est déjà expiré");
			else if (d_exp.compareTo(date_dayPlus[5])>0)
				System.out.println("Vous avez plus de 5 jours pour le consommer");
		}
				
	}




//class pour stocker les articles et les dates dans une hashtable 
	 static class Article {
		
		Article() {}
		
		public  Hashtable<String, Date> ht = new Hashtable<String, Date>();
		public  ArrayList<String> liste_article=new ArrayList<String>();
		
		//méthode pour stock
		public Hashtable<String, Date> stock_ar_date(String ar,Date d1)
		{
			ht.put(ar,d1);	
			liste_article.add(ar);
			return ht;
		}
		
	}

	
//méthode pour le nombre d'article 
public int nmbr_articles()
	{ 
		int nmbr=0;
		System.out.println("Combien d'articles avez-vous besoin d'enregistrer? ");
		Scanner sc=new Scanner(System.in);
		while (true)
		{
			try {
			 nmbr =sc.nextInt();
			 break;
			} catch (java.util.InputMismatchException e) {
				System.out.println("erreur recommencer");
				sc.nextLine(); //clears the buffer	
			}
		}
	return nmbr; 
	}

		
//méthode pour le choix de l'opération
private int choix()
	{
	int ch = 0;
	int drap=1;
	Scanner sc1=new Scanner(System.in);
	while (drap==1)
		{
		try {
			 ch =sc1.nextInt();
			if(ch==1 || ch==2 || ch==3 || ch==4) 
			drap=0;
				 
			else if (ch>5){
				System.out.println("erreur recommencez");
				 }
				 break;
				} catch (java.util.InputMismatchException e) {
					System.out.println("erreur recommencez");
					sc1.nextLine(); //clears the buffer	
				}
			}
	return ch;
		}
				
public static void main(String[] args) { 
	Main m=new Main();
	Enter d =new Enter();
	Article ar=new Article();
	d.date_dayPlus3();
	d.date_day();
		
	System.out.println("\t\t\t********* Bienvenue sur Perim'app ********* ");	
		while(true)
		{
			System.out.println(" \n\n\t--> Tapez '1' pour enregistrer un article \n"
					+ " \t--> Tapez '2' pour afficher la liste d'article \n"
					+ " \t--> Tapez '3' pour supprimer un article\n "
					+ "\t--> Tapez '4' pour Exit  ");
			int ch=m.choix();
			switch (ch) {
			case 1:
				int i=0;
				int nmb=m.nmbr_articles();
				while(i<nmb) 
				{
				String ar1=d.Enter_article();
				Date d1=d.Enter_date();
				ar.stock_ar_date(ar1,d1 );
				i++;
				}
				System.out.println("Les articles sont bien enregistrer");
				break;
				case 2:
					if (ar.liste_article.size()==0)
						System.out.println("****** La liste est vide ****** \n\n");
					for(String elem: ar.liste_article)
					{
						 System.out.print(elem);
						 String s=d.date_to_string(ar.ht.get(elem));
						 System.out.print("  ----> date de peremption : " + s+" ----> ");
						 d.compare_date(ar.ht.get(elem));	 
					}
					break;
				case 3 :
					Scanner sc2=new Scanner(System.in);	
					String s = null;
					while(true)
					{ System.out.println("--> Tapez l'article que vous souhaitez supprimer ");
						try {
							s=sc2.next();
							
						} catch (java.lang.NullPointerException e) {
							sc2.nextLine();
						}
						
					if(ar.liste_article.contains(s))
						{
						ar.liste_article.remove(s);
						ar.ht.remove(s,ar.ht.get(s));
						System.out.println("L'article "+ s +" a été supprimer avec succès");
						break;
						}
					else {
						System.out.println("L'article n'existe pas");
						continue;
						}
					}									
					break;
				
					
				case 4:
					System.out.println("Au revoir ^^");
					System.exit(0);
					break;
					
			default:
				break;
			}
		}
				
	}
}
