/*
 * TiposIdentificacionVSEdadDependienteASMS.java
 *
 * Created on 24 de marzo de 2007, 06:15 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

/*
 * TiposDocumentoVSEdadDependiente.java
 *
 * Created on 24 de marzo de 2007, 05:16 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.Calendar;
import java.util.Date;

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

// "9,N01,11,12,13"
/**
 * 
 * @author jlozanop
 */
public class TiposIdentificacionVSEdadDependienteASMS extends AbstractRule {

	String DATE_FORMAT = "dd/MM/yyyy";

	SimpleDateFormat sdf;

	Date fechaActual;

	public TiposIdentificacionVSEdadDependienteASMS() {
		sdf = new SimpleDateFormat(DATE_FORMAT);
		sdf.setLenient(false);
		fechaActual = Calendar.getInstance().getTime();
	}

	public boolean performValidation(String field, String registro[],
			String nombreArchivo) {
		String codigoNovedad = registro[new Integer((String) getParams()[0])
				.intValue()];
		Date fechaNacimiento = null;

		if (codigoNovedad.equals((String) getParams()[1])) {
			String tipoDoc = field;
			String numDocumento = registro[new Integer((String) getParams()[3])
					.intValue()];
			String nacimientoString = registro[new Integer(
					(String) getParams()[4]).intValue()];
		       //trae el tipo doc de la novedad
                        String campoTipoDoc = (String) (getParams()[5]);
                       int tipoDocN = Integer.parseInt(campoTipoDoc);
                       String TipoDocNov = registro[tipoDocN];
                       
                       if (!ValidarFecha.esFecha(nacimientoString))
				return false;

			try {
				fechaNacimiento = sdf.parse(nacimientoString);
			} catch (Exception e) {
				return false;
			}

			if (fechaNacimiento.after(fechaActual)) {
				return false;
			}

                            if (tipoDoc.equals("MS")) {
				Object[] params = new Object[3];
				params[0] = getParams()[2]; // campo que tiene el tipo documento
				params[1] = tipoDoc;
				params[2] = "^[0-9]{5}[AIDP]{1}[0-9]{4}$";
				String fieldRegla = registro[new Integer(
						(String) getParams()[3]).intValue()];
				NoCoincideExpresionRegularsegunOtroCampo regla = new NoCoincideExpresionRegularsegunOtroCampo();
				regla.setParams(params);
				boolean retorno = regla.performValidation(fieldRegla, registro,
						nombreArchivo);
				if (retorno == false) {
					long dias = ObtenerDiasEntreFechas.calcular(
							fechaNacimiento, fechaActual);
					if (dias > 6480) {
						return true;
					}

				}
				params[0] = getParams()[2]; // campo que tiene el tipo documento
				params[1] = tipoDoc;
				params[2] = "^[0-9]{5}[AIDP]{1}[0-9]{4}$";
				fieldRegla = numDocumento;
				regla.setParams(params);
				retorno = regla.performValidation(fieldRegla, registro,
						nombreArchivo);
				if (retorno == false) {
					double annos = Math.floor(ObtenerDiasEntreFechas.calcular(
							fechaNacimiento, fechaActual) / 365.25);
					if (annos > 18) {
						return true;
					}

				}
                                

			}

			if (tipoDoc.equals("AS")) {
				Object[] params = new Object[3];
				params[0] = getParams()[2]; // campo que tiene el tipo documento
				params[1] = tipoDoc;
				params[2] = "^[0-9]{5}[ASIDP]{1}[0-9]{4}$";
				String fieldRegla = registro[new Integer(
						(String) getParams()[3]).intValue()];
				NoCoincideExpresionRegularsegunOtroCampo regla = new NoCoincideExpresionRegularsegunOtroCampo();
				regla.setParams(params);
				boolean retorno = regla.performValidation(fieldRegla, registro,
						nombreArchivo);
				if (retorno == false) {
					double annos = Math.floor(ObtenerDiasEntreFechas.calcular(
							fechaNacimiento, fechaActual) / 365.25);
					if (annos < 18) {
						return true;
					}

				}

			}
//"11,N01,13,14,15"
			if (tipoDoc.equals("RC") || tipoDoc.equals("TI")) {
                            try {
                                Object[] params = new Object[3];
                                params[0] = getParams()[2]; // campo que tiene el tipo documento
                                params[1] = tipoDoc;
                                params[2] = "^([0-9A-Z]{3}[0-9]{7})|([0-9]{10,11})$";
                                String fieldRegla = registro[new Integer(
                                        (String) getParams()[3]).intValue()];
                                NoCoincideExpresionRegularsegunOtroCampo regla = new NoCoincideExpresionRegularsegunOtroCampo();
                                regla.setParams(params);
                                Date  fecNovedad = sdf.parse(registro[12].toString());
                                boolean retorno = regla.performValidation(fieldRegla, registro,
                                        nombreArchivo);
                                if (retorno == false) {
                                    double annos = 0.0;
                                    if(registro[11].toString().endsWith("N01")){
                                         annos = Math.floor(ObtenerDiasEntreFechas.calcular(
                                            fechaNacimiento, fecNovedad) / 365.25);
                                    }else{
                                        annos = Math.floor(ObtenerDiasEntreFechas.calcular(
                                            fechaNacimiento, fechaActual) / 365.25);
                                    }
                                    
                                    if (annos > 7 && tipoDoc.equals("RC") && !TipoDocNov.equals("AS") && !TipoDocNov.equals("MS")) {//Ticket #8261 21122023
                                        return true;
                                    }
                                    if ((annos > 19 || annos < 7) && tipoDoc.equals("TI")&& !TipoDocNov.equals("AS") && !TipoDocNov.equals("MS")) {//Ticket #8261 21122023
                                        return true;
                                    }
                                     if (tipoDoc.equals("RC,TI") && TipoDocNov.equals("AS") && TipoDocNov.equals("MS")) {//Ticket #8261 21122023
                                        return false;
                                    }
                                }
                            } catch (ParseException ex) {
                                Logger.getLogger(TiposIdentificacionVSEdadDependienteASMS.class.getName()).log(Level.SEVERE, null, ex);
                            }

			}

			String limite1 = null;
			String limite2 = null;

			if (tipoDoc.equals("CC") || tipoDoc.equals("CE")) {
				if (tipoDoc.equals("CC")) {
					limite1 = "3";
					limite2 = "10";
				} else if (tipoDoc.equals("CE")) {
					limite1 = "3";
					limite2 = "6";
				}
				Object[] params = new Object[4];
				params[0] = getParams()[2]; // campo que tiene el tipo documento
				params[1] = tipoDoc;
				params[2] = limite1;
				params[3] = limite2;
				String fieldRegla = registro[new Integer(
						(String) getParams()[3]).intValue()];
				NoCoincideLongitudoTipoCampoNumericoObligatorioDependiente regla = new NoCoincideLongitudoTipoCampoNumericoObligatorioDependiente();
				regla.setParams(params);
				boolean retorno = regla.performValidation(fieldRegla, registro,
						nombreArchivo);
				if (retorno == false) {
					double annos = Math.floor(ObtenerDiasEntreFechas.calcular(
							fechaNacimiento, fechaActual) / 365.25);
                                        if (annos < 18 && tipoDoc.equals("CC") ) {
						return true;
					}
					if (annos < 7 && tipoDoc.equals("CE") && !TipoDocNov.equals("AS") && !TipoDocNov.equals("MS")) {//Ticket #8261 21122023
						return true;
					}
                                        
                                     if (tipoDoc.equals("CE") && TipoDocNov.equals("AS") && TipoDocNov.equals("MS")) {//Ticket #8261 21122023
                                        return false;
                                    }
                                

				}

			}

			// -------------

			if (tipoDoc.equals("PA")) {

				Object[] params = new Object[4];
				params[0] = getParams()[2]; // campo que tiene el tipo documento
				params[1] = tipoDoc;
				params[2] = "6";
				params[3] = "16";
				String fieldRegla = registro[new Integer(
						(String) getParams()[3]).intValue()];
				NoCoincideLongitudoTipoCampoAlfanumericoNumericoObligatorioDependiente regla = new NoCoincideLongitudoTipoCampoAlfanumericoNumericoObligatorioDependiente();
				regla.setParams(params);
				boolean retorno = regla.performValidation(fieldRegla, registro,
						nombreArchivo);
				if (retorno == false) {
					double annos = Math.floor(ObtenerDiasEntreFechas.calcular(
							fechaNacimiento, fechaActual) / 365.25);
					if ((annos > 19) && !TipoDocNov.equals("AS") && !TipoDocNov.equals("MS")) {//Ticket #8261 21122023
						return true;
					}
                                        
                                     if (tipoDoc.equals("PA") && TipoDocNov.equals("AS") && TipoDocNov.equals("MS")) {//Ticket #8261 21122023
                                        return false;
                                    }

				}

			}
			// class="NoCoincideLongitudoTipoCampoNumericoObligatorioDependiente"

		}
		return false;
	}
}
