package com.fidufosyga.rules;

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

public class ValidarCampoCN extends AbstractRule {

    @Override
    public boolean performValidation(String field, String[] registro, String nombreArchivo) {
        try {
            /*
             * params="1,RC#TI#CC,13,1#2#6#8#10#14#16#17#22#25#27"
             * 
             * [0] = posición del campo tipo documento
             * [1] = lista de valores de tipo documento válidos (separados por "#")
             * [2] = posición del campo tipo población
             * [3] = lista de tipos de población donde el campo 31 es opcional (separados por "#")
             */

            //parámetros
            String campoDocumentoParam = (String) getParams()[0];
            String valoresDocumentoValidosStr = ((String) getParams()[1]).trim();
            String campoPoblacionParam = (String) getParams()[2];
            String poblacionesOpcionalesStr = (String) getParams()[3];

            int posDocumento = Integer.parseInt(campoDocumentoParam);
            int posPoblacion = Integer.parseInt(campoPoblacionParam);

          
            ArrayList<String> documentosValidos = new ArrayList<>(Arrays.asList(valoresDocumentoValidosStr.split(",")));
            ArrayList<String> poblacionesOpcionales = new ArrayList<>(Arrays.asList(poblacionesOpcionalesStr.split(",")));

            // valores del registro
            String tipoDocumento = registro.length > posDocumento ? registro[posDocumento].trim() : "";
            String tipoPoblacion = registro.length > posPoblacion ? registro[posPoblacion].trim() : "";

            //  posición del campo según las dos primeras letras del nombre del archivo
            String campo;
            if (nombreArchivo != null && nombreArchivo.length() >= 2 
                    && nombreArchivo.substring(0, 2).equalsIgnoreCase("MS")) {
                campo = registro.length > 31 ? registro[31].trim() : "";
            } else if (nombreArchivo != null && nombreArchivo.length() >= 2 
                    && nombreArchivo.substring(0, 2).equalsIgnoreCase("MC")) {
                campo = registro.length > 35 ? registro[35].trim() : "";
            } else {
                // si no esta obtiene cualquiera de las dos posiciones
                campo = obtenerCampo(registro, 35, 31);
            }



            if (tipoDocumento.equalsIgnoreCase("RC")) {

                // 
                boolean esPoblacionOpcional = tipoPoblacion != null && !tipoPoblacion.isEmpty()
                        && poblacionesOpcionales.contains(tipoPoblacion);

                // Si está en poblaciones opcionales  campo es opcional
                if (esPoblacionOpcional) {
                    return false; // válido
                }

                // Si no está en poblaciones opcionales  campo  obligatorio
                if (campo.isEmpty()) {
                    return true; // glosa: campo obligatorio
                }

                return false; // válido
            }

            // Si el documento es TI o CC campo siempre opcional
            if (tipoDocumento.equalsIgnoreCase("TI") || tipoDocumento.equalsIgnoreCase("CC")) {
                return false; // válido
            }

            // Si el documento no es RC, TI ni CC campo  no debe estar diligenciado
            if (!campo.isEmpty()) {
                return true; // glosa: no permitido
            }

            // Campo vacío  válido
            return false;

        } catch (Exception e) {
            System.out.println("Error en ValidarCampo31: " + e.getMessage());
            return true; // Glosa por error inesperado
        }
    }

    private static String obtenerCampo(String[] registro, int... posiblesPosiciones) {
        for (int pos : posiblesPosiciones) {
            if (registro.length > pos) {
                String valor = registro[pos] != null ? registro[pos].trim() : "";
                if (!valor.isEmpty()) {
                    return valor;
                }
            }
        }
        return "";
    }
}
