package com.ejie.ad74a.control;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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.http.HttpStatus;
import org.springframework.http.MediaType;
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.bind.annotation.ResponseStatus;
import org.springframework.web.multipart.support.ByteArrayMultipartFileEditor;

import com.ejie.ad74a.exceptions.ManagerErrors;
import com.ejie.ad74a.model.BandejaTelematica;
import com.ejie.ad74a.model.Combo;
import com.ejie.ad74a.model.DocumentosBanTel;
import com.ejie.ad74a.service.BandejaTelematicaService;
import com.ejie.ad74a.util.comun.UtilWeb;
import com.ejie.ad74a.util.comun.Utilidades;
import com.ejie.ad74a.util.constantes.Constantes;
import com.ejie.ad74a.util.constantes.ErroresExpedienteEnum;
import com.ejie.ad74a.util.constantes.ProcedimientosEnum;
import com.ejie.ad74a.util.constantes.TipoAportacionEnum;
import com.ejie.ad74a.util.constantes.TipoProcesoEnum;
import com.ejie.ad74a.util.pif.Ad74aPIFws;
import com.ejie.ad74a.ws.client.dokusi.gestDocumental.T65Content;
import com.ejie.ad74a.ws.client.dokusi.service.DokusiService;
import com.ejie.x38.control.bind.annotation.RequestJsonBody;
import com.ejie.x38.dto.JerarquiaDto;
import com.ejie.x38.dto.TableRequestDto;
import com.ejie.x38.dto.TableResponseDto;
import com.ejie.x38.dto.TableRowDto;
import com.ejie.x38.util.DateTimeManager;

/**
 * BandejaTelematicaController generated by UDA, 28-mar-2023 10:21:56.
 * 
 * @author UDA
 */

@Controller
@RequestMapping(value = "/bandejatelematica")

public class BandejaTelematicaController {

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

	@Autowired
	private BandejaTelematicaService bandejaTelematicaService;

	@Autowired
	private DokusiService dokusiService;

	@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)
	 * 
	 */

	/**
	 * Operacion CRUD Read. Devuelve el bean correspondiente al identificador
	 * indicado.
	 * 
	 * @param idEntrada14 BigDecimal
	 * @return BandejaTelematica Objeto correspondiente al identificador indicado.
	 */
	@RequestMapping(value = "/{idEntrada14}", method = RequestMethod.GET)
	public @ResponseBody BandejaTelematica get(@PathVariable Long idEntrada14) {
		BandejaTelematica bandejaTelematica = new BandejaTelematica();
		bandejaTelematica.setIdEntrada14(idEntrada14);
		bandejaTelematica = this.bandejaTelematicaService.find(bandejaTelematica);
		BandejaTelematicaController.logger.info("[GET - findBy_PK] : Obtener BandejaTelematica por PK");
		return bandejaTelematica;
	}

	/**
	 * Devuelve una lista de beans correspondientes a los valores de filtrados
	 * indicados en el objeto pasado como parametro.
	 *
	 * @param filterBandejaTelematica BandejaTelematica Objeto que contiene los
	 *                                parametros de filtrado utilizados en la
	 *                                busqueda.
	 * @return List<BandejaTelematica> Lista de objetos correspondientes a la
	 *         busqueda realizada.
	 */
	@RequestMapping(method = RequestMethod.GET)
	public @ResponseBody List<BandejaTelematica> getAll(@ModelAttribute BandejaTelematica filterBandejaTelematica) {
		BandejaTelematicaController.logger.info("[GET - find_ALL] : Obtener BandejaTelematica por filtro");
		return this.bandejaTelematicaService.findAll(filterBandejaTelematica, null);
	}

	/**
	 * Operacion CRUD Edit. Modificacion del bean indicado.
	 *
	 * @param bandejaTelematica BandejaTelematica Bean que contiene la informacion a
	 *                          modificar.
	 * @return BandejaTelematica Bean resultante de la modificacion.
	 */
	@RequestMapping(value = "/edit", method = RequestMethod.PUT)
	public @ResponseBody BandejaTelematica edit(@RequestBody BandejaTelematica bandejaTelematica) {
		BandejaTelematica bandejaTelematicaAux = this.bandejaTelematicaService.update(bandejaTelematica);
		BandejaTelematicaController.logger.info("[PUT] : BandejaTelematica actualizado correctamente");
		return bandejaTelematicaAux;
	}

	/**
	 * Operacion CRUD Create. Creacion de un nuevo registro a partir del bean
	 * indicado.
	 *
	 * @param bandejaTelematica BandejaTelematica Bean que contiene la informacion
	 *                          con la que se va a crear el nuevo registro.
	 * @return BandejaTelematica Bean resultante del proceso de creacion.
	 */
	@RequestMapping(value = "/add", method = RequestMethod.POST)
	public @ResponseBody BandejaTelematica add(@RequestBody BandejaTelematica bandejaTelematica) {
		BandejaTelematica bandejaTelematicaAux = this.bandejaTelematicaService.add(bandejaTelematica);
		BandejaTelematicaController.logger.info("[POST] : BandejaTelematica insertado correctamente");
		return bandejaTelematicaAux;
	}

	/**
	 * Operacion CRUD Delete. Borrado del registro correspondiente al identificador
	 * especificado.
	 *
	 * @param idEntrada14 BigDecimal Identificador del objeto que se desea eliminar.
	 * @return BandejaTelematica Bean eliminado.
	 */
	@RequestMapping(value = "/{idEntrada14}", method = RequestMethod.DELETE)
	@ResponseStatus(value = HttpStatus.OK)
	public @ResponseBody BandejaTelematica remove(@PathVariable Long idEntrada14) {
		BandejaTelematica bandejaTelematica = new BandejaTelematica();
		bandejaTelematica.setIdEntrada14(idEntrada14);
		this.bandejaTelematicaService.remove(bandejaTelematica);
		BandejaTelematicaController.logger.info("[DELETE] : BandejaTelematica borrado correctamente");
		return bandejaTelematica;
	}

	/*
	 * METODOS COMPONENTE RUP_TABLE
	 * 
	 */

	/**
	 * Metodo de presentacion del RUP_TABLE.
	 * 
	 * @param model Model
	 * @return String
	 */
	@RequestMapping(value = "/maint", method = RequestMethod.GET)
	public String getFormEdit(Model model) {
		BandejaTelematicaController.logger.info("[GET - View] : bandejatelematica");
		model.addAttribute("bandejatelematica", new BandejaTelematica());
		model.addAttribute("documentosbantel", new DocumentosBanTel());
		model.addAttribute("TiposAportacion", TipoAportacionEnum.values());
		model.addAttribute("Procedimientos", ProcedimientosEnum.values());
		model.addAttribute("ErroresExpediente", ErroresExpedienteEnum.values());
		return "bandejatelematica";
	}

	/**
	 * Operacion de filtrado del componente RUP_TABLE.
	 * 
	 * @param filterBandejaTelematica BandejaTelematica Bean que contiene los
	 *                                parametros de filtrado a emplear.
	 * @param tableRequestDto         Dto que contiene los parametros de
	 *                                configuracion propios del RUP_TABLE a aplicar
	 *                                en el filtrado.
	 * @return TableResponseDto<BandejaTelematica> Dto que contiene el resultado del
	 *         filtrado realizado por el componente RUP_TABLE.
	 */
	@RequestMapping(value = "/filter", method = RequestMethod.POST)
	public @ResponseBody TableResponseDto<BandejaTelematica> filter(
			@RequestJsonBody(param = "filter") BandejaTelematica filterBandejaTelematica,
			@RequestJsonBody TableRequestDto tableRequestDto) {
		BandejaTelematicaController.logger.info("[POST - filter] : Obtener BandejaTelematicas");

		filterBandejaTelematica.setEstado14(Constantes.EstadosBandejaTelematica.PENDIENTE);
		return this.bandejaTelematicaService.filterComplete(filterBandejaTelematica, tableRequestDto, false);
	}

	/**
	 * Operacion de busqueda del componente RUP_TABLE.
	 * 
	 * @param filterBandejaTelematica BandejaTelematica Bean que contiene los
	 *                                parametros de filtrado a emplear.
	 * @param searchBandejaTelematica BandejaTelematica Bean que contiene los
	 *                                parametros de busqueda a emplear.
	 * @param tableRequestDto         Dto que contiene los parametros de
	 *                                configuracion propios del RUP_TABLE a aplicar
	 *                                en la búsqueda.
	 * @return TableRowDto<BandejaTelematica> Dto que contiene el resultado de la
	 *         busqueda realizada por el componente RUP_TABLE.
	 */
	@RequestMapping(value = "/search", method = RequestMethod.POST)
	public @ResponseBody List<TableRowDto<BandejaTelematica>> search(
			@RequestJsonBody(param = "filter") BandejaTelematica filterBandejaTelematica,
			@RequestJsonBody(param = "search") BandejaTelematica searchBandejaTelematica,
			@RequestJsonBody TableRequestDto tableRequestDto) {
		BandejaTelematicaController.logger.info("[POST - search] : Buscar BandejaTelematicas");
		return this.bandejaTelematicaService.search(filterBandejaTelematica, searchBandejaTelematica, tableRequestDto,
				false);
	}

	/**
	 * Borrado multiple de registros
	 * 
	 * @param filterBandejaTelematica BandejaTelematica Bean que contiene los
	 *                                parametros de filtrado a emplear.
	 * @param tableRequestDto         Dto que contiene los parametros de
	 *                                configuracion propios del RUP_TABLE a aplicar
	 *                                en la busqueda.
	 * @return List<String> Lista de los identificadores de los registros
	 *         eliminados.
	 * 
	 */
	@RequestMapping(value = "/deleteAll", method = RequestMethod.POST)
	@ResponseStatus(value = HttpStatus.OK)
	public @ResponseBody List<String> removeMultiple(@RequestJsonBody TableRequestDto tableRequestDto) {
		BandejaTelematicaController.logger.info("[POST - removeMultiple] : Eliminar multiples BandejaTelematicas");
		this.bandejaTelematicaService.removeMultiple(tableRequestDto);
		BandejaTelematicaController.logger.info("All entities correctly deleted!");

		return tableRequestDto.getMultiselection().getSelectedIds();
	}

	/*
	 * METODOS COMPONENTE RUP_TABLE - JERARQUIA
	 */

	/**
	 * Operacion de filtrado del componente RUP_TABLE para presentar los registros
	 * mediante visualizacion jerarquica.
	 * 
	 * @param filterBandejaTelematica BandejaTelematica Bean que contiene los
	 *                                parametros de filtrado a emplear.
	 * @param tableRequestDto         Dto que contiene los parametros de
	 *                                configuracion propios del RUP_TABLE a aplicar
	 *                                en el filtrado.
	 * @return TableResponseDto<JerarquiaDto<BandejaTelematica>> Dto que contiene el
	 *         resultado del filtrado realizado por el componente RUP_TABLE.
	 */
	@RequestMapping(value = "/jerarquia/filter", method = RequestMethod.POST)
	public @ResponseBody TableResponseDto<JerarquiaDto<BandejaTelematica>> jerarquia(
			@RequestJsonBody(param = "filter") BandejaTelematica filterBandejaTelematica,
			@RequestJsonBody TableRequestDto tableRequestDto) {
		BandejaTelematicaController.logger.info("[POST - jerarquia] : Obtener BandejaTelematicas jerarquia");
		return this.bandejaTelematicaService.jerarquia(filterBandejaTelematica, tableRequestDto, false);
	}

	/**
	 * Recupera los hijos de los registros desplegados en la visualizacion
	 * jerarquica.
	 * 
	 * @param filterBandejaTelematica BandejaTelematica Bean que contiene los
	 *                                parametros de filtrado a emplear.
	 * @param tableRequestDto         Dto que contiene los parametros de
	 *                                configuracion propios del RUP_TABLE a aplicar
	 *                                en el filtrado.
	 * @return TableResponseDto<JerarquiaDto<BandejaTelematica>> Dto que contiene el
	 *         resultado del filtrado realizado por el componente RUP_TABLE.
	 */
	@RequestMapping(value = "/jerarquiaChildren", method = RequestMethod.POST)
	public @ResponseBody TableResponseDto<JerarquiaDto<BandejaTelematica>> jerarquiaChildren(
			@RequestJsonBody(param = "filter") BandejaTelematica filterBandejaTelematica,
			@RequestJsonBody TableRequestDto tableRequestDto) {
		BandejaTelematicaController.logger.info("[POST - jerarquia] : Obtener BandejaTelematicas jerarquia - Hijos");
		return this.bandejaTelematicaService.jerarquiaChildren(filterBandejaTelematica, tableRequestDto);
	}

	/**
	 * EXPORTERS
	 */
	/**
	 * Devuelve los datos exportados de la tabla y los copia al Portapapeles.
	 *
	 * @param filterBandejaTelematica BandejaTelematica
	 * @param tableRequestDto         TableRequestDto
	 */
	@RequestMapping(value = "/clipboardReport", method = RequestMethod.POST)
	protected @ResponseBody List<BandejaTelematica> getClipboardReport(
			@RequestJsonBody(param = "filter") BandejaTelematica filterBandejaTelematica,
			@RequestJsonBody TableRequestDto tableRequestDto) {
		BandejaTelematicaController.logger.info("[POST - clipboardReport] : : Copiar en Portapapeles");
		return this.bandejaTelematicaService.getMultiple(filterBandejaTelematica, tableRequestDto, false);
	}

	/**
	 * Devuelve un fichero excel que contiene los datos exportados de la tabla.
	 *
	 * @param filter          BandejaTelematica
	 * @param columns         String[]
	 * @param fileName        String
	 * @param sheetTitle      String
	 * @param tableRequestDto TableRequestDto
	 * @param request         HttpServletRequest
	 * @param response        HttpServletResponse
	 */
	@RequestMapping(value = { "/xlsReport",
			"/xlsxReport" }, method = RequestMethod.POST, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
	protected @ResponseBody void generateExcelReport(
			@RequestJsonBody(param = "filter", required = false) BandejaTelematica filter,
			@RequestJsonBody(param = "columns", required = false) String[] columns,
			@RequestJsonBody(param = "columnsName", required = false) String[] columnsName,
			@RequestJsonBody(param = "fileName", required = false) String fileName,
			@RequestJsonBody(param = "sheetTitle", required = false) String sheetTitle,
			@RequestJsonBody TableRequestDto tableRequestDto, HttpServletRequest request, HttpServletResponse response)
			throws ServletException {
		BandejaTelematicaController.logger.info("[POST - generateExcelReport] : Devuelve un fichero excel");

		this.bandejaTelematicaService.generateReport(filter, columns, columnsName, fileName, sheetTitle,
				tableRequestDto, request, response);
	}

	/**
	 * Devuelve un fichero pdf que contiene los datos exportados de la tabla.
	 *
	 * @param filter          BandejaTelematica
	 * @param columns         String[]
	 * @param fileName        String
	 * @param sheetTitle      String
	 * @param tableRequestDto TableRequestDto
	 * @param request         HttpServletRequest
	 * @param response        HttpServletResponse
	 */
	@RequestMapping(value = "pdfReport", method = RequestMethod.POST, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
	protected @ResponseBody void generatePDFReport(
			@RequestJsonBody(param = "filter", required = false) BandejaTelematica filter,
			@RequestJsonBody(param = "columns", required = false) String[] columns,
			@RequestJsonBody(param = "columnsName", required = false) String[] columnsName,
			@RequestJsonBody(param = "fileName", required = false) String fileName,
			@RequestJsonBody(param = "sheetTitle", required = false) String sheetTitle,
			@RequestJsonBody TableRequestDto tableRequestDto, HttpServletRequest request,
			HttpServletResponse response) {
		BandejaTelematicaController.logger.info("[POST - generatePDFReport] : Devuelve un fichero pdf");

		this.bandejaTelematicaService.generateReport(filter, columns, columnsName, fileName, sheetTitle,
				tableRequestDto, request, response);
	}

	/**
	 * Devuelve un fichero ods que contiene los datos exportados de la tabla.
	 *
	 * @param filter          BandejaTelematica
	 * @param columns         String[]
	 * @param fileName        String
	 * @param sheetTitle      String
	 * @param tableRequestDto TableRequestDto
	 * @param request         HttpServletRequest
	 * @param response        HttpServletResponse
	 */
	@RequestMapping(value = "odsReport", method = RequestMethod.POST, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
	protected @ResponseBody void generateODSReport(
			@RequestJsonBody(param = "filter", required = false) BandejaTelematica filter,
			@RequestJsonBody(param = "columns", required = false) String[] columns,
			@RequestJsonBody(param = "columnsName", required = false) String[] columnsName,
			@RequestJsonBody(param = "fileName", required = false) String fileName,
			@RequestJsonBody(param = "sheetTitle", required = false) String sheetTitle,
			@RequestJsonBody TableRequestDto tableRequestDto, HttpServletRequest request,
			HttpServletResponse response) {
		BandejaTelematicaController.logger.info("[POST - generateODSReport] : Devuelve un fichero ods");

		this.bandejaTelematicaService.generateReport(filter, columns, columnsName, fileName, sheetTitle,
				tableRequestDto, request, response);
	}

	/**
	 * Devuelve un fichero csv que contiene los datos exportados de la tabla.
	 *
	 * @param filter          BandejaTelematica
	 * @param columns         String[]
	 * @param fileName        String
	 * @param sheetTitle      String
	 * @param tableRequestDto TableRequestDto
	 * @param request         HttpServletRequest
	 * @param response        HttpServletResponse
	 */
	@RequestMapping(value = "csvReport", method = RequestMethod.POST, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
	protected @ResponseBody void generateCSVReport(
			@RequestJsonBody(param = "filter", required = false) BandejaTelematica filter,
			@RequestJsonBody(param = "columns", required = false) String[] columns,
			@RequestJsonBody(param = "columnsName", required = false) String[] columnsName,
			@RequestJsonBody(param = "fileName", required = false) String fileName,
			@RequestJsonBody(param = "sheetTitle", required = false) String sheetTitle,
			@RequestJsonBody TableRequestDto tableRequestDto, HttpServletRequest request,
			HttpServletResponse response) {
		BandejaTelematicaController.logger.info("[POST - generateCSVReport] : Devuelve un fichero csv");

		this.bandejaTelematicaService.generateReport(filter, columns, columnsName, fileName, sheetTitle,
				tableRequestDto, request, response);
	}

	/**
	 * Detalle de una entrada en la bandeja telemática
	 * 
	 * @param idEntrada14
	 * @param model
	 * @return String
	 */
	@PostMapping(value = "/detail")
	public @ResponseBody BandejaTelematica getDetail(
			@RequestJsonBody(param = "bandejaTelematica") BandejaTelematica bandejaTelematica) {

		BandejaTelematicaController.logger.info("[GET - detail] : bandejaTelematica");

		// Solo necesitamos el id de la entrada
		List<BandejaTelematica> listBandejaEntrada = this.bandejaTelematicaService
				.bandejaTelematicaComplete(new BandejaTelematica(bandejaTelematica.getIdEntrada14()), null);

		return !listBandejaEntrada.isEmpty() && listBandejaEntrada.size() == 1 ? listBandejaEntrada.get(0)
				: new BandejaTelematica();

	}

	/**
	 * Procesar una entrada
	 * 
	 */
	@RequestMapping(value = "/process", method = RequestMethod.POST)
	public @ResponseBody BandejaTelematica process(
			@RequestJsonBody(param = "bandejaTelematica") BandejaTelematica bandejaTelematica) {

		BandejaTelematicaController.logger.info("[POST - process] : bandejaTelematica");

		// TODO: revisar qué usuarios van a tener permisos para procesar las entradas
//		if (Boolean.FALSE.equals(this.validarUsuario())) {
//			throw new Ad74aException(UtilLiterales.getLiteralMessage(appMessageSource,
//					com.ejie.ad74a.util.constantes.Constantes.ERROR_ACCESO_DENEGADO));
//		}
		try {

			this.bandejaTelematicaService.procesarEntrada(bandejaTelematica);
		} catch (Throwable e) {
			ManagerErrors.manageException(e, "Error al procesar la entrada");
		}
		return bandejaTelematica;
	}

//	private Boolean validarUsuario() {
//		for (String profile : UtilSeguridad.getUsuarioConectado().getUserProfiles()) {
//			if (profile.equalsIgnoreCase(UtilSeguridad.Props.perfil_seguridad_dss.getValue())) {
//				return true;
//			}
//		}
//		return false;
//	}

	@RequestMapping(value = "/downloadDocument/{oid}", method = RequestMethod.GET)
	public void downloadDocument(@PathVariable String oid, @RequestParam(required = true) String nombreDoc,
			HttpServletResponse response) throws IOException, Exception {
		String rutaPif = "";
		if (!Utilidades.esBlancoNulo(oid)) {
			try {
				T65Content t65Content = this.dokusiService.retrieveDocumentOrSuperLocator(oid);
				rutaPif = t65Content.getPifId();
				BandejaTelematicaController.logger.info(
						"BandejaTelematicaController.downloadDocument - Ad74aPIFws.getInstance().downloadDocument path = {}",
						rutaPif);
				InputStream inputStream = Ad74aPIFws.getInstance().downloadDocument(rutaPif);
				response.setHeader("Content-disposition", "attachment; filename=" + nombreDoc);
				int bytesRead = -1;
				byte[] buffer = new byte[1024 * 4]; // buffer temporal de lectura.
				while ((bytesRead = inputStream.read(buffer)) != -1) {
					response.getOutputStream().write(buffer, 0, bytesRead);
				}
				inputStream.close();
				response.getOutputStream().flush();
				response.getOutputStream().close();
			} catch (Exception e) {
				ManagerErrors.manageException(e, "Error al descargar el documento");
			} finally {
				Ad74aPIFws.getInstance().deleteDocument(rutaPif);
			}
		}

	}

	@RequestMapping(value = "/openOrDownloadDocument/{oid}", method = RequestMethod.GET)
	public void openOrDownloadDocument(@PathVariable String oid, @RequestParam(required = true) String nombreDoc,
			HttpServletResponse response) throws IOException, Exception {
		String rutaPif = "";
		if (!Utilidades.esBlancoNulo(oid)) {
			try {
				T65Content t65Content = this.dokusiService.retrieveDocumentOrSuperLocator(oid);
				rutaPif = t65Content.getPifId();
				BandejaTelematicaController.logger.info(
						"BandejaTelematicaController.downloadDocument - Ad74aPIFws.getInstance().downloadDocument path = {}",
						rutaPif);
				InputStream inputStream = Ad74aPIFws.getInstance().downloadDocument(rutaPif);
				UtilWeb.downloadFile(nombreDoc, t65Content.getFormat().getMimeType(), 0, inputStream, response, "");
			} catch (Exception e) {
				ManagerErrors.manageException(e, "Error al descargar el documento");
			} finally {
				Ad74aPIFws.getInstance().deleteDocument(rutaPif);
			}
		}

	}

	/**
	 * Procesar una entrada
	 * 
	 */
	@RequestMapping(value = "/tiposProcesos", method = RequestMethod.POST)
	public @ResponseBody List<Combo> getTiposProcesos(@RequestBody BandejaTelematica bandejaTelematica) {
		BandejaTelematicaController.logger.info("[POST - tiposprocesos] : bandejaTelematica");

		List<Combo> returnList = new ArrayList<Combo>();
		if (bandejaTelematica.getSubmisiontype14().equalsIgnoreCase(TipoAportacionEnum.SOLICITUD.getTipo())
				|| bandejaTelematica.getSubmisiontype14()
						.equalsIgnoreCase(TipoAportacionEnum.SOLICITUD_CIUDADANO_PRESENCIAL.getTipo())) {
			if (bandejaTelematica.getProcedureid14().equals(ProcedimientosEnum.ALTA.getId())) {
				returnList.add(TipoProcesoEnum.SOLICITUD_ALTA.getCombo());
			} else if (bandejaTelematica.getProcedureid14().equals(ProcedimientosEnum.BAJA.getId())) {
				returnList.add(TipoProcesoEnum.SOLICITUD_BAJA.getCombo());
			} else if (bandejaTelematica.getProcedureid14().equals(ProcedimientosEnum.MODIFICACION.getId())) {
				returnList.add(TipoProcesoEnum.SOLICITUD_MODIFICACION.getCombo());
			} else if (bandejaTelematica.getProcedureid14().equals(ProcedimientosEnum.REVISION_PRECIO.getId())) {
				returnList.add(TipoProcesoEnum.SOLICITUD_REVISION.getCombo());
			} else if (bandejaTelematica.getProcedureid14().equals(ProcedimientosEnum.INFORME.getId())) {
				returnList.add(TipoProcesoEnum.SOLICITUD_INF_INTERVENCION.getCombo());
			}

		} else if (bandejaTelematica.getSubmisiontype14()
				.equalsIgnoreCase(TipoAportacionEnum.APORTACION_DOCUMENTOS.getTipo())) {
			for (TipoProcesoEnum tipoProceso : cargarProcesosAportDocumentos(bandejaTelematica.getFolderid14())) {
				returnList.add(tipoProceso.getCombo());
			}
		} else {
			for (TipoProcesoEnum tipoProceso : TipoAportacionEnum.getTipoProceso(bandejaTelematica.getSubmisiontype14(),
					null)) {
				returnList.add(tipoProceso.getCombo());
			}
		}

		// TODO: faltan los recursos

		return returnList;

	}

	/**
	 * Para la Aportacion de documentos, hay que tener en cuenta: Los tipos a cargar
	 * en el combo: 1- Aportación 2- Subsanación de documentación ( si existe una
	 * espera de subsanación pendiente) 3- Desistimiento (documento aportado es
	 * desestimiento)
	 * 
	 **/
	private TipoProcesoEnum[] cargarProcesosAportDocumentos(String folderId) {

		ArrayList<TipoProcesoEnum> listaTipos = new ArrayList<TipoProcesoEnum>();

		listaTipos.add(TipoProcesoEnum.APORTACION);

		// TODO: comprobar si eciste espera de subsanación para mostrar tbn SUBSANACION
//		com.ejie.ad74a.ws.client.platea.tareasTramitacion.TWait waitRes = this.tramitesTareaService
//				.getWaitByType(folderId, TWaitType.APORTACION_DOCUMENTACION);
//
//		if (null != waitRes) {
//			listaTipos.add(TipoProcesoEnum.SUBSANACION_DOCUMENTOS);
//		}
		listaTipos.add(TipoProcesoEnum.SUBSANACION_DOCUMENTOS); // De momento añadido manualmente

		// TODO: revisar que otros tipos de procesos se pueden dar: desestimiento, etc.
		listaTipos.add(TipoProcesoEnum.DESISTIMIENTO);
//		listaTipos.add(TipoProcesoEnum.RENUNCIA);

		TipoProcesoEnum[] tipos = new TipoProcesoEnum[listaTipos.size()];
		for (int i = 0; i < listaTipos.size(); i++) {
			tipos[i] = listaTipos.get(i);
		}
		return tipos;
	}

}
