/**
 * 
 */
package com.ejie.ad74a.process;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import com.ejie.ad74a.exception.BatchProcessException;
import com.ejie.ad74a.model.Procesos;
import com.ejie.ad74a.model.Solicitante;
import com.ejie.ad74a.service.CopagoBeneficiarioService;
import com.ejie.ad74a.service.LiquidacionService;
import com.ejie.ad74a.service.ProcesosService;
import com.ejie.ad74a.util.constantes.EstadosProcesosBatchEnum;
import com.ejie.ad74a.util.constantes.ProcesosBatchEnum;

/**
 * Proceso para la generacion de liquidaciones pendientes de pago a demanda
 * mediante ID_EJEC_PROCESS
 * 
 * @author BICUGUAL
 *
 */

@Component(value = "liquidacionesPorMensualidad")
public class CopagoBeneficiariosByMensProcess implements IProcess {

	private static final Logger logger = LoggerFactory.getLogger(CopagoBeneficiariosByMensProcess.class);

	@Autowired
	private CopagoBeneficiarioService copBenService;

	@Autowired
	private LiquidacionService liqService;

	@Autowired
	private ProcesosService procesosService;

	/**
	 * Metodo de ejecucion del proceso.
	 * 
	 * @param arg[0] : Identificador de ejecucion
	 * @param arg[1] : idProceso tabla AD74A98T00 (opcional)
	 */
	@Override
	@Transactional(rollbackFor = Throwable.class)
	public void execute(String... args) throws BatchProcessException {

		Procesos proceso = new Procesos();
		try {

			String params = Arrays.asList(args).stream().map(i -> i).collect(Collectors.joining(", "));

			logger.debug("Params: {}", params);

			String idEjecucion = args[0];
			String idProceso = args.length == 2 ? args[1] : null;

			// Buscar si existe el proceso en bbdd
			boolean addProceso = false;
			if (idProceso == null || "".equals(idProceso)) {
				addProceso = true;
			} else {
				proceso = new Procesos(Long.valueOf(idProceso));
				proceso = this.procesosService.find(proceso);
				addProceso = null == proceso ? true : false;
			}

			if (addProceso) {
				// Creamos un proceso nuevo
				// 1- Insertar el nuevo proceso en la tabla AD74A98T00
				proceso = new Procesos();
				proceso.setEstado98(EstadosProcesosBatchEnum.PENDIENTE.getId());
				proceso.setUsuAlta98("AD74A");
				proceso.setTipoProceso98(ProcesosBatchEnum.COPAGO_BEN_MENS.getId());
				proceso.setProceso98(idEjecucion);
				proceso = this.procesosService.add(proceso);
			}

			this.procesosService.actualizarAIniciado(proceso);

			// Obtener solicitantes a procesar
			List<Solicitante> lstSolicitantes = copBenService
					.getLstSolicitantesConLiquidacionPendientePorMensualidades(idEjecucion);

			logger.info("Numero de solicitantes con liquidacion pendiente: {}", lstSolicitantes.size());

			if (!lstSolicitantes.isEmpty()) {
				/*[ihg] La liquidación se generó correctamente con anterioridad y está anulada desde SIPCA
				 * No es necesario hacer comprobaciones de datos ya que se relanzan mensualidades ya generadas
				 * correctamente*/
				// Generar liquidaciones
				liqService.generateLiquidacionesEspejo(lstSolicitantes, true, idEjecucion, false);
				// Volcar liquidaciones a tablas finales
				liqService.volcarLiquidacionesEspejoAFinales(idEjecucion);
			}

			this.procesosService.actualizarAFinalizado(proceso);

		} catch (Exception e) {
			if (proceso != null && proceso.getIdProceso98() != null) {
				proceso.setError98(e.getMessage().substring(0, Math.min(e.getMessage().length(), 799))); // Mï¿½ximo 800
				this.procesosService.actualizarAError(proceso);
			}
			throw new BatchProcessException(e);
		}

	}

}
