
package ejemplofecha;

import java.sql.Date;

public class Fecha {

       private int dia;
       private int mes;
       private int año;

    public void setFecha(int dia, int mes, int año) throws FechaExcepcion {
       this.dia = dia ;
       this.mes = mes;
       this.año = año;
       filtrarFecha();
    }

    public int getDia() {
        return dia;
    }

    public void setDia(int dia) throws FechaExcepcion {
        this.dia = dia;
        filtrarFecha();
    }

    public int getMes() {
        return mes;
    }

    public void setMes(int mes) throws FechaExcepcion {
        this.mes = mes;
        filtrarFecha();
    }

    public int getAño() {
        return año;
    }

    public void setAño(int año) throws FechaExcepcion {
        this.año = año;
        filtrarFecha();
    }
    
    
    private void filtrarFecha() throws FechaExcepcion {
       int codigoError = 0;

      if (Integer.toString(año).length() != 4)           // año erróneo
          codigoError++;
      
      if (mes < 1 || mes > 12)                            // mes erróneo
          codigoError+=10;
          
      if (dia < 1 || dia > getDiaMaximoMes(mes, año))    // dia erróneo
              codigoError+=100 ;
            
      if (codigoError > 0)
          throw new FechaExcepcion(codigoError); 
    }    
    

    public static void filtrarFecha(String cadenaFecha) throws FechaExcepcion, ConversionNumeroExcepcion { 
       
      int codigoError = 0;      
      int dia = 0; 
      int mes = 0;
      int año = 0;

      if (cadenaFecha.length() > 4)
      {   dia = Entero.convertirCadenaNumero(cadenaFecha.substring(0,2));
          mes = Entero.convertirCadenaNumero(cadenaFecha.substring(2,4));
          año = Entero.convertirCadenaNumero(cadenaFecha.substring(4,cadenaFecha.length()));
      }
      else
      {   
          codigoError+=1000;                                    // formato fecha erróneo
      }
        
      if (codigoError == 0)
      {
         if (Integer.toString(año).length() != 4)           // año erróneo
             codigoError++;    
         
         if (mes < 1 || mes > 12)                            // mes erróneo
             codigoError+=10;
          
         if (dia < 1 || dia > getDiaMaximoMes(mes, año))    // dia erróneo
             codigoError+=100 ;
      }     
            
      if (codigoError > 0)
          throw new FechaExcepcion(codigoError);           
    }

    
    private static int getDiaMaximoMes(int mes, int año) { 
        int diaMaximoMes = 31;

        switch(mes)
        {  case 1:
           case 3:
           case 5:
           case 7:
           case 8:
           case 10:
           case 12: diaMaximoMes = 31;
                    break;
           case 4:
           case 6:
           case 9:
           case 11: diaMaximoMes = 30;
                    break;
           case 2: if (((año % 4 == 0) && !(año % 100 == 0)) || (año % 400 == 0))
                       diaMaximoMes = 29;
                     else
                       diaMaximoMes = 28;
                   break;
        }

       return diaMaximoMes; 
    }
    
    
    public Date getJavaSQLDate() {       
        return Date.valueOf(String.format("%04d", año) + "-" + String.format("%02d", mes) + "-" + String.format("%02d", dia));
    }
}
