/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.fidufosyga.rules;


import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;

/**
 *
 * @author Marinela.Quintero
 */




public class validarSexoIdentificacion extends AbstractRule {

    public validarSexoIdentificacion() {
    }

    @Override
    public void setParams(Object[] params) {
        // Validación de cantidad mínima de parámetros
        if (params.length < 3) {
            throw new IllegalArgumentException("Se esperaban al menos 3 parámetros: inicio, longitud y valores permitidos (F#M#T#NB)");
        }

        // Validación y parseo de valores permitidos
        String valores = (String) params[2];
        ArrayList<String> listaString = new ArrayList<>();
        StringTokenizer st = new StringTokenizer(valores, "#");
        while (st.hasMoreTokens()) {
            listaString.add(st.nextToken());
        }

        String[] array = listaString.toArray(new String[0]);
        Arrays.sort(array); // importante para binarySearch
        params[2] = array;

        super.setParams(params);
    }

    @Override
    public boolean performValidation(String field, String[] registro, String nombreArchivo) {
        Object[] params = getParams();

        // Obtener los parámetros de posición
        int inicio = Integer.parseInt((String) params[0]);
        int longitud = Integer.parseInt((String) params[1]);

        // Extraer la subcadena del nombre del archivo
        String cadena = "";
        try {
            cadena = nombreArchivo.substring(inicio - 1, inicio - 1 + longitud);
        } catch (Exception e) {
            // Si no se puede extraer la subcadena, retornar error
            return true;
        }

        // Obtener los valores válidos ya parseados
        String[] valoresPermitidos = (String[]) params[2];

        field = field.trim();

        if ("MSPS01".equalsIgnoreCase(cadena)) {
            // MSPS01: permite vacío o valor en la lista
            if (field.isEmpty()) {
                return false; // válido
            }
            return Arrays.binarySearch(valoresPermitidos, field) < 0; // true si no es válido
        } else {
            // Otros archivos: no permite vacío y debe estar en la lista
            if (field.isEmpty()) {
                return true; // error por estar vacío
            }
            return Arrays.binarySearch(valoresPermitidos, field) < 0; // true si no es válido
        }
    }
}



