package esercitazioni.calendario;
/**
 * Questa classe si propone di gestire attravarso l'uso di array
 * i giorni dei mesi di un modello di calendario.
 */
public class Calendario {
    /**
     * array contenete nei propri elementi il numero di giorni
     * di ciascun mese
     */
     private int[] giorni_mesi={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    /**
     * array contenente nei propri elementi il nome di ciascun mese
     */
     private String[] mesi={
        "", "Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio"
        , "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre"
        , "Novembre", "Dicembre"
    };
    /**
     * array contenente nei propri elementi il nome di ciascun giorno della
     * settimana
     */
     private String[] giorni_settimana={
        "", "Luned", "Marted", "Mecoled", "Gioved"
        , "Venerd", "Sabato", "Domenica"
    };
    /**
     * array contenente nei propri elementi il nome di ciascun giorno della
     * settimana
     */
     private String[] sigle_g_s={
        "", "Lun", "Mar", "Mer", "Gio"
        , "Ven", "Sab", "Dom"
    };
    /**
     * anno cui  inizializzato il calendario
     */
     private int anno;
     /**
      * mese corrente
      */
      private int mese;
      /**
       * giorno corrente
       */
       private int giorno;
     /**
     * costruttore dove viene inizializzato l'anno ed nome del giorno
     * della settimana del primo giorno dell'anno (es. 1 per luned)
     */
    public Calendario(int a) {
        //inizializza l'anno del calendario
        anno=a;
        //test per anno bisestile
        testBisestile();
        //imposta il mese di default a gennaio
        setMese(1);
        //imposta il giorno di default a 1: NB questo valore deve
        //sempre essere impostato dopo avere testato se l'anno  bisestile
        setGiorno(1);
    }
    /**
     * determina se l'anno  bisestile, nel qual caso corregge il valore
     * dei giorni del mese di febbraio
     */
    private boolean testBisestile(){
        if((anno % 4)==0){
            //anno bisestile
            giorni_mesi[2]=29;
            return true;
        }
        return false;
    }
    /**
     * ritorna la data in una stringa con il formato gg/mm/aaaa
     */
     public String getData(){
            String gg, mm;
            if(getGiorno()<10)
                gg="0"+getGiorno();
            else
                gg=""+getGiorno();
            //
            if(getMese()<10)
                gg="0"+getMese();
            else
                gg=""+getMese();
            return gg+"/"+mm+"/"+getAnno();
     }
     /**
      * ritorna l'anno cui il calendario fa riferimento
      */
      public int getAnno(){
             return anno;
      }
     /**
      * ritorna il mese corrente
      */
      public int getMese(){
             return mese;
      }
      /**
       * ritorna il giorno corrente
       */
       public int getGiorno(){
              return giorno;
       }
       /**
        * imposta il mese corrente eseguendo un test
         * sul valore del numero di mese valutando che sia congruo
        */
        public void setMese(int m){
               if( (m>0)&&(m<=12) ){
                   mese=m;
                }else{
                   //MESE NON VALIDO imposta a gennaio
                   mese=1;
                }
        }
       /**
        * imposta il giorno corrente con test di congruit
        */
        public void setGiorno(int g){
               if( (g>0)&&(g<=giorni_mesi[getMese()]) ){
                   giorno=g;
                }else{
                   //giorno NON VALIDO imposta a 1
                   giorno=1;
                }
        }
        /**
         * stampa il mese visualizzando una lista di 7 numeri per ciascuna
         * riga e anteponendo e posticipando un asterisco se in quest mese
         * cade il giorno correntemente impostato.
         * Si sfruttano i metodi print e println per stampare sulla stessa
         * riga o per ricominciare dalla successiva
         */
          public void stampaMese(int m){
                 int mesedistampa=m-1;
                //Stampa il nome del mese convertendolo in maiuscolo
                System.out.println(mesi[mesedistampa].toUpperCase());
                //giorni del mese corrente
                int gm=giorni_mesi[mesedistampa];
                //loop di stampa
                String g;
                for(int i=0; i<gm; i++){
                    //test se sta stampando il giorno corrente
                    if(
                       ((i+1)==getGiorno())&&
                       (m==getMese())
                    )
                        g="*"+(i+1)+"*";
                    else
                        g=" "+(i+1)+" ";
                    //per permettere un giusto incolonnamento viene testato
                    //se stiamo stampando un numero a due cifre:
                    //in caso contrario aggiungiamo un ulteriore spazio davanti
                    //alla stringa
                    if((i+1)<10)
                        g=" "+g;
                    if(((i+1) % 7)==0){
                        //inizia una nuova riga
                        System.out.println(g);
                    }
                    else{
                        System.out.print(g);
                    }
                }
                //stampa una riga vuota alla fine
                System.out.println();
          }
         /**
          * come il metodo precedente, ma l'overloading consente
          * di stampare il mese corrente
          */
         public void stampaMese(){
                stampaMese(getMese());
         }
}