package com.ejie.ad74a.service;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.ejie.ad74a.dao.NotifPostalesDao;
import com.ejie.ad74a.exception.Ad74aException;
import com.ejie.ad74a.exception.Ad74aWebserviceException;
import com.ejie.ad74a.model.NotifPostales;
import com.ejie.ad74a.util.constantes.ConstantesBatch;
import com.ejie.ad74a.util.constantes.TipoNotificacionComunicacionEnum;
import com.ejie.x38.dto.TableRequestDto;

/**
 * NotifPostalesServiceImpl generated by UDA, 09-ene-2024 16:08:21.
 * 
 * @author UDA
 */

@Service(value = "notifPostalesService")
public class NotifPostalesServiceImpl implements NotifPostalesService {

	@Autowired
	private NotifPostalesDao notifPostalesDao;

	@Autowired
	private RemesasService remesasService;


	// Sin limite de tiempo por transaccion
	@Override
	public List<NotifPostales> updateMultipleSituacionEnvio(List<NotifPostales> notifPostalesList) {
		if (CollectionUtils.isEmpty(notifPostalesList)) {
			return notifPostalesList;
		}
		try {
			// Por cada elemento se recupera su situación en AA66 y se actualiza (solo si es
			// una notificacion y no se encuentra en un estado FINAL)
			List<NotifPostales> itemsActualizar = new ArrayList<>();
			for (NotifPostales item : notifPostalesList) {
				if (TipoNotificacionComunicacionEnum.NOTIFICACION.getValor().equalsIgnoreCase(item.getTipoNot88())
						&& !ConstantesBatch.VAL_NUM_SI.equals(item.getFinalizada88())) {
					remesasService.obtenerSituacionEnvio(item);
					itemsActualizar.add(item);
				}
			}
			// Si no han ocurrido errores, se actualizan las situaciones en bbdd
			if (CollectionUtils.isNotEmpty(itemsActualizar)) {
				notifPostalesDao.updateMultiple(itemsActualizar);
			}
		} catch (Ad74aWebserviceException e) {
			throw new Ad74aException(e);
		}
		return notifPostalesList;
	}

	/**
	 * Updates a single row in the NotifPostales table.
	 *
	 * @param notifPostales NotifPostales
	 * @return NotifPostales
	 */
	@Override
	@Transactional(rollbackFor = Throwable.class)
	public NotifPostales update(NotifPostales notifPostales) {
		return this.notifPostalesDao.update(notifPostales);
	}

	/**
	 * Finds a single row in the NotifPostales table.
	 *
	 * @param notifPostales NotifPostales
	 * @return NotifPostales
	 */
	@Override
	public NotifPostales find(NotifPostales notifPostales) {
		return this.notifPostalesDao.find(notifPostales);
	}

	/**
	 * Finds rows in the NotifPostales table using like.
	 *
	 * @param notifPostales   NotifPostales
	 * @param tableRequestDto TableRequestDto
	 * @param startsWith      Boolean
	 * @return List<NotifPostales>
	 */
	@Override
	public List<NotifPostales> findAllLike(NotifPostales notifPostales, TableRequestDto tableRequestDto,
			Boolean startsWith) {
		return this.notifPostalesDao.findAllLike(notifPostales, tableRequestDto, startsWith);
	}

}
