package com.ejie.ad74a.validacion;

import java.util.List;

import javax.annotation.Resource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.stereotype.Component;

import com.ejie.ad74a.exceptions.Ad74aException;
import com.ejie.ad74a.exceptions.ErrorField;
import com.ejie.ad74a.model.Cuentas;
import com.ejie.ad74a.model.Direcciones;
import com.ejie.ad74a.model.Solicitantes;
import com.ejie.ad74a.service.SolicitantesService;
import com.ejie.ad74a.util.comun.UtilLiterales;
import com.ejie.ad74a.util.comun.UtilValidaciones;
import com.ejie.ad74a.util.comun.Utilidades;
import com.ejie.ad74a.util.constantes.Constantes;
import com.ejie.ad74a.util.constantes.modelos.TipoSolicitantes;

@Component(value = "SolicitantesValidator")
public class SolicitantesValidator {
	private static final Logger LOGGER = LoggerFactory.getLogger(SolicitantesValidator.class);

	private static final String LABEL_APELLIDO101 = "solicitantes.apellido101";
	private static final String LABEL_APELLIDO201 = "solicitantes.apellido201";
	private static final String LABEL_NOMBRE01 = "solicitantes.nombre01";
	private static final String LABEL_BENEFICIARIO01 = "solicitantes.beneficiario01";
	private static final String LABEL_TIPOIDENTIFICADOR01 = "solicitantes.tipoIdentificador01";
	private static final String LABEL_IDENTIFICADOR01 = "solicitantes.identificador01";
	private static final String LABEL_SEXO01 = "solicitantes.sexo01";
	private static final String LABEL_TLFNOSERVICIO01 = "solicitantes.tlfnoservicio01";

	public static final int MAX_LENGTH_IDENTIFICADOR01 = 20;
	public static final int MAX_LENGTH_NOMBRE01 = 100;
	public static final int MAX_LENGTH_APELLIDOS01 = 200;

	private static final String LABEL_ERROR_CAMBIO_TIT = "error.cambioTitular";

	// Label de campos para mensajes de error.

	@Autowired
	private SolicitantesService solicitantesService;

	@Resource
	private ReloadableResourceBundleMessageSource appMessageSource;

	public void validateSolicitante(List<ErrorField> errorFields, Solicitantes solicitantes) {
		SolicitantesValidator.LOGGER.info("SolicitantesValidator: validateSolicitante ");

		if (solicitantes == null) {
			throw new Ad74aException(UtilLiterales.getLiteralMessage(appMessageSource, Constantes.ERROR_GENERICO));
		}

		// #########################
		// ###### APELLIDO101 ######
		// #########################

		// # Demasiados Caracteres #
		if (Boolean.TRUE.equals(
				!Utilidades.validarLongitud(solicitantes.getApellido101(), TipoSolicitantes.MAX_LENGTH_APELLIDO101))) {
			errorFields.add(new ErrorField(SolicitantesValidator.LABEL_APELLIDO101,
					UtilValidaciones.getMensajeValidaLongitud(Utilidades.getLength(solicitantes.getApellido101()),
							TipoSolicitantes.MAX_LENGTH_APELLIDO101)));
		}
		// # Vacío #
		if (Boolean.TRUE.equals(Utilidades.isEmpty(solicitantes.getApellido101()))) {
			errorFields.add(
					new ErrorField(SolicitantesValidator.LABEL_APELLIDO101, UtilValidaciones.LABEL_ERROR_OBLIGATORIO));
		}

		// #########################
		// ###### APELLIDO201 ######
		// #########################

		// # Demasiados Caracteres #
		if (Boolean.TRUE.equals(
				!Utilidades.validarLongitud(solicitantes.getApellido201(), TipoSolicitantes.MAX_LENGTH_APELLIDO201))) {
			errorFields.add(new ErrorField(SolicitantesValidator.LABEL_APELLIDO201,
					UtilValidaciones.getMensajeValidaLongitud(Utilidades.getLength(solicitantes.getApellido201()),
							TipoSolicitantes.MAX_LENGTH_APELLIDO201)));
		}

		// #########################
		// ####### NOMBRE01 ########
		// #########################

		// # Demasiados Caracteres #
		if (Boolean.TRUE.equals(
				!Utilidades.validarLongitud(solicitantes.getNombre01(), TipoSolicitantes.MAX_LENGTH_NOMBRE01))) {
			errorFields
					.add(new ErrorField(SolicitantesValidator.LABEL_NOMBRE01, UtilValidaciones.getMensajeValidaLongitud(
							Utilidades.getLength(solicitantes.getNombre01()), TipoSolicitantes.MAX_LENGTH_NOMBRE01)));
		}
		// # Vacío #
		if (Boolean.TRUE.equals(Utilidades.isEmpty(solicitantes.getNombre01()))) {
			errorFields.add(
					new ErrorField(SolicitantesValidator.LABEL_NOMBRE01, UtilValidaciones.LABEL_ERROR_OBLIGATORIO));
		}

		// #########################
		// #### BENEFICIARIO01 #####
		// #########################

		// # Vacío #
		if (Boolean.TRUE.equals(null != solicitantes.getBeneficiario01())) {
			errorFields.add(new ErrorField(SolicitantesValidator.LABEL_BENEFICIARIO01,
					UtilValidaciones.LABEL_ERROR_OBLIGATORIO));
		}

		// ##############################
		// #### tipoIdentificador01 #####
		// ##############################

		// # Vacío #
		if (Boolean.TRUE.equals(null == solicitantes.getTipoIdentificador01())) {
			errorFields.add(new ErrorField(SolicitantesValidator.LABEL_TIPOIDENTIFICADOR01,
					UtilValidaciones.LABEL_ERROR_OBLIGATORIO));
		}

		// ##########################
		// #### identificador01 #####
		// ##########################

		// # Vacío #
		if (Boolean.TRUE.equals(null == solicitantes.getIdentificador01())) {
			errorFields.add(new ErrorField(SolicitantesValidator.LABEL_IDENTIFICADOR01,
					UtilValidaciones.LABEL_ERROR_OBLIGATORIO));
		}

		// #################
		// #### sexo01 #####
		// #################

		// # Vacío #
		if (Boolean.TRUE.equals(null == solicitantes.getSexo01())) {
			errorFields
					.add(new ErrorField(SolicitantesValidator.LABEL_SEXO01, UtilValidaciones.LABEL_ERROR_OBLIGATORIO));
		}

		// ##########################
		// #### tlfnoServicio01 #####
		// ##########################

		// # Vacío #
		if (Boolean.TRUE.equals(null == solicitantes.getTlfnoServicio01())) {
			errorFields.add(new ErrorField(SolicitantesValidator.LABEL_TLFNOSERVICIO01,
					UtilValidaciones.LABEL_ERROR_OBLIGATORIO));
		}

	}

	public Boolean validateCambiosDireccion(Direcciones direccionBBDD, Direcciones direccionPresentacion,
			String tabDatosBeneficiarios) {

		// Pais NORA
		if ((direccionPresentacion.getIdPais06() != null && direccionBBDD.getIdPais06() != null
				&& !direccionPresentacion.getIdPais06().equalsIgnoreCase(direccionBBDD.getIdPais06()))
				|| ((direccionPresentacion.getIdPais06() != null && direccionBBDD.getIdPais06() == null)
						|| (direccionPresentacion.getIdPais06() == null && direccionBBDD.getIdPais06() != null))) {
			return true;
		}

		// Municipio NORA
		if ((direccionBBDD.getIdMunicipio06() != null && direccionPresentacion.getIdMunicipio06() != null
				&& !direccionPresentacion.getIdMunicipio06().equalsIgnoreCase(direccionBBDD.getIdMunicipio06()))
				|| ((direccionPresentacion.getIdMunicipio06() != null && direccionBBDD.getIdMunicipio06() == null)
						|| (direccionPresentacion.getIdMunicipio06() == null
								&& direccionBBDD.getIdMunicipio06() != null))) {
			return true;
		}
		// Localidad NORA
		if ((direccionBBDD.getIdLocalidad06() != null && direccionPresentacion.getIdLocalidad06() != null
				&& !direccionPresentacion.getIdLocalidad06().equals(direccionBBDD.getIdLocalidad06()))
				|| ((direccionPresentacion.getIdLocalidad06() != null && direccionBBDD.getIdLocalidad06() == null)
						|| (direccionPresentacion.getIdLocalidad06() == null
								&& direccionBBDD.getIdLocalidad06() != null))) {
			return true;
		}
		// Calle NORA
		if ((direccionBBDD.getIdCalle06() != null && direccionPresentacion.getIdCalle06() != null
				&& !direccionPresentacion.getIdCalle06().equals(direccionBBDD.getIdCalle06()))
				|| ((direccionPresentacion.getIdCalle06() != null && direccionBBDD.getIdCalle06() == null)
						|| (direccionPresentacion.getIdCalle06() == null && direccionBBDD.getIdCalle06() != null))) {
			return true;
		}

		// Portal Nora
		if ((direccionBBDD.getIdPortal06() != null && direccionPresentacion.getIdPortal06() != null
				&& !direccionPresentacion.getIdPortal06().equals(direccionBBDD.getIdPortal06()))
				|| ((direccionPresentacion.getIdPortal06() != null && direccionBBDD.getIdPortal06() == null)
						|| (direccionPresentacion.getIdPortal06() == null && direccionBBDD.getIdPortal06() != null))) {
			return true;
		}

		// Pais string
		if ((direccionPresentacion.getPais06() != null && direccionBBDD.getPais06() != null
				&& !direccionPresentacion.getPais06().contentEquals(direccionBBDD.getPais06()))
				|| ((direccionPresentacion.getPais06() != null && direccionBBDD.getPais06() == null)
						|| (direccionPresentacion.getPais06() == null && direccionBBDD.getPais06() != null))) {
			return true;
		}

		// Provincia string
		if ((direccionPresentacion.getProvincia06() != null && direccionBBDD.getProvincia06() != null
				&& !direccionPresentacion.getProvincia06().contentEquals(direccionBBDD.getProvincia06()))
				|| ((direccionPresentacion.getProvincia06() != null && direccionBBDD.getIdPais06() == null)
						|| (direccionPresentacion.getProvincia06() == null
								&& direccionBBDD.getProvincia06() != null))) {
			return true;
		}

		// Municipio string
		if ((direccionPresentacion.getMunicipio06() != null && direccionBBDD.getMunicipio06() != null
				&& !direccionPresentacion.getMunicipio06().contentEquals(direccionBBDD.getMunicipio06()))
				|| ((direccionPresentacion.getMunicipio06() != null && direccionBBDD.getMunicipio06() == null)
						|| (direccionPresentacion.getMunicipio06() == null
								&& direccionBBDD.getMunicipio06() != null))) {
			return true;
		}

		// Localidad string
		if ((direccionPresentacion.getLocalidad06() != null && direccionBBDD.getLocalidad06() != null
				&& !direccionPresentacion.getLocalidad06().contentEquals(direccionBBDD.getLocalidad06()))
				|| ((direccionPresentacion.getLocalidad06() != null && direccionBBDD.getLocalidad06() == null)
						|| (direccionPresentacion.getLocalidad06() == null
								&& direccionBBDD.getLocalidad06() != null))) {
			return true;
		}

		// Calle string
		if ((direccionPresentacion.getCalle06() != null && direccionBBDD.getCalle06() != null
				&& !direccionPresentacion.getCalle06().contentEquals(direccionBBDD.getCalle06()))
				|| ((direccionPresentacion.getCalle06() != null && direccionBBDD.getCalle06() == null)
						|| (direccionPresentacion.getCalle06() == null && direccionBBDD.getCalle06() != null))) {
			return true;
		}

		// Potal string
		if ((direccionPresentacion.getPortal06() != null && direccionBBDD.getPortal06() != null
				&& !direccionPresentacion.getPortal06().contentEquals(direccionBBDD.getPortal06()))
				|| ((direccionPresentacion.getPortal06() != null && direccionBBDD.getPortal06() == null)
						|| (direccionPresentacion.getPortal06() == null && direccionBBDD.getPortal06() != null))) {
			return true;
		}

		// Piso string
		if ((direccionPresentacion.getPiso06() != null && direccionBBDD.getPiso06() != null
				&& !direccionPresentacion.getPiso06().contentEquals(direccionBBDD.getPiso06()))
				|| ((direccionPresentacion.getPiso06() != null && direccionBBDD.getPiso06() == null)
						|| (direccionPresentacion.getPiso06() == null && direccionBBDD.getPiso06() != null))) {
			return true;
		}

		// Letra
		if ((direccionPresentacion.getLetra06() != null && direccionBBDD.getLetra06() != null
				&& !direccionPresentacion.getLetra06().contentEquals(direccionBBDD.getLetra06()))
				|| ((direccionPresentacion.getLetra06() != null && direccionBBDD.getLetra06() == null)
						|| (direccionPresentacion.getLetra06() == null && direccionBBDD.getLetra06() != null))) {
			return true;
		}

		// CP
		if ((direccionPresentacion.getCp06() != null && direccionBBDD.getCp06() != null
				&& !direccionPresentacion.getCp06().contentEquals(direccionBBDD.getCp06()))
				|| ((direccionPresentacion.getCp06() != null && direccionBBDD.getCp06() == null)
						|| (direccionPresentacion.getCp06() == null && direccionBBDD.getCp06() != null))) {
			return true;
		}
		return false;
	}

	public Object validateCambiosCuenta(Cuentas cuentasBBDD, Cuentas cuentasPresentacion,
			String tabDatosBeneficiarios) {
		// CodTipoIdenTitular
		if ((cuentasPresentacion.getCodTipoIdenTitular05() != null && cuentasBBDD.getCodTipoIdenTitular05() != null
				&& !cuentasPresentacion.getCodTipoIdenTitular05().contentEquals(cuentasBBDD.getCodTipoIdenTitular05()))
				|| ((cuentasPresentacion.getCodTipoIdenTitular05() != null
						&& cuentasBBDD.getCodTipoIdenTitular05() == null)
						|| (cuentasPresentacion.getCodTipoIdenTitular05() == null
								&& cuentasBBDD.getCodTipoIdenTitular05() != null))) {
			return true;
		}
		// IdenTitular
		if ((cuentasPresentacion.getIdenTitular05() != null && cuentasBBDD.getIdenTitular05() != null
				&& !cuentasPresentacion.getIdenTitular05().contentEquals(cuentasBBDD.getIdenTitular05()))
				|| ((cuentasPresentacion.getIdenTitular05() != null && cuentasBBDD.getIdenTitular05() == null)
						|| (cuentasPresentacion.getIdenTitular05() == null
								&& cuentasBBDD.getIdenTitular05() != null))) {
			return true;
		}
		// NumCuenta
		if ((cuentasPresentacion.getNumCuenta05() != null && cuentasBBDD.getNumCuenta05() != null
				&& !cuentasPresentacion.getNumCuenta05().contentEquals(cuentasBBDD.getNumCuenta05()))
				|| ((cuentasPresentacion.getNumCuenta05() != null && cuentasBBDD.getNumCuenta05() == null)
						|| (cuentasPresentacion.getNumCuenta05() == null && cuentasBBDD.getNumCuenta05() != null))) {
			return true;
		}
		// TitularCuenta
		if ((cuentasPresentacion.getNombreTitCuenta05() != null && cuentasBBDD.getNombreTitCuenta05() != null
				&& !cuentasPresentacion.getNombreTitCuenta05().contentEquals(cuentasBBDD.getNombreTitCuenta05()))
				|| ((cuentasPresentacion.getNombreTitCuenta05() != null && cuentasBBDD.getNombreTitCuenta05() == null)
						|| (cuentasPresentacion.getNombreTitCuenta05() == null
								&& cuentasBBDD.getNombreTitCuenta05() != null))) {
			return true;
		}
		if ((cuentasPresentacion.getApellido1TitCuenta05() != null && cuentasBBDD.getApellido1TitCuenta05() != null
				&& !cuentasPresentacion.getApellido1TitCuenta05().contentEquals(cuentasBBDD.getApellido1TitCuenta05()))
				|| ((cuentasPresentacion.getApellido1TitCuenta05() != null
						&& cuentasBBDD.getApellido1TitCuenta05() == null)
						|| (cuentasPresentacion.getApellido1TitCuenta05() == null
								&& cuentasBBDD.getApellido1TitCuenta05() != null))) {
			return true;
		}
		return false;
	}

	/**
	 * Metodo que valida el cambio de persona titular de la solicitud
	 * 
	 * @param errorFields  List<ErrorField>
	 * @param solicitantes Solicitantes
	 */
	public void validatePersonaInteresada(List<ErrorField> errorFields, Solicitantes solicitantes) {
		if (solicitantes == null) {
			throw new Ad74aException(UtilLiterales.getLiteralMessage(appMessageSource, Constantes.ERROR_GENERICO));
		}

		// #########################
		// ###### APELLIDO101 ######
		// #########################

		// # Demasiados Caracteres #
		if (Boolean.TRUE.equals(
				!Utilidades.validarLongitud(solicitantes.getApellido101(), TipoSolicitantes.MAX_LENGTH_APELLIDO101))) {
			errorFields.add(new ErrorField(SolicitantesValidator.LABEL_APELLIDO101,
					UtilValidaciones.getMensajeValidaLongitud(Utilidades.getLength(solicitantes.getApellido101()),
							TipoSolicitantes.MAX_LENGTH_APELLIDO101)));
		}
		// # Vacío #
		if (Boolean.TRUE.equals(Utilidades.isEmpty(solicitantes.getApellido101()))) {
			errorFields.add(
					new ErrorField(SolicitantesValidator.LABEL_APELLIDO101, UtilValidaciones.LABEL_ERROR_OBLIGATORIO));
		}

		// #########################
		// ###### APELLIDO201 ######
		// #########################

		// # Demasiados Caracteres #
		if (Boolean.TRUE.equals(
				!Utilidades.validarLongitud(solicitantes.getApellido201(), TipoSolicitantes.MAX_LENGTH_APELLIDO201))) {
			errorFields.add(new ErrorField(SolicitantesValidator.LABEL_APELLIDO201,
					UtilValidaciones.getMensajeValidaLongitud(Utilidades.getLength(solicitantes.getApellido201()),
							TipoSolicitantes.MAX_LENGTH_APELLIDO201)));
		}

		// #########################
		// ####### NOMBRE01 ########
		// #########################

		// # Demasiados Caracteres #
		if (Boolean.TRUE.equals(
				!Utilidades.validarLongitud(solicitantes.getNombre01(), TipoSolicitantes.MAX_LENGTH_NOMBRE01))) {
			errorFields
					.add(new ErrorField(SolicitantesValidator.LABEL_NOMBRE01, UtilValidaciones.getMensajeValidaLongitud(
							Utilidades.getLength(solicitantes.getNombre01()), TipoSolicitantes.MAX_LENGTH_NOMBRE01)));
		}
		// # Vacío #
		if (Boolean.TRUE.equals(Utilidades.isEmpty(solicitantes.getNombre01()))) {
			errorFields.add(
					new ErrorField(SolicitantesValidator.LABEL_NOMBRE01, UtilValidaciones.LABEL_ERROR_OBLIGATORIO));
		}

		// ##############################
		// #### tipoIdentificador01 #####
		// ##############################

		// # Vacío #
		if (Boolean.TRUE.equals(null == solicitantes.getTipoIdentificador01())) {
			errorFields.add(new ErrorField(SolicitantesValidator.LABEL_TIPOIDENTIFICADOR01,
					UtilValidaciones.LABEL_ERROR_OBLIGATORIO));
		}

		// ##########################
		// #### identificador01 #####
		// ##########################

		// # Demasiados Caracteres #
		if (Boolean.TRUE.equals(!Utilidades.validarLongitud(solicitantes.getIdentificador01(),
				SolicitantesValidator.MAX_LENGTH_IDENTIFICADOR01))) {
			errorFields.add(new ErrorField(SolicitantesValidator.LABEL_IDENTIFICADOR01,
					UtilValidaciones.getMensajeValidaLongitud(Utilidades.getLength(solicitantes.getIdentificador01()),
							SolicitantesValidator.MAX_LENGTH_IDENTIFICADOR01)));
		}
		// # Vacío #
		if (Boolean.TRUE.equals(Utilidades.isEmpty(solicitantes.getIdentificador01()))) {
			errorFields.add(new ErrorField(SolicitantesValidator.LABEL_IDENTIFICADOR01,
					UtilValidaciones.LABEL_ERROR_OBLIGATORIO));
		} else {
			if (!Utilidades.isValidNif(solicitantes.getIdentificador01())
					&& !Utilidades.isValidNie(solicitantes.getIdentificador01())) {
				errorFields.add(new ErrorField(SolicitantesValidator.LABEL_IDENTIFICADOR01,
						UtilValidaciones.getMensajeValidaFormato(solicitantes.getIdentificador01())));
			}
		}

		// Validar que se ha cambiado algún dato
		if (errorFields.size() == com.ejie.ad74a.constantes.Constantes.CERO) {
			Solicitantes solicitantesAux = this.solicitantesService.find(solicitantes);

			if (solicitantesAux != null
					&& solicitantesAux.getTipoIdentificador01().equals(solicitantes.getTipoIdentificador01())
					&& solicitantesAux.getIdentificador01().equals(solicitantes.getIdentificador01())
					&& solicitantesAux.getNombre01().equals(solicitantes.getNombre01())
					&& solicitantesAux.getApellido101().equals(solicitantes.getApellido101())
					&& solicitantesAux.getApellido201().equals(solicitantes.getApellido201())
					&& solicitantesAux.getSexo01().equals(solicitantes.getSexo01())) {
				errorFields.add(new ErrorField(SolicitantesValidator.LABEL_ERROR_CAMBIO_TIT));
			}
		}

	}

}
