
package gestioneventosfecha;

import java.util.ArrayList;
import java.util.List;

public class Fecha {
    
      private String fecha;
      private List<EventoFechaListener> listaListeners = new ArrayList();

    public Fecha(String fecha) {
        this.fecha = fecha;
    }
    
    public String getFecha() {
        return fecha;
    }

    public void setFecha(String fecha) {
        this.fecha = fecha;
    }

    public void filtrarFecha() { 
              
      int codigoError = 0;      
      int dia = 0; 
      int mes = 0;
      int año = 0;

      if (fecha.length() == 10  &&  fecha.charAt(2) == '-'  &&  fecha.charAt(5) == '-')
      {   
        try {  
              dia = Integer.parseInt(fecha.substring(0, 2));
              mes = Integer.parseInt(fecha.substring(3, 5));          
              año = Integer.parseInt(fecha.substring(6, fecha.length()));
            } catch (NumberFormatException excepcion)
              { codigoError = codigoError | 1; }             // dígito no numérico en fecha
      }
      else
      {   
          codigoError = codigoError | 1;                     // formato fecha erróneo
      }
        
      if (codigoError == 0)
      {
         if (Integer.toString(año).length() != 4)            // año erróneo
             codigoError = codigoError | 2;    
         
         if (mes < 1 || mes > 12)                            // mes erróneo
             codigoError = codigoError | 4;
          
         if (dia < 1 || dia > getDiaMaximoMes(mes, año))     // dia erróneo
             codigoError = codigoError | 8;
      }     
        System.out.println("codigo error fecha "+codigoError);           
      if (codigoError > 0)
         fireEventoFecha(codigoError);          
    }

    
    private 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 void addEventoFechaListener(EventoFechaListener eventoFechaListener) {
        listaListeners.add(eventoFechaListener);    
    }
    
    
    public void removeEventoFechaListener(EventoFechaListener eventoFechaListener) {
        listaListeners.remove(eventoFechaListener);    
    }   
    
    
    private void fireEventoFecha(int codigoError) {
        
        for (int i=0; i<listaListeners.size(); i++) {
            listaListeners.get(i).actionPerformed(new EventoFecha(this, 1, "fechaIncorrecta", codigoError));      
        }   
    }
}
