/*
* Copyright 2021 E.J.I.E., S.A.
*
* Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);
* Solo podrá usarse esta obra si se respeta la Licencia.
* Puede obtenerse una copia de la Licencia en
*
* http://ec.europa.eu/idabc/eupl.html
*
* Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,
* el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,
* SIN GARANT�?AS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.
* Véase la Licencia en el idioma concreto que rige los permisos y limitaciones
* que establece la Licencia.
*/
package com.ejie.ad74a.service.ae01b;

import com.ejie.ad74a.dao.ae01b.CopagosCargosMensualesDao;
import com.ejie.ad74a.exceptions.Ad74aException;
import com.ejie.x38.dto.TableRequestDto;
import com.ejie.x38.dto.TableResponseDto;
import com.ejie.x38.dto.TableRowDto;

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

import javax.servlet.http.HttpServletRequest;

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.Service;

import com.ejie.ad74a.model.Mensualidades;
import com.ejie.ad74a.model.Procesos;
import com.ejie.ad74a.model.ae01b.CopagosCargosMensuales;
import com.ejie.ad74a.model.ae01b.CopagosGestionImpagos;
import com.ejie.ad74a.service.MensualidadesService;
import com.ejie.ad74a.service.ProcesosService;
import com.ejie.ad74a.util.comun.UtilLiterales;
import com.ejie.ad74a.util.comun.UtilSeguridad;
import com.ejie.ad74a.util.constantes.EstadosProcesosBatchEnum;
import com.ejie.ad74a.util.constantes.ProcesosBatchEnum;

/**
 * CopagosCargosMensualesServiceImpl generated by UDA, 28-jun-2023 10:59:26.
 * 
 * @author UDA
 */

@Service(value = "copagosCargosMensualesService")
public class CopagosCargosMensualesServiceImpl implements CopagosCargosMensualesService {
	private static final Logger logger = LoggerFactory.getLogger(CopagosCargosMensualesServiceImpl.class);

	@Autowired
	private CopagosCargosMensualesDao copagosCargosMensualesDao;

	@Autowired
	private ProcesosService procesosService;

	@Autowired
	private MensualidadesService mensualidadesService;

	@Autowired
	private ReloadableResourceBundleMessageSource appMessageSource;

	/**
	 * Finds a list of rows in the CopagosCargosMensuales table.
	 *
	 * @param copagosCargosMensuales CopagosCargosMensuales
	 * @param tableRequestDto        TableRequestDto
	 *
	 * @return List<CopagosCargosMensuales>
	 */
	public List<CopagosCargosMensuales> findAll(CopagosCargosMensuales copagosCargosMensuales,
			TableRequestDto tableRequestDto) {
		return (List<CopagosCargosMensuales>) this.copagosCargosMensualesDao.findAll(copagosCargosMensuales,
				tableRequestDto);
	}

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

	/*
	 * OPERACIONES RUP_TABLE
	 */

	/**
	 * Filter method in the CopagosCargosMensuales table.
	 *
	 * @param filterCopagosCargosMensuales CopagosCargosMensuales
	 * @param tableRequestDto              TableRequestDto
	 * @param startsWith                   Boolean
	 *
	 * @return TableResponseDto<CopagosCargosMensuales>
	 */
	public TableResponseDto<CopagosCargosMensuales> filter(CopagosCargosMensuales filterCopagosCargosMensuales,
			TableRequestDto tableRequestDto, Boolean startsWith) {
		List<CopagosCargosMensuales> listaCopagosCargosMensuales = this.copagosCargosMensualesDao
				.findAllLike(filterCopagosCargosMensuales, tableRequestDto, false);
		Long recordNum = this.copagosCargosMensualesDao.findAllLikeCount(
				filterCopagosCargosMensuales != null ? filterCopagosCargosMensuales : new CopagosCargosMensuales(),
				false);
		TableResponseDto<CopagosCargosMensuales> tableResponseDto = new TableResponseDto<CopagosCargosMensuales>(
				tableRequestDto, recordNum, listaCopagosCargosMensuales);

//		if (tableRequestDto.getMultiselection().getSelectedIds() != null
//				&& !tableRequestDto.getMultiselection().getSelectedIds().isEmpty()) {
//			List<TableRowDto<CopagosCargosMensuales>> reorderSelection = this.copagosCargosMensualesDao
//					.reorderSelection(filterCopagosCargosMensuales, tableRequestDto, startsWith);
//			tableResponseDto.setReorderedSelection(reorderSelection);
//			tableResponseDto.addAdditionalParam("reorderedSelection", reorderSelection);
//			tableResponseDto.addAdditionalParam("selectedAll", tableRequestDto.getMultiselection().getSelectedAll());
//		}
//		if (tableRequestDto.getSeeker().getSelectedIds() != null) {
//			tableRequestDto.setMultiselection(tableRequestDto.getSeeker());
//			List<TableRowDto<CopagosCargosMensuales>> reorderSeeker = this.copagosCargosMensualesDao
//					.reorderSelection(filterCopagosCargosMensuales, tableRequestDto, startsWith);
//			tableResponseDto.setReorderedSeeker(reorderSeeker);
//			tableResponseDto.addAdditionalParam("reorderedSeeker", reorderSeeker);
//		}
		return tableResponseDto;
	}

	/**
	 * Reorder the selection made in CopagosCargosMensuales table.
	 *
	 * @param filterCopagosCargosMensuales CopagosCargosMensuales
	 * @param tableRequestDto              TableRequestDto
	 * @param startsWith                   Boolean
	 *
	 * @return Object
	 */
	public Object reorderSelection(CopagosCargosMensuales filterCopagosCargosMensuales, TableRequestDto tableRequestDto,
			Boolean startsWith) {
		return this.copagosCargosMensualesDao.reorderSelection(filterCopagosCargosMensuales, tableRequestDto,
				startsWith);
	}

	@Override
	public Procesos relanzarCargos(List<CopagosCargosMensuales> listaCopagos, HttpServletRequest request) {

		List<String> params_list = new ArrayList<String>();
		Procesos procesoFilter = new Procesos();
		UUID idEjecucion = UUID.randomUUID();

		// 1.- recoger cada mensualidad que llega a la llamada y comprobar si tiene el
		// campo ID_EJECUCION_PROCES_89
		for (CopagosCargosMensuales copago : listaCopagos) {
			Mensualidades mens = this.mensualidadesService.find(new Mensualidades(copago.getMensualidad()));
			// if (null != mens.getIdEjecProces89()) {
			// 2.- si alguno tiene filtrar la tabla procesos por si ya se ha lanzado un
			// proceso a esa mensualidad para sacar el error

			procesoFilter.setTipoProceso98(ProcesosBatchEnum.COPAGO_BEN_MENS.getId());
			// procesoFilter.setProceso98(mens.getIdEjecProces89());
			List<Integer> tiposProcesoFilter = new ArrayList<Integer>();
			tiposProcesoFilter.add(ProcesosBatchEnum.COPAGO_BEN_MENS.getId());
			procesoFilter.setTiposProcesoFilter(tiposProcesoFilter);

			List<String> estadosFilter = new ArrayList<String>();
			estadosFilter.add(EstadosProcesosBatchEnum.PENDIENTE.getId());
			estadosFilter.add(EstadosProcesosBatchEnum.INICIADO.getId());
			procesoFilter.setEstadosFilter(estadosFilter);

			List<Procesos> procesosList = this.procesosService.findAllLike(procesoFilter, null, false);
			if (!procesosList.isEmpty()) {
				params_list.add(copago.getRefLiquidacion());

			}

			// }
			if (params_list.size() > 0) {
				String params = "";
				String separador = "";
				for (String param : params_list) {
					params += separador + param;
					separador = ", ";
				}
				String[] paramsObj = { params };

//				throw new Ad74aException(UtilLiterales.getLiteralMessageWithParams(appMessageSource,
//						"copagosCargosMensuales.error.procesoEnEjecucion", paramsObj));
				throw new Ad74aException(UtilLiterales.getLiteralMessage(appMessageSource,
						"copagosCargosMensuales.error.procesoYaEnEjecucion"));
			}
			// 3.- si no hay error asignarles el ID_EJECUCION_PROCES_89 con el randomicer
			mens.setIdEjecProces89(idEjecucion.toString());
			this.mensualidadesService.updateProceso(mens);

		}
		// 4.- Añadir el id randomizado en los parámetros y lanzar el proceso
		Procesos lanzarProceso = new Procesos();
		lanzarProceso.setTipoProceso98(ProcesosBatchEnum.COPAGO_BEN_MENS.getId());
		lanzarProceso.setProceso98(idEjecucion.toString());
		lanzarProceso.setEstado98(EstadosProcesosBatchEnum.PENDIENTE.getId());
		lanzarProceso.setUsuAlta98(UtilSeguridad.getNameUsuarioConectado());
		lanzarProceso = this.procesosService.add(lanzarProceso);

		// llamada a la O75
		try {
			String result = this.procesosService.lanzarPeticion_relanzarCargos_O75(lanzarProceso, request);
			lanzarProceso.setResultadoPeticion(result);
		} catch (Exception e) {
			// Actualizar a error el proceso
			lanzarProceso.setEstado98(EstadosProcesosBatchEnum.ERROR.getId());
			lanzarProceso.setError98(e.getMessage().substring(0, Math.min(e.getMessage().length(), 799))); // Máximo 800
			this.procesosService.actualizarAError(lanzarProceso);
			throw new Ad74aException(e.getMessage());
		}

		logger.debug("relanzarCargos proceso " + lanzarProceso == null ? "es null"
				: lanzarProceso.getIdProceso98().toString());
		return lanzarProceso;
	}

//	private Procesos relanzarCargosProces(Mensualidades mensualidad, HttpServletRequest request) {
//
//		// 1- Insertar el nuevo proceso en la tabla 98
//		Procesos proceso = new Procesos();
//		proceso.setTipoProceso98(ProcesosBatchEnum.COPAGO_BEN_MENS.getId());
//		proceso.setProceso98(mensualidad.getIdMensualidad89().toString());
//		proceso.setEstado98(EstadosProcesosBatchEnum.PENDIENTE.getId());
//		proceso.setUsuAlta98(UtilSeguridad.getNameUsuarioConectado());
//		proceso = this.procesosService.add(proceso);
//
//		// 2.- llamada a la O75
//		try {
//			String result = this.procesosService.lanzarPeticion_relanzarCargos_O75(proceso, mensualidad, request);
//			proceso.setResultadoPeticion(result);
//		} catch (Exception e) {
//			// Actualizar a error el proceso
//			proceso.setEstado98(EstadosProcesosBatchEnum.ERROR.getId());
//			proceso.setError98(e.getMessage().substring(0, Math.min(e.getMessage().length(), 799))); // Máximo 800
//			this.procesosService.actualizarAError(proceso);
//			throw new Ad74aException(e.getMessage());
//		}
//		logger.debug(
//				"relanzarCargosProcess proceso " + proceso == null ? "es null" : proceso.getIdProceso98().toString());
//		return proceso;
//
//	}
}
