/**
  * Classe 'DATE' : Gestion de base d'objets 'DATE' (cf. Chap. "Intro. au L.A.O.")
  * @author   (c) ~/2A env.  H. Nguyen-Phu
  * @since     0.9     2005.09.15
  * @version  0.97  2007.10.03  19h38 -  A COMPLETER les méthodes 'estValide',  'jourSemaine' et 'duree' ...
  *@see          date_t
  *@see          datesEgales
   * @see        deuxRef
   * @see         objSansRef 
   *@see          es
   */
public  class DATE  {

// ATTRIBUTS visibles dans le paquet courant (cf.  JDK Java)  :
	int jour; 	// le jour
	int mois;	// le mois
	int annee;	// l'année

//  les CONSTRUCTEURS :
	DATE()  {	jour = 01;  mois = 01;  annee = 1970;	}
	DATE(int j,  int  m,  int a )   {
		jour =j;  mois = m;   annee = a;	}
	DATE(DATE uneDate)    {
		this( uneDate.jour, uneDate.mois, uneDate.annee ); 	}
	DATE(String Date)  {// 'Date' doit être une chaîne selon la convention  "jj/mm/aaaa" !
		jour = Integer.parseInt(Date.substring(0,2));
		mois = Integer.parseInt(Date.substring(3,5));
		annee= Integer.parseInt(Date.substring(6,Date.length()));
	}

// les MODIFIEURS
	/** La procédure 'modifJour'  remplace l'attribut 'jour' */
	  public  void  modifJour(int J)  { jour = J;  }
	/** La procédure 'modifMois'  remplace l'attribut 'mois'  */
	  public void  modifMois(int mois)  { 	this.mois = mois;   }
	/** La procédure 'modifAnnee'  remplace l'attribut 'annee' */
	  public  void  modifAnnee(int A)  { 	annee = A;	 }
	/** La procédure 'setDATE'  remplace les trois attributs ci-dessus  */
	  public  void  setDATE( )  {  
	  // A MODIFIER ci-dessous  p.q. la date soit en accord avec le calendrier grégorien :
			jour = Integer.parseInt(es.LireCh("Donner le jour (1,...,31): "));
			mois = Integer.parseInt(es.LireCh("Donner le mois (1,...,12): "));
			annee= Integer.parseInt(es.LireCh("Donner l'ann\u00e9e ( >= 1582): "));
	}	

// les ACCESSEURS :
	/** La fonction 'accesJour'  renvoie l'attribut 'jour'
	  * @return     un entier 'int' 	  */
	  public  int  accesJour()  { 		return  jour;	 }
	/** La fonction 'accesMois'  renvoie l'attribut 'mois'
	  * @return     un entier 'int'	  */
	  public  int  accesMois()  {  		return  mois;	 }
	/** La fonction 'accesAnnee'  renvoie l'attribut 'annee'
	  * @return     un entier 'int'	  */
	  public  int  accesAnnee()  { 		return  annee;	 }

	  /**  La fonction 'toString' permettra d'afficher la date courante via 'print(..)' selon "jj/mm/aaaa"	  */
	public String toString()  {  
		return  new String("[" + jour + "/" + mois +"/" + annee+ "]"); 	}
		
	/** La fonction  booléenne 'estEgal'  vérifie  l'égalité entre deux dates : 'this' et 'd'
	  * @param    d  est la  date  passée en  mode donnée  'D'  
	  * @return     un booléen  	  */
	public  boolean  estEgal(DATE  d)  {
		return (annee == d.annee   
			&&  mois == d.mois  
			&&  jour == d.jour );  	}
			
	/** La fonction  booléenne 'estVide'  vérifie  si l'objet courant est vide 
	  * @return     un booléen  	  */
	public  boolean  estVide( )   {	return  this == null;	}
	
	/** La fonction  booléenne 'estValide'  vérifie  si la date courante est  valide et  en accord avec le calendrier grégorien tout en tenant compte aussi des années bissextiles ...
	  * @return     un booléen  	  */
	public  boolean  estValide( )   {	// A MODIFIER & COMPLETER en TPP...
		boolean aux = true;
		
		
		
		
		
		return  aux;	
	}
	
	/** La fonction  'estBissextile'  vérifie si l'année  'aa'  est bissextile
	  * @param    aa  année  passée en paramètre donnée  'D'  
	  * @return     un booléen   	  */
	  public  boolean estBissextile(int  aa)  {
		return  ( ( aa % 100 != 0)  ||  ( (aa/100) % 4 == 0 ) ) &&  (aa %4 == 0);  	 }
	/** La fonction 'estBissextile'  vérifie si l'attribut 'annee' de 'this'  est bissextile
	  * @return     un booléen  	  */
	  public  boolean estBissextile()  {
		return  ( ( annee % 100 != 0)  ||  ( (annee/100) % 4 == 0 ) ) &&  (annee %4 == 0);  	 }
	/** La fonction  'jourSemaine' retourne un jour de la semaine parmi {Lu,...,Di} 
	  * @return     une chaîne 'String' 	  */
	  public  String jourSemaine()  {  // A MODIFIER & COMPLETER en TPP...








		return null;
 	  }
	/** La fonction 'precede'  vérifie si la date courante précède D
	  * @return     un booléen  	  */
	  public  boolean precede(DATE  D)  { // A VERFIFER ..
		if ( annee < D.annee)  
			return true;   // A NE PAS OUBLIER: 'else' ci-après ...
		else if ( annee == D.annee && mois < D.mois)   
			return true;
		else if ( annee == D.annee && mois == D.mois && jour < D.jour)   
			return true;
		else if ( this.estEgal(D) )  {
			System.err.println(D + " est \u00e9gale à " + this);
			return false;
		}
		return  false;
	 }

	/**
	  * La fonction 'suit'  vérifie si la date courante succède à D
	  * @return     un booléen  
	  */
	  public  boolean suit(DATE  D)  { 
		return  D.precede(this);
	 }

	/**
	  * La fonction 'duree'  calcule la durée en jours entre deus dates
	  * @return     un entier 'int'
	  */
	  public int duree(DATE  D)  { // A MODIFIER & COMPLETER en TPP...









		return  Integer.MIN_VALUE;
	 }
	/** La procédure 'finalize'  finalise la destruction  par le ramasse-miette 'gc' 
	  * @throws   Throwable	  */
	protected void finalize()  throws Throwable  { 
	// en  (re-)définissant la méthode 'finalize' de la classe 'Object' de Java
		System.err.println("Destruction de l'objet non r\u00e9f\u00e9renc\u00e9: "+ this);
	}
}
