package com.ejie.ad74a.validacion;

import java.util.ArrayList;
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.exceptions.Mensaje;
import com.ejie.ad74a.exceptions.ParametroKey;
import com.ejie.ad74a.model.Ayuntamientos;
import com.ejie.ad74a.service.AyuntamientosService;
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.FormaPagoEnum;

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

	private static final String LABEL_CIF31 = "ayuntamiento.cif";
	private static final String LABEL_DESC_ES_31 = "ayuntamiento.descEs";
	private static final String LABEL_DESC_EU_31 = "ayuntamiento.descEu";
	private static final String LABEL_DIRECCION31 = "ayuntamiento.direccion";
	private static final String LABEL_NUMCUENTA31 = "ayuntamiento.numCuenta";
	private static final String LABEL_CONTACTO31 = "ayuntamiento.contacto";
	private static final String LABEL_FAUTORIZACION31 = "ayuntamiento.fAutorizacion";
	private static final String LABEL_FORMAPAGO31 = "ayuntamiento.formaPago";
	private static final String LABEL_DIAFACTURACION31 = "ayuntamiento.diaFacturacion";
	private static final String LABEL_PERIODICIDAD31 = "ayuntamiento.periodicidadMeses";
	private static final String LABEL_MUNICIPIOPROVINCIAREPETIDOS31 = "ayuntamiento.provinciaMunicipioRepetidos";
	private static final String LABEL_DESC_MUNICIPIOPROVINCIAREPETIDOS31 = "ayuntamiento.provinciaMunicipioRepetidosdesc";

	public static final int MAX_LENGTH_CIF31 = 10;
	public static final int MAX_LENGTH_DESC31 = 100;
	public static final int MAX_LENGTH_DIRECCION31 = 200;
	public static final int MAX_LENGTH_NUMCUENTA31 = 24;
	public static final int MAX_LENGTH_CONTACTO31 = 100;

	public static final int MIN_DIAFACTURACION = 1;
	public static final int MAX_DIAFACTURACION = 28;
	public static final int MIN_PERIODICIDAD = 1;
	public static final int MAX_PERIODICIDAD = 99;

	@Resource
	private ReloadableResourceBundleMessageSource appMessageSource;

	@Autowired
	private AyuntamientosService ayuntamientosService;

	public void validate(List<ErrorField> errorFields, Ayuntamientos ayuntamientos, String oper) {
		AyuntamientosValidator.LOGGER.info("AyuntamientosValidator: validate ");

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

		// validación ayuntamientos repetidos en caso de añadir
		if (oper.equals("anadir")) {
			Ayuntamientos filterAyuntamientos = new Ayuntamientos();
			filterAyuntamientos.setProvincia(ayuntamientos.getProvincia());
			filterAyuntamientos.setMunicipio(ayuntamientos.getMunicipio());
			if (this.ayuntamientosService.numAyuntamientoEnProvinciaYMunicipio(filterAyuntamientos) > 0) {
				errorFields.add(new ErrorField(AyuntamientosValidator.LABEL_MUNICIPIOPROVINCIAREPETIDOS31,
						AyuntamientosValidator.LABEL_DESC_MUNICIPIOPROVINCIAREPETIDOS31));
			}
		}

		// #########################
		// ###### CIF31 ######
		// #########################

		// # Demasiados Caracteres #
		if (Boolean.TRUE.equals(
				!Utilidades.validarLongitud(ayuntamientos.getCif31(), AyuntamientosValidator.MAX_LENGTH_CIF31))) {
			errorFields
					.add(new ErrorField(AyuntamientosValidator.LABEL_CIF31, UtilValidaciones.getMensajeValidaLongitud(
							Utilidades.getLength(ayuntamientos.getCif31()), AyuntamientosValidator.MAX_LENGTH_CIF31)));
		}
		// # Vacío #
		if (Boolean.TRUE.equals(Utilidades.isEmpty(ayuntamientos.getCif31()))) {
			errorFields
					.add(new ErrorField(AyuntamientosValidator.LABEL_CIF31, UtilValidaciones.LABEL_ERROR_OBLIGATORIO));
		} else if (!UtilValidaciones.isValidCif(ayuntamientos.getCif31())) {
			errorFields.add(new ErrorField(AyuntamientosValidator.LABEL_CIF31, UtilValidaciones.LABEL_ERROR_FORMATO));
		}

		// #########################
		// #### DENOMINACION31 ####
		// #########################

		// # Demasiados Caracteres #
		if (Boolean.TRUE.equals(
				!Utilidades.validarLongitud(ayuntamientos.getDescEs31(), AyuntamientosValidator.MAX_LENGTH_DESC31))) {
			errorFields.add(new ErrorField(AyuntamientosValidator.LABEL_DESC_ES_31,
					UtilValidaciones.getMensajeValidaLongitud(Utilidades.getLength(ayuntamientos.getDescEs31()),
							AyuntamientosValidator.MAX_LENGTH_DESC31)));
		}
		if (Boolean.TRUE.equals(
				!Utilidades.validarLongitud(ayuntamientos.getDescEs31(), AyuntamientosValidator.MAX_LENGTH_DESC31))) {
			errorFields.add(new ErrorField(AyuntamientosValidator.LABEL_DESC_EU_31,
					UtilValidaciones.getMensajeValidaLongitud(Utilidades.getLength(ayuntamientos.getDescEs31()),
							AyuntamientosValidator.MAX_LENGTH_DESC31)));
		}

		// #########################
		// ###### DIRECCION31 ######
		// #########################

		// # Demasiados Caracteres #
		if (Boolean.TRUE.equals(!Utilidades.validarLongitud(ayuntamientos.getDireccion31(),
				AyuntamientosValidator.MAX_LENGTH_DIRECCION31))) {
			errorFields.add(new ErrorField(AyuntamientosValidator.LABEL_DIRECCION31,
					UtilValidaciones.getMensajeValidaLongitud(Utilidades.getLength(ayuntamientos.getDireccion31()),
							AyuntamientosValidator.MAX_LENGTH_DIRECCION31)));
		}
		if (Boolean.TRUE.equals(!Utilidades.validarLongitud(ayuntamientos.getDireccion31(),
				AyuntamientosValidator.MAX_LENGTH_DIRECCION31))) {
			errorFields.add(new ErrorField(AyuntamientosValidator.LABEL_DIRECCION31,
					UtilValidaciones.getMensajeValidaLongitud(Utilidades.getLength(ayuntamientos.getDireccion31()),
							AyuntamientosValidator.MAX_LENGTH_DIRECCION31)));
		}

		// #########################
		// ##### NUMCUENTA31 #######
		// #########################

		if (Boolean.TRUE.equals(Utilidades.isEmptyNumber(ayuntamientos.getFormaPago31()))) {
			errorFields.add(
					new ErrorField(AyuntamientosValidator.LABEL_FORMAPAGO31, UtilValidaciones.LABEL_ERROR_OBLIGATORIO));
		} else if (FormaPagoEnum.LIQ_DOM.getId().equals(ayuntamientos.getFormaPago31().toString())) {
			// # Demasiados Caracteres #
			if (Boolean.TRUE.equals(!Utilidades.validarLongitud(ayuntamientos.getNumCuenta31(),
					AyuntamientosValidator.MAX_LENGTH_NUMCUENTA31))) {
				errorFields.add(new ErrorField(AyuntamientosValidator.LABEL_NUMCUENTA31,
						UtilValidaciones.getMensajeValidaLongitud(Utilidades.getLength(ayuntamientos.getNumCuenta31()),
								AyuntamientosValidator.MAX_LENGTH_NUMCUENTA31)));
			}
			// # Vacío #
			if (Boolean.TRUE.equals(Utilidades.isEmpty(ayuntamientos.getNumCuenta31()))) {
				errorFields.add(new ErrorField(AyuntamientosValidator.LABEL_NUMCUENTA31,
						UtilValidaciones.LABEL_ERROR_OBLIGATORIO));
			} else {
				// Validar IBAN
				if (!UtilValidaciones.isIBANCorrecto(ayuntamientos.getNumCuenta31())) {
					errorFields.add(new ErrorField(AyuntamientosValidator.LABEL_NUMCUENTA31,
							UtilValidaciones.LABEL_ERROR_IBAN));
				}
			}

			// #########################
			// #### FAUTORIZACION31 ####
			// #########################
			if (ayuntamientos.getfAutorizacion31() == null) {
				errorFields.add(new ErrorField(AyuntamientosValidator.LABEL_FAUTORIZACION31,
						UtilValidaciones.LABEL_ERROR_OBLIGATORIO));
			}
		}

		// #########################
		// #### DIAFACTURACION31 ###
		// #########################
		// # Vacío #
		if (Boolean.TRUE.equals(Utilidades.isEmptyNumber(ayuntamientos.getDiaFacturacion31()))) {
			errorFields.add(new ErrorField(AyuntamientosValidator.LABEL_DIAFACTURACION31,
					UtilValidaciones.LABEL_ERROR_OBLIGATORIO));
		} else {
			if (ayuntamientos.getDiaFacturacion31() < MIN_DIAFACTURACION
					|| ayuntamientos.getDiaFacturacion31() > MAX_DIAFACTURACION) {
				List<ParametroKey> listaParametros = new ArrayList<ParametroKey>();
				listaParametros.add(new ParametroKey(String.valueOf(MIN_DIAFACTURACION), false));
				listaParametros.add(new ParametroKey(String.valueOf(MAX_DIAFACTURACION), false));

				Mensaje mensaje = new Mensaje(UtilValidaciones.LABEL_ERROR_RANGO_MIN_MAX);
				mensaje.setParametrosKey(listaParametros);

				errorFields.add(new ErrorField(AyuntamientosValidator.LABEL_DIAFACTURACION31, mensaje));
			}
		}

		// #########################
		// #### PERIODICIDAD31 #####
		// #########################
		// # Vacío #
		if (Boolean.TRUE.equals(Utilidades.isEmptyNumber(ayuntamientos.getPeriodicidad31()))) {
			errorFields.add(new ErrorField(AyuntamientosValidator.LABEL_PERIODICIDAD31,
					UtilValidaciones.LABEL_ERROR_OBLIGATORIO));
		} else {
			if (ayuntamientos.getPeriodicidad31() < MIN_PERIODICIDAD
					|| ayuntamientos.getPeriodicidad31() > MAX_PERIODICIDAD) {
				List<ParametroKey> listaParametros = new ArrayList<ParametroKey>();
				listaParametros.add(new ParametroKey(String.valueOf(MIN_PERIODICIDAD), false));
				listaParametros.add(new ParametroKey(String.valueOf(MAX_PERIODICIDAD), false));

				Mensaje mensaje = new Mensaje(UtilValidaciones.LABEL_ERROR_RANGO_MIN_MAX);
				mensaje.setParametrosKey(listaParametros);

				errorFields.add(new ErrorField(AyuntamientosValidator.LABEL_PERIODICIDAD31, mensaje));
			}
		}

		// #########################
		// #### CONTACTO31 #####
		// #########################
		if (Boolean.TRUE.equals(!Utilidades.validarLongitud(ayuntamientos.getContacto31(),
				AyuntamientosValidator.MAX_LENGTH_CONTACTO31))) {
			errorFields.add(new ErrorField(AyuntamientosValidator.LABEL_CONTACTO31,
					UtilValidaciones.getMensajeValidaLongitud(Utilidades.getLength(ayuntamientos.getContacto31()),
							AyuntamientosValidator.MAX_LENGTH_CONTACTO31)));
		}
	}
}
