package com.ejie.ab39a.validations;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.springframework.stereotype.Component;

import com.ejie.ab39a.exceptions.ErrorField;
import com.ejie.ab39a.model.Entidades;
import com.ejie.ab39a.utils.Utilidades;
import com.gfi.utils.UtilValidation;
import com.gfi.utils.Utilities;

/**
 * Clase encargada de las validaciones de las entidades
 * 
 *  
 *
 */
@Component
public class EntidadesValidator {

	private static Pattern TLF_PATTERN;
	private static Pattern MOVIL_PATTERN;

	private static final String TLF_PATTERN_STR = "^[98](\\d){8}[\\d]*"; // 9XXXXXXXX
	private static final String MOVIL_PATTERN_STR = "^(\\+(\\d)+)?[67](\\d){8}[\\d]*"; // (+34)6XXXXXXXX

	static {
		EntidadesValidator.TLF_PATTERN = Pattern.compile(EntidadesValidator.TLF_PATTERN_STR);
		EntidadesValidator.MOVIL_PATTERN = Pattern.compile(EntidadesValidator.MOVIL_PATTERN_STR);
	}

	/**
	 * Método EntidadesValidator
	 */
	public EntidadesValidator() {
		super();
	}

	/**
	 * Valida Entidad y devuelve la mapa con los errores.
	 * 
	 * @param entidades
	 *            Entidades objeto Entidades
	 * @return List<ErrorField> lista de errores
	 */
	public List<ErrorField> validate(Entidades entidades) {
		List<ErrorField> errorFields = new ArrayList<ErrorField>();
		// Descripción entidad obligatorio

		if (entidades.getDesentidad() == null) {
			errorFields.add(new ErrorField("entidades.izena", "validacion.obligatorio"));
		}
		// Cif nif obligatorio
		if (entidades.getCifnif() == null) {
			errorFields.add(new ErrorField("entidades.ifz", "validacion.obligatorio"));
		} else if (!UtilValidation.isValidCif(entidades.getCifnif())
				&& !UtilValidation.isValidNif(entidades.getCifnif())) {
			errorFields.add(new ErrorField("entidades.ifz", "validacion.formatoCif"));
		}
		// Provincia obligatorio
		if (entidades.getCodth() == null || entidades.getCodth().equals("")) {
			errorFields.add(new ErrorField("entidades.th", "validacion.obligatorio"));
		}
		// Municipio obligatorio
		if (entidades.getCodth().equals("99")) {
			if (entidades.getMuniExt() == null || entidades.getMuniExt().equals("")) {
				errorFields.add(new ErrorField("entidades.udalerriaExtr", "validacion.obligatorio"));
			}
		} else {
			if (entidades.getCodmun() == null || entidades.getCodmun().equals("")) {
				errorFields.add(new ErrorField("entidades.udalerria", "validacion.obligatorio"));
			}
		}
		// Tipos Identificación obligatorio
		if (entidades.getTipoIdentif() == null || entidades.getTipoIdentif().getCodigo() == null) {
			errorFields.add(new ErrorField("entidades.tipoIdentif", "validacion.obligatorio"));
		}
		// Email formato
		if (!Utilidades.isEmpty(entidades.getEmail()) && !UtilValidation.isValidEmail(entidades.getEmail())) {
			errorFields.add(new ErrorField("entidad.email", "validacion.formatoEmail"));
		}
		// Dirección entidad obligatorio
		if (entidades.getDireccion() == null) {
			errorFields.add(new ErrorField("entidad.direccion", "validacion.obligatorio"));
		}

		// SolicINfor obligatorio
		if (entidades.getSolicInfor() == null || entidades.getSolicInfor().equals("")) {
			errorFields.add(new ErrorField("entidad.solicInfor", "validacion.obligatorio"));
		}
		// Num calle obligatorio
		/*
		 * if (Utilities.isEmptyNumber(entidades.getNumCalle())) {
		 * errorFields.add(new ErrorField("entidad.num",
		 * "validacion.obligatorio")); }
		 */
		// Tfno entidad formato
		if (entidades.getTfno() != null && entidades.getTfno().trim().length() > 0
				&& !this.checkTlfFijo(entidades.getTfno().toString())
				&& !this.checkTlfMovil(entidades.getTfno().toString())) {
			errorFields.add(new ErrorField("entidad.tfno", "validacion.formatoTfno"));

		}
		// CP obligatorio
		if (Utilities.isEmpty(entidades.getCp())) {
			errorFields.add(new ErrorField("entidad.cp", "validacion.obligatorio"));
		}
		// Tipo Entidad obligatorio
		if (Utilities.isEmpty(String.valueOf(entidades.getTipoEntidad())) || entidades.getTipoEntidad() == null) {
			errorFields.add(new ErrorField("entidades.mota", "validacion.obligatorio"));
		}
		// Número trabajadores
		if (!Utilities.isEmptyNumber(entidades.getNumTrabajadores())) {
			int numHombre = 0;
			int numMujer = 0;
			if (!Utilities.isEmptyNumber(entidades.getNumTrabHombre())) {
				numHombre = entidades.getNumTrabHombre();
			}
			if (!Utilities.isEmptyNumber(entidades.getNumTrabMujer())) {
				numMujer = entidades.getNumTrabMujer();
			}
			if (entidades.getNumTrabajadores() < (numHombre + numMujer)) {
				errorFields.add(new ErrorField("entidad.numTrab", "validacion.numTrabajadores"));
			}
		}

		return errorFields;
	}

	/**
	 * Valida Entidad y devuelve la mapa con los errores.
	 * 
	 * @param entidades
	 *            Entidades objeto Entidades
	 * @return List<ErrorField> lista de errores
	 */
	public List<ErrorField> validateEntidad(Entidades entidades) {
		List<ErrorField> errorFields = new ArrayList<ErrorField>();

		// Email obligatorio y formato
		if (Utilidades.isEmpty(entidades.getEmail())) {
			errorFields.add(new ErrorField("entidad.email", "validacion.obligatorio"));
		}
		if (!Utilidades.isEmpty(entidades.getEmail()) && !UtilValidation.isValidEmail(entidades.getEmail())) {
			errorFields.add(new ErrorField("entidad.email", "validacion.formatoEmail"));
		}

		// Tfno entidad formato
		if (Utilidades.isEmpty(entidades.getTfno())) {
			errorFields.add(new ErrorField("entidad.tfno", "validacion.obligatorio"));
		}
		if (!Utilidades.isEmpty(entidades.getTfno()) && !this.checkTlfFijo(entidades.getTfno().toString())
				&& !this.checkTlfMovil(entidades.getTfno().toString())) {
			errorFields.add(new ErrorField("entidad.tfno", "validacion.formatoTfno"));

		}

		// Número trabajadores
		if (Utilities.isEmptyNumber(entidades.getNumTrabajadores())) {
			errorFields.add(new ErrorField("entidad.numTrab", "validacion.obligatorio"));
		}
		if (Utilities.isEmptyNumberSin0(entidades.getNumTrabHombre())) {
			errorFields.add(new ErrorField("entidad.numTrabHombre", "validacion.obligatorio"));
		}
		if (Utilities.isEmptyNumberSin0(entidades.getNumTrabMujer())) {
			errorFields.add(new ErrorField("entidad.numTrabMujer", "validacion.obligatorio"));
		}
		if (!Utilities.isEmptyNumber(entidades.getNumTrabajadores())) {
			int numHombre = 0;
			int numMujer = 0;
			if (!Utilities.isEmptyNumber(entidades.getNumTrabHombre())) {
				numHombre = entidades.getNumTrabHombre();
			}
			if (!Utilities.isEmptyNumber(entidades.getNumTrabMujer())) {
				numMujer = entidades.getNumTrabMujer();
			}
			if (entidades.getNumTrabajadores() < (numHombre + numMujer)) {
				errorFields.add(new ErrorField("entidad.numTrab", "validacion.numTrabajadores"));
			}
		}

		return errorFields;
	}

	/**
	 * Valida Entidad y devuelve la mapa con los errores.
	 * 
	 * @param entidades
	 *            Entidades objeto Entidades
	 * @return List<ErrorField> lista de errores
	 */
	public List<ErrorField> validateTodo(Entidades entidades) {
		List<ErrorField> errorFields = new ArrayList<ErrorField>();
		// Descripción entidad obligatorio

		if (entidades.getDesentidad() == null) {
			errorFields.add(new ErrorField("entidades.izena", "validacion.obligatorio"));
		}
		// Cif nif obligatorio
		if (entidades.getCifnif() == null) {
			errorFields.add(new ErrorField("entidades.ifz", "validacion.obligatorio"));
		} else if (!UtilValidation.isValidCif(entidades.getCifnif())
				&& !UtilValidation.isValidNif(entidades.getCifnif())) {
			errorFields.add(new ErrorField("entidades.ifz", "validacion.formatoCif"));
		}
		// Provincia obligatorio
		if (entidades.getCodth() == null || entidades.getCodth().equals("")) {
			errorFields.add(new ErrorField("entidades.th", "validacion.obligatorio"));
		}
		// Municipio obligatorio
		if (entidades.getCodth().equals("99")) {
			if (entidades.getMuniExt() == null || entidades.getMuniExt().equals("")) {
				errorFields.add(new ErrorField("entidades.udalerriaExtr", "validacion.obligatorio"));
			}
		} else {
			if (entidades.getCodmun() == null || entidades.getCodmun().equals("")) {
				errorFields.add(new ErrorField("entidades.udalerria", "validacion.obligatorio"));
			}
		}
		// Tipos Identificación obligatorio
		if (entidades.getTipoIdentif() == null || entidades.getTipoIdentif().getCodigo() == null) {
			errorFields.add(new ErrorField("entidades.tipoIdentif", "validacion.obligatorio"));
		}
		// Email formato
		if (Utilidades.isEmpty(entidades.getEmail())) {
			errorFields.add(new ErrorField("entidad.email", "validacion.obligatorio"));
		}
		if (!Utilidades.isEmpty(entidades.getEmail()) && !UtilValidation.isValidEmail(entidades.getEmail())) {
			errorFields.add(new ErrorField("entidad.email", "validacion.formatoEmail"));
		}
		// Dirección entidad obligatorio
		if (entidades.getDireccion() == null) {
			errorFields.add(new ErrorField("entidad.direccion", "validacion.obligatorio"));
		}

		// SolicINfor obligatorio
		if (entidades.getSolicInfor() == null || entidades.getSolicInfor().equals("")) {
			errorFields.add(new ErrorField("entidad.solicInfor", "validacion.obligatorio"));
		}

		// Tfno entidad formato
		if (Utilidades.isEmpty(entidades.getTfno())) {
			errorFields.add(new ErrorField("entidad.tfno", "validacion.obligatorio"));
		}
		if (entidades.getTfno() != null && entidades.getTfno().trim().length() > 0
				&& !this.checkTlfFijo(entidades.getTfno().toString())
				&& !this.checkTlfMovil(entidades.getTfno().toString())) {
			errorFields.add(new ErrorField("entidad.tfno", "validacion.formatoTfno"));

		}
		// CP obligatorio
		if (Utilities.isEmpty(entidades.getCp())) {
			errorFields.add(new ErrorField("entidad.cp", "validacion.obligatorio"));
		}
		// Tipo Entidad obligatorio
		if (Utilities.isEmpty(String.valueOf(entidades.getTipoEntidad())) || entidades.getTipoEntidad() == null) {
			errorFields.add(new ErrorField("entidades.mota", "validacion.obligatorio"));
		}
		// Número trabajadores
		if (Utilities.isEmptyNumber(entidades.getNumTrabajadores())) {
			errorFields.add(new ErrorField("entidad.numTrab", "validacion.obligatorio"));
		}
		if (Utilities.isEmptyNumberSin0(entidades.getNumTrabHombre())) {
			errorFields.add(new ErrorField("entidad.numTrabHombre", "validacion.obligatorio"));
		}
		if (Utilities.isEmptyNumberSin0(entidades.getNumTrabMujer())) {
			errorFields.add(new ErrorField("entidad.numTrabMujer", "validacion.obligatorio"));
		}
		if (!Utilities.isEmptyNumber(entidades.getNumTrabajadores())) {
			int numHombre = 0;
			int numMujer = 0;
			if (!Utilities.isEmptyNumber(entidades.getNumTrabHombre())) {
				numHombre = entidades.getNumTrabHombre();
			}
			if (!Utilities.isEmptyNumber(entidades.getNumTrabMujer())) {
				numMujer = entidades.getNumTrabMujer();
			}
			if (entidades.getNumTrabajadores() < (numHombre + numMujer)) {
				errorFields.add(new ErrorField("entidad.numTrab", "validacion.numTrabajadores"));
			}
		}

		return errorFields;
	}

	/**
	 * Valida la cadena contra la expresion regular
	 * 
	 * @param cadena
	 *            String cadena a evaluar
	 * @return boolean devuelve true si cumple la expresion, false en caso
	 *         contrario
	 */
	public boolean checkTlfFijo(final String cadena) {

		Matcher matcher = EntidadesValidator.TLF_PATTERN.matcher(cadena);
		return matcher.matches();

	}

	/**
	 * Valida la cadena contra la expresion regular
	 * 
	 * @param cadena
	 *            String cadena a evaluar
	 * @return boolean devuelve true si cumple la expresion, false en caso
	 *         contrario
	 */
	public boolean checkTlfMovil(final String cadena) {

		Matcher matcher = EntidadesValidator.MOVIL_PATTERN.matcher(cadena);
		return matcher.matches();

	}

}
