/*
* 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.control.ae01b;

import com.ejie.ad74a.service.ProcesosService;
import com.ejie.ad74a.service.ae01b.CopagosCargosMensualesService;
import com.ejie.ad74a.util.comun.UtilLiterales;
import com.ejie.ad74a.util.constantes.EstadosProcesosBatchEnum;
import com.ejie.ad74a.util.constantes.ProcesosBatchEnum;
import com.ejie.ad74a.util.constantes.ae01b.TerritoriosSipcaEnum;
import com.ejie.x38.control.bind.annotation.RequestJsonBody;
import com.ejie.x38.dto.TableRequestDto;
import com.ejie.x38.dto.TableResponseDto;
import com.ejie.x38.util.DateTimeManager;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.support.ByteArrayMultipartFileEditor;

import com.ejie.ad74a.control.FacturacionAyuntamientosController;
import com.ejie.ad74a.exceptions.Ad74aException;
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.CopagosSeguimiento;

/**
 * CopagosCargosMensualesController generated by UDA, 27-jun-2023 9:31:07.
 * 
 * @author UDA
 */
@Controller
@RequestMapping(value = "/copagoscargosmensuales")
public class CopagosCargosMensualesController {
	private static final Logger logger = LoggerFactory.getLogger(CopagosCargosMensualesController.class);

	@Autowired
	private CopagosCargosMensualesService copagosCargosMensualesService;

	@Autowired
	private ProcesosService procesosService;

	@Autowired
	private ReloadableResourceBundleMessageSource appMessageSource;

	@InitBinder
	protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws ServletException {
		binder.registerCustomEditor(byte[].class, new ByteArrayMultipartFileEditor());
		binder.registerCustomEditor(Date.class,
				new CustomDateEditor(DateTimeManager.getDateTimeFormat(LocaleContextHolder.getLocale()), true));
	}

	/*
	 * OPERACIONES CRUD (Create, Read, Update, Delete)
	 */

	/**
	 * Devuelve una lista de beans correspondientes a los valores de filtrados
	 * indicados en el objeto pasado como parámetro.
	 *
	 * @param filterCopagosCargosMensuales Objeto CopagosCargosMensuales que
	 *                                     contiene los parámetros de filtrado
	 *                                     utilizados en la búsqueda.
	 *
	 * @return List<CopagosCargosMensuales> Lista de objetos correspondientes a la
	 *         búsqueda realizada.
	 */
	@RequestMapping(method = RequestMethod.GET)
	public @ResponseBody List<CopagosCargosMensuales> getAll(
			@ModelAttribute CopagosCargosMensuales filterCopagosCargosMensuales) {
		CopagosCargosMensualesController.logger.info("[GET - find_ALL] : Obtener CopagosCargosMensuales por filtro");
		return this.copagosCargosMensualesService.findAll(filterCopagosCargosMensuales, null);
	}

	/*
	 * MÉTODOS COMPONENTE RUP_TABLE
	 */

	/**
	 * Método de presentación del RUP_TABLE.
	 * 
	 * @param model Model
	 *
	 * @return String
	 */
	@RequestMapping(value = "/maint", method = RequestMethod.GET)
	public String getMaint(Model model) {
		CopagosCargosMensualesController.logger.info("[GET - View] : copagoscargosmensuales");
		model.addAttribute("territorios", TerritoriosSipcaEnum.values());
		model.addAttribute("copagoscargosmensuales", new CopagosCargosMensuales());
		return "copagoscargosmensuales";
	}

	/**
	 * Operación de filtrado del componente RUP_TABLE.
	 * 
	 * @param filterCopagosCargosMensuales Bean CopagosCargosMensuales que contiene
	 *                                     los parámetros de filtrado a emplear.
	 * @param tableRequestDto              Dto que contiene los parámetros de
	 *                                     configuración propios del RUP_TABLE a
	 *                                     aplicar en el filtrado.
	 *
	 * @return TableResourceResponseDto<CopagosCargosMensuales> Dto que contiene el
	 *         resultado del filtrado realizado por el componente RUP_TABLE.
	 */
	@RequestMapping(value = "/filter", method = RequestMethod.POST)
	public @ResponseBody TableResponseDto<CopagosCargosMensuales> filter(
			@RequestJsonBody(param = "filter") CopagosCargosMensuales filterCopagosCargosMensuales,
			@RequestJsonBody TableRequestDto tableRequestDto) {
		CopagosCargosMensualesController.logger.info("[POST - filter] : Obtener CopagosCargosMensuales");
		return this.copagosCargosMensualesService.filter(filterCopagosCargosMensuales, tableRequestDto, false);
	}

	@RequestMapping(value = "/relanzarCargos", method = RequestMethod.POST)
	public @ResponseBody Procesos relanzarCargos(@RequestBody List<CopagosCargosMensuales> listCopagosCargosMensuales,
			HttpServletRequest request) {

//		List<String> params_list = new ArrayList<String>();
//		
//
//		// 1.- Comprobar si ya existe un proceso de añadir o recalcular sin finalizar
//		Procesos proceso = new Procesos();
//		for (CopagosCargosMensuales copagosCargosMensuales : listCopagosCargosMensuales) {
//			proceso.setTipoProceso98(ProcesosBatchEnum.COPAGO_BEN_MENS.getId());
//			proceso.setProceso98(copagosCargosMensuales.getMensualidad());
//			List<Integer> tiposProcesoFilter = new ArrayList<Integer>();
//			tiposProcesoFilter.add(ProcesosBatchEnum.COPAGO_BEN_MENS.getId());
//			proceso.setTiposProcesoFilter(tiposProcesoFilter);
//
//			List<String> estadosFilter = new ArrayList<String>();
//			estadosFilter.add(EstadosProcesosBatchEnum.PENDIENTE.getId());
//			estadosFilter.add(EstadosProcesosBatchEnum.INICIADO.getId());
//			proceso.setEstadosFilter(estadosFilter);
//
//			List<Procesos> procesosList = this.procesosService.findAllLike(proceso, null, false);
//			if (!procesosList.isEmpty()) {
//				// TODO: devolver error. Ver como se está haciendo en otras llamadas
//				// TODO: internacionalizar mensaje
//				params_list.add(copagosCargosMensuales.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));
//		}
		Procesos proceso = this.copagosCargosMensualesService.relanzarCargos(listCopagosCargosMensuales, request);
		CopagosCargosMensualesController.logger.info("[POST] : anadirPago correctamente");

		return proceso;
	}

}
