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.TecnicosEntidad;
import com.ejie.ab39a.utils.Utilidades;
import com.gfi.utils.UtilValidation;

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

	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 {
		TecnicosEntidadValidator.TLF_PATTERN = Pattern.compile(TecnicosEntidadValidator.TLF_PATTERN_STR);
		TecnicosEntidadValidator.MOVIL_PATTERN = Pattern.compile(TecnicosEntidadValidator.MOVIL_PATTERN_STR);
	}

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

	/**
	 * Valida TecnicoEntidad y devuelve la mapa con los errores.
	 * 
	 * @param tecnicosEntidad
	 *            TecnicosEntidad objeto TecnicosEntidad
	 * @return List<ErrorField> lista de errores
	 */
	public List<ErrorField> validate(TecnicosEntidad tecnicosEntidad) {
		List<ErrorField> errorFields = new ArrayList<ErrorField>();

		// Tipos Identificación obligatorio
		if (tecnicosEntidad.getTipoIdentif() == null || tecnicosEntidad.getTipoIdentif().getCodigo() == null) {
			errorFields.add(new ErrorField("entidades.tipoIdentif", "validacion.obligatorio"));
		}
		// Cif nif obligatorio
		if (Utilidades.isEmpty(tecnicosEntidad.getDocidentificacion())) {
			errorFields.add(new ErrorField("tecnicoEntidad.docidentificacion", "validacion.obligatorio"));
		} else if (!UtilValidation.isValidCif(tecnicosEntidad.getDocidentificacion())
				&& !UtilValidation.isValidNif(tecnicosEntidad.getDocidentificacion())) {
			errorFields.add(new ErrorField("tecnicoEntidad.docidentificacion", "validacion.formatoCif"));
		}

		// Nombre obligatorio
		if (Utilidades.isEmpty(tecnicosEntidad.getNombre())) {
			errorFields.add(new ErrorField("tecnicoEntidad.nombre", "validacion.obligatorio"));
		}
		// Apellido 1 obligatorio
		if (Utilidades.isEmpty(tecnicosEntidad.getApe1())) {
			errorFields.add(new ErrorField("tecnicoEntidad.ape1", "validacion.obligatorio"));
		}

		// Tlfno obligatorio
		if (Utilidades.isEmpty(tecnicosEntidad.getTelefono1())) {
			errorFields.add(new ErrorField("tecnicoEntidad.telefono1", "validacion.obligatorio"));
		}
		// Mail obligatorio
		if (Utilidades.isEmpty(tecnicosEntidad.getEmail())) {
			errorFields.add(new ErrorField("tecnicoEntidad.email", "validacion.obligatorio"));
		}
		// Sexo obligatorio
		if (Utilidades.isEmpty(tecnicosEntidad.getSexo())) {
			errorFields.add(new ErrorField("tecnicoEntidad.sexo", "validacion.obligatorio"));
		}
		// Territorio historico obligatorio
		if (Utilidades.isEmpty(tecnicosEntidad.getCodth())) {
			errorFields.add(new ErrorField("tecnicoEntidad.provincia", "validacion.obligatorio"));
		}

		// Tfno1 formato
		if (!Utilidades.isEmpty(tecnicosEntidad.getTelefono1()) && !this.checkTlfFijo(tecnicosEntidad.getTelefono1())
				&& !this.checkTlfMovil(tecnicosEntidad.getTelefono1())) {
			errorFields.add(new ErrorField("tecnicoEntidad.telefono1", "validacion.formatoTfno"));
		}
		// Tfno2 formato
		if (!Utilidades.isEmpty(tecnicosEntidad.getTelefono2()) && !this.checkTlfFijo(tecnicosEntidad.getTelefono2())
				&& !this.checkTlfMovil(tecnicosEntidad.getTelefono2())) {
			errorFields.add(new ErrorField("tecnicoEntidad.telefono2", "validacion.formatoTfno"));
		}

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

		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 = TecnicosEntidadValidator.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 = TecnicosEntidadValidator.MOVIL_PATTERN.matcher(cadena);
		return matcher.matches();

	}

}
