package com.ejie.ad74a.service.impl;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.ejie.ad74a.exception.Ad74aWebserviceException;
import com.ejie.ad74a.model.NotifPostales;
import com.ejie.ad74a.service.RemesasService;
import com.ejie.ad74a.util.constantes.ConstantesBatch;
import com.ejie.ad74a.ws.client.remesas.AA66Notificaciones;
import com.ejie.ad74a.ws.client.remesas.IdentTramitadorCondicionalWs;
import com.ejie.ad74a.ws.client.remesas.SituacionEntregaWs;

/**
 * Servicio que engloba la integracion con la pasarela de notificaciones AA66.
 * 
 * @author ¿?, JBHG
 *
 */
@Service(value = "Remesas")
public class RemesasServiceImpl implements RemesasService {

	/**
	 * Final static logger.
	 */
	private static final Logger logger = LoggerFactory.getLogger(RemesasServiceImpl.class);

	private final DateFormat situacionDateFormatter = new SimpleDateFormat("dd/MM/yyyy");

	@Autowired
	private AA66Notificaciones aa66Notificaciones;

	@Override
	public NotifPostales obtenerSituacionEnvio(NotifPostales notifPostales) throws Ad74aWebserviceException {
		logger.debug("obtenerSituacionEnvio {}", notifPostales);
		IdentTramitadorCondicionalWs envioSituacion = new IdentTramitadorCondicionalWs();
		// Envio indicado en el registro de la notificacion
		envioSituacion.setId(notifPostales.getIdEnvioPostal88());
		// Puesto indicado en el registro de la notificacion
		envioSituacion.setUidPuestoTramitador(notifPostales.getPostalInboxId88());
		envioSituacion.setTodas(true);
		/*
		 * Obtener situacion de la notificacion
		 */
		SituacionEntregaWs situacionEntregaWs = aa66Notificaciones.situacionEntregaEnvio(envioSituacion);
		/*
		 * Si se ha producido algun error:
		 */
		if (situacionEntregaWs.getError() != null
				&& StringUtils.isNotBlank(situacionEntregaWs.getError().getCodigoError())) {
			String message = situacionEntregaWs.getError().getDescripcionCastellano();
			message += " (" + situacionEntregaWs.getError().getCodigoError() + ")";
			throw new Ad74aWebserviceException(message);
		} else if (situacionEntregaWs.getIdEnvio() == 0) {
			// Si el idEnvio devuelto es 0, quiere decir que ha habido algun problema con la
			// lllamada, y el objeto de respuesta no coincide con SituacionEntregaWs

			throw new Ad74aWebserviceException("Error en llamada a ws situacionEntregaEnvio");
		}
		/*
		 * Si no se ha producido error, se cargan los datos de la situación:
		 */
		try {
			notifPostales.setCodSituacionPostal88(situacionEntregaWs.getCodigoSituacion());
			notifPostales.setSituacionPostalEs88(situacionEntregaWs.getDescripcionCastellano());
			notifPostales.setSituacionPostalEu88(situacionEntregaWs.getDescripcionEuskera());
			notifPostales.setFechaSituacion88(situacionDateFormatter.parse(situacionEntregaWs.getFechaSituacion()));
			// Calcular si es un estado final
			Integer finalizada = ConstantesBatch.VAL_NUM_NO;
			// miramos si su descripcion tiene el literal "(Final)" para saber si esta en un
			// estado final
			if (situacionEntregaWs.getDescripcionCastellano().contains("(Final)")) {
				finalizada = ConstantesBatch.VAL_NUM_SI;
			}
			notifPostales.setFinalizada88(finalizada);
			return notifPostales;
		} catch (ParseException e) {
			throw new Ad74aWebserviceException(e.getMessage());
		}
	}

}