package com.fidufosyga.rules;

import com.fidufosyga.context.Context;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ValidarEstructuraNoDocumento extends AbstractRule {

    private Pattern pattern;

    public void setParams(Object[] params) {
        String patternStr = (String) params[4];
        pattern = Pattern.compile(patternStr);
        super.setParams(params);
    }

    public boolean performValidation(String field, String[] registro, String nombreArchivo) {
        try {
            if (field == null || field.length() < 4) {
                return true; // Campo inválido
            }

            FileInputStream in;
            Properties defaultProps = new Properties();

            // Posiciones y valores
            int pCampoTipoDocumento = Integer.parseInt((String) getParams()[0]);
            String TipoDocumento = registro[pCampoTipoDocumento];

            String vTiposDocumento = (String) getParams()[1];

            int pCampoTipoPoEs = Integer.parseInt((String) getParams()[2]);
            String TipoPoEs = registro[pCampoTipoPoEs];

            String vTiposPoEs = (String) getParams()[3];

            int pCampoDepart = Integer.parseInt((String) getParams()[5]);
            String pCDepart = registro[pCampoDepart];

            int pCampoMunicipio = Integer.parseInt((String) getParams()[6]);
            String pCMunicipio = registro[pCampoMunicipio];

            int condicion = 0;

            if (vTiposDocumento.contains(TipoDocumento) && vTiposPoEs.contains(TipoPoEs)) {
                String codigoDepto = field.substring(0, 2);
                String codigoMunicipio = field.substring(2, 5);

                Context.getContext().removeAttribute(codigoDepto);
                if (Context.getContext().getAttribute(codigoDepto) == null) {
                    File file = new File(System.getProperty("user.dir")
                            + File.separator + "departamentos"
                            + File.separator + codigoDepto + ".properties");

                    if (file.exists()) {
                        try {
                            in = new FileInputStream(file);
                            defaultProps.load(in);
                            in.close();
                            Context.getContext().addAttribute(codigoDepto, defaultProps);
                        } catch (IOException e) {
                            return true;
                        }

                        if (defaultProps.getProperty(codigoMunicipio) == null
                                || !codigoDepto.equals(pCDepart)
                                || !codigoMunicipio.equals(pCMunicipio)) {
                            return true;
                        } else {
                            String letra = field.substring(5, 6);
                            int length = field.length();

                            if ((TipoPoEs.equals("16") && TipoDocumento.equals("AS") && letra.equals("S") && (length == 12 || length == 10))
                                    || (TipoPoEs.equals("17") && letra.equals("I") && (length == 12 || length == 10))
                                    || (TipoPoEs.equals("1") && letra.equals("D") && (length == 12 || length == 10))
                                    || ((TipoPoEs.equals("10") || TipoPoEs.equals("2")) && TipoDocumento.equals("MS") && letra.equals("A") && (length == 12 || length == 10))
                                    || (TipoPoEs.equals("25") && TipoDocumento.equals("AS") && letra.equals("A") && (length == 12 || length == 10))
                                    || (TipoPoEs.equals("14") && TipoDocumento.equals("AS") && letra.equals("P") && (length == 12 || length == 10))
                                    || (TipoPoEs.equals("22") && TipoDocumento.equals("MS") && letra.equals("P") && (length == 12 || length == 10))) {
                                condicion = 1;
                            } else {
                                return true;
                            }
                        }
                    } else {
                        return true;
                    }
                } else {
                    return true;
                }

                Matcher matcher = pattern.matcher(field);
                if (!matcher.find()) {
                    return true;
                }
            }
        } catch (NumberFormatException | ArrayIndexOutOfBoundsException e) {
            return true;
        }

        return false;
    }
}
