/*
 * CampoMenoraUnaFecha.java
 *
 * Created on 22 de marzo de 2007, 11:28 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
package com.fidufosyga.rules;

import java.text.SimpleDateFormat;
import java.util.Date;

import com.fidufosyga.rules.util.ValidarFecha;
import java.text.ParseException;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Fabio
 */
public class FechaDependienteNoMayorMesOPrimerDiaMesSiguientes extends AbstractRule {

    String DATE_FORMAT = "dd/MM/yyyy";

    SimpleDateFormat sdf;

    public FechaDependienteNoMayorMesOPrimerDiaMesSiguientes() {
        sdf = new SimpleDateFormat(DATE_FORMAT);
        sdf.setLenient(false);
    }

    public boolean performValidation(String field, String registro[], String nombreArchivo) {

        String campoDependiente = (String) getParams()[0];
        String campoDependiente2 = (String) getParams()[2];
        int int_campoDependiente = Integer.parseInt(campoDependiente);
        int int_campoDependiente2 = Integer.parseInt(campoDependiente2);
        String valor = (String) getParams()[1];
        String valor2 = (String) getParams()[3];
        int saltos = Integer.valueOf((String) getParams()[4]);

        if ((registro[int_campoDependiente].equals(valor)) && (registro[int_campoDependiente2].equals(valor2))) {
            Calendar fechaProxima = GregorianCalendar.getInstance();
            Calendar calFin = GregorianCalendar.getInstance();
            calFin.set(calFin.get(Calendar.YEAR), calFin.get(Calendar.MONTH), calFin.getActualMaximum(GregorianCalendar.DAY_OF_MONTH));
            calFin.add(Calendar.MONTH,-1);
            Calendar calIni = GregorianCalendar.getInstance();
            calIni.set(calIni.get(Calendar.YEAR), calIni.get(Calendar.MONTH), calIni.getActualMinimum(GregorianCalendar.DAY_OF_MONTH));
            calIni.add(Calendar.MONTH,1);
            Date fechamaxima = calIni.getTime();
            Date fechaMinima = calFin.getTime();

            if (field.length() == 0 || field.length() != 10) {
                return true;
            }
            if (!ValidarFecha.esFecha(field)) {
                return true;
            } else {
                try {
                    Date dateCampo = sdf.parse(field);
                    if (dateCampo.before(fechamaxima)) {
                        return false;
                    } else {
                        for (int i = 1; i <= saltos; i++) {
                            fechaProxima.set(fechaProxima.get(Calendar.YEAR), fechaProxima.get(Calendar.MONTH) + 1, fechaProxima.getActualMinimum(GregorianCalendar.DAY_OF_MONTH));
                            if (sdf.format(dateCampo).equalsIgnoreCase(sdf.format(fechaProxima.getTime())) ) {
                                return false;
                            }
                        }
                        return true;
                    }
                } catch (ParseException ex) {
                    Logger.getLogger(FechaDependienteNoMayorMesOPrimerDiaMesSiguientes.class.getName()).log(Level.SEVERE, null, ex);
                }
            }

            return false;
        } else {
            return false;
        }

    }
}
