package com.ejie.ad74a.control;

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

import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.QueryParam;

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.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
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 com.ejie.ad74a.model.Ayuntamientos;
import com.ejie.ad74a.model.Combo;
import com.ejie.ad74a.model.Direcciones;
import com.ejie.ad74a.model.Expedientes;
import com.ejie.ad74a.model.Iprem;
import com.ejie.ad74a.model.MaestroActores;
import com.ejie.ad74a.model.MaestroMotDenegacion;
import com.ejie.ad74a.model.MaestroMotQueja;
import com.ejie.ad74a.model.MaestroNivSoporte;
import com.ejie.ad74a.model.MaestroSubtiposAviso;
import com.ejie.ad74a.model.MaestroTiposAviso;
import com.ejie.ad74a.model.MaestroTiposDatoEco;
import com.ejie.ad74a.model.MaestroTiposDoc;
import com.ejie.ad74a.model.MaestroTramites;
import com.ejie.ad74a.model.Mancomunidades;
import com.ejie.ad74a.model.PisosTutelados;
import com.ejie.ad74a.model.PrestadorServicio;
import com.ejie.ad74a.model.UnidadesBase;
import com.ejie.ad74a.model.Usuarios;
import com.ejie.ad74a.model.ae01b.MotAnuCobro;
import com.ejie.ad74a.model.comun.Municipio;
import com.ejie.ad74a.model.comun.Provincia;
import com.ejie.ad74a.service.AyuntamientosService;
import com.ejie.ad74a.service.DocumentosBanTelService;
import com.ejie.ad74a.service.ExpedientesService;
import com.ejie.ad74a.service.IpremService;
import com.ejie.ad74a.service.MaestroActoresService;
import com.ejie.ad74a.service.MaestroMotDenegacionService;
import com.ejie.ad74a.service.MaestroMotQuejaService;
import com.ejie.ad74a.service.MaestroNivSoporteService;
import com.ejie.ad74a.service.MaestroSubtiposAvisoService;
import com.ejie.ad74a.service.MaestroTiposAvisoService;
import com.ejie.ad74a.service.MaestroTiposDatoEcoService;
import com.ejie.ad74a.service.MaestroTiposDocService;
import com.ejie.ad74a.service.MaestroTramitesService;
import com.ejie.ad74a.service.MancomunidadesService;
import com.ejie.ad74a.service.PagosService;
import com.ejie.ad74a.service.PisosTuteladosService;
import com.ejie.ad74a.service.PrestadorServicioService;
import com.ejie.ad74a.service.UnidadesBaseService;
import com.ejie.ad74a.service.ae01b.CopagosSeguimientoService;
import com.ejie.ad74a.service.ae01b.MotAnuCobroService;
import com.ejie.ad74a.util.comun.UtilLiterales;
import com.ejie.ad74a.util.comun.UtilSeguridad;
import com.ejie.ad74a.util.comun.Utilidades;
import com.ejie.ad74a.util.constantes.AccionesTelevidaEnum;
import com.ejie.ad74a.util.constantes.Constantes;
import com.ejie.ad74a.util.constantes.EstadoInformesEnum;
import com.ejie.ad74a.util.constantes.EstadosExpedienteEnum;
import com.ejie.ad74a.util.constantes.EstadosProcesosBatchEnum;
import com.ejie.ad74a.util.constantes.FinalizacionEstudioEnum;
import com.ejie.ad74a.util.constantes.GradoDependenciaEnum;
import com.ejie.ad74a.util.constantes.MesesEnum;
import com.ejie.ad74a.util.constantes.ProcesosBatchEnum;
import com.ejie.ad74a.util.constantes.TipoAportacionEnum;
import com.ejie.ad74a.util.constantes.TipoDocumentoOrigenEnum;
import com.ejie.ad74a.util.constantes.TipoIdentificadorEnum;
import com.ejie.ad74a.util.constantes.TipoInformesEnum;
import com.ejie.ad74a.util.constantes.TipoProcesoEnum;
import com.ejie.ad74a.util.constantes.modelos.TipoExpedientes;
import com.ejie.ad74a.util.constantes.modelos.TipoSolicitantes;
import com.ejie.ad74a.ws.client.platea.procedimientos.TDocumentRole;
import com.ejie.ad74a.ws.client.platea.procedimientos.TDocumentRoleList;
import com.ejie.ad74a.ws.client.platea.procedimientos.TLanguage;
import com.ejie.ad74a.ws.client.platea.procedimientos.TStringI18N;
import com.ejie.ad74a.ws.client.prestadorWS.data.TipoComunicacionEnum;

/**
 * OngLocalController generated by UDA, 21-may-2019 8:09:49.
 * 
 * @author UDA
 */

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

public class ComboController {

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

	@javax.annotation.Resource
	private ReloadableResourceBundleMessageSource appMessageSource;

	@Autowired
	private ExpedientesService expedientesService;

	@Autowired
	private PisosTuteladosService pisosTuteladosService;

	@Autowired
	private CopagosSeguimientoService copagosSeguimientoService;

	@Autowired
	private AyuntamientosService ayuntamientosService;

	@Autowired
	private DocumentosBanTelService documentosBanTelService;

	@Autowired
	private MaestroTiposDocService maestroTiposDocService;

	@Autowired
	private MaestroTramitesService maestroTramitesService;

	@Autowired
	private MaestroSubtiposAvisoService maestroSubtiposAvisoService;

	@Autowired
	private MaestroTiposAvisoService maestroTiposAvisoService;

	@Autowired
	private MaestroActoresService maestroActoresService;

	@Autowired
	private MancomunidadesService mancomunidadesService;

	@Autowired
	private PagosService pagosService;

	@Autowired
	private PrestadorServicioService prestadorServicioService;

	@Autowired
	private MaestroTiposDatoEcoService maestroTiposDatoEcoService;

	@Autowired
	private MaestroNivSoporteService maestroNivSoporteService;

	@Autowired
	private MaestroMotQuejaService maestroMotQuejaService;

	@Autowired
	private MaestroMotDenegacionService maestroMotDenegacionService;

	@Autowired
	private IpremService ipremService;

	@Autowired
	private MotAnuCobroService motAnuCobroService;

	@Autowired
	private UnidadesBaseService unidadesBaseService;

	@GetMapping(value = "/tipoIdentificador")
	public @ResponseBody List<Combo> findTipoIdentificador(
			@RequestParam(value = "tipoPersona", required = false) Integer tipoPersona, HttpServletRequest request) {
		List<Combo> tipoIdentificadorList = new ArrayList<>();
		for (TipoIdentificadorEnum enumeracion : TipoIdentificadorEnum.valuesByTipoPersona(tipoPersona)) {
			tipoIdentificadorList.add(enumeracion.getCombo());
		}
		return tipoIdentificadorList;
	}

	@GetMapping(value = "/tipoBeneficiario")
	public @ResponseBody List<Combo> findtipoBeneficiario01(HttpServletRequest request) {

		List<Combo> returnList = new ArrayList<>();
		returnList.add(TipoSolicitantes.TipoBeneficiario01.TITULAR_A.getCombo());
		returnList.add(TipoSolicitantes.TipoBeneficiario01.BENEFICIARIO_B.getCombo());
		returnList.add(TipoSolicitantes.TipoBeneficiario01.BENEFICIARIO_C.getCombo());
		return returnList;
	}

	@GetMapping(value = "/ayuntamientos")
	public @ResponseBody List<Ayuntamientos> findAyuntamientos(HttpServletRequest request,
			@RequestParam(value = "direcciones.idProvincia06", required = false) String codProvinciaDireccion,
			@RequestParam(value = "direcciones.idMunicipio06", required = false) String codMunicipioDireccion) {
		Ayuntamientos ayuntamientosFilter = new Ayuntamientos();
		ayuntamientosFilter.setProvincia(new Provincia(codProvinciaDireccion));
		ayuntamientosFilter.setMunicipio(new Municipio(codMunicipioDireccion, null, codProvinciaDireccion));
		return this.ayuntamientosService.findAll(ayuntamientosFilter, null);
	}

	@GetMapping(value = "/ayuntamientosprovincia")
	public @ResponseBody List<Ayuntamientos> findAyuntamientosProvincia(HttpServletRequest request,
			@RequestParam(value = "ayuntamientos.provincia.codProvincia", required = false) String codProvinciaDireccion) {
		Ayuntamientos ayuntamientosFilter = new Ayuntamientos();
		ayuntamientosFilter.setProvincia(new Provincia(codProvinciaDireccion));
		return this.ayuntamientosService.findAll(ayuntamientosFilter, null);
	}

	@GetMapping(value = "/mancomunidades")
	public @ResponseBody List<Mancomunidades> findAllMancomunidades(HttpServletRequest request,
			@RequestParam(value = "ayuntamientos.provincia.codProvincia", required = false) String codProvinciaDireccion) {
		Mancomunidades mancomunidadesFilter = new Mancomunidades();
		mancomunidadesFilter.setIdProvincia49(codProvinciaDireccion);
		return this.mancomunidadesService.findAll(mancomunidadesFilter, null);
	}

	@GetMapping(value = "/mancomunidadesprovincia")
	public @ResponseBody List<Mancomunidades> findAllMancomunidadesProvincia(HttpServletRequest request,
			@RequestParam(value = "provincia.codProvincia", required = false) String codProvinciaDireccion) {
		Mancomunidades mancomunidadesFilter = new Mancomunidades();
		mancomunidadesFilter.setIdProvincia49(codProvinciaDireccion);
		return this.mancomunidadesService.findAll(mancomunidadesFilter, null);
	}

	@GetMapping(value = "/pisosTutelados")
	public @ResponseBody List<PisosTutelados> findPisosTutelados(HttpServletRequest request,
			@RequestParam(value = "idProvincia06", required = false) String codProvinciaDireccion,
			@RequestParam(value = "idMunicipio06", required = false) String codMunicipioDireccion) {
		PisosTutelados pisosTuteladosFilter = new PisosTutelados();
		Direcciones direccionFilter = new Direcciones();
		direccionFilter.setIdProvincia06(codProvinciaDireccion);
		direccionFilter.setIdMunicipio06(codMunicipioDireccion);
		pisosTuteladosFilter.setDirecciones(direccionFilter);
		List<PisosTutelados> pisos = this.pisosTuteladosService.findAll(pisosTuteladosFilter, null);
		return pisos;
	}

	@GetMapping(value = "/subtiposavisos")
	public @ResponseBody List<MaestroSubtiposAviso> findSubtiposavisos(HttpServletRequest request,
			@RequestParam(value = "maestroTiposAviso.idTipoAviso40", required = false) Long idTipoAviso40) {
		String usuario = null;
		if (UtilSeguridad.isDSS(request) || UtilSeguridad.isDirector(request)) {
			usuario = "DSS";
		} else if (UtilSeguridad.isPS(request)) {
			usuario = "PS";
		} else if (UtilSeguridad.isAdmin(request)) {
			usuario = "ADMIN";
		}
		MaestroSubtiposAviso subtiposAvisoFilter = new MaestroSubtiposAviso();
		subtiposAvisoFilter.setMaestroTiposAviso(new MaestroTiposAviso(idTipoAviso40));

		return this.maestroSubtiposAvisoService.findPorUsuarios(subtiposAvisoFilter, null, usuario);
	}

	@GetMapping(value = "/maestroMotQueja")
	public @ResponseBody List<MaestroMotQueja> maestroMotQueja(HttpServletRequest request) {
		MaestroMotQueja maestroMotQuejaAll = new MaestroMotQueja();

		return this.maestroMotQuejaService.findAll(maestroMotQuejaAll, null);
	}

	@GetMapping(value = "/subtiposavisosAll")
	public @ResponseBody List<MaestroSubtiposAviso> findSubtiposavisosAll(HttpServletRequest request,
			@RequestParam(value = "maestroTiposAviso.idTipoAviso40", required = false) Long idTipoAviso40) {
		MaestroSubtiposAviso subtiposAvisoFilter = new MaestroSubtiposAviso();
		subtiposAvisoFilter.setMaestroTiposAviso(new MaestroTiposAviso(idTipoAviso40));

		return this.maestroSubtiposAvisoService.findAll(subtiposAvisoFilter, null);
	}

	@GetMapping(value = "/subtiposavisosDss")
	public @ResponseBody List<MaestroSubtiposAviso> subtiposavisosDss(HttpServletRequest request,
			@RequestParam(value = "maestroTiposAviso.idTipoAviso40", required = false) Long idTipoAviso40) {
		MaestroSubtiposAviso subtiposAvisoFilter = new MaestroSubtiposAviso();
		subtiposAvisoFilter.setMaestroTiposAviso(new MaestroTiposAviso(idTipoAviso40));

		return this.maestroSubtiposAvisoService.findSubtiposDss(subtiposAvisoFilter);
	}

	@GetMapping(value = "/subtiposavisosPs")
	public @ResponseBody List<MaestroSubtiposAviso> subtiposavisosPs(HttpServletRequest request,
			@RequestParam(value = "maestroTiposAviso.idTipoAviso40", required = false) Long idTipoAviso40) {
		MaestroSubtiposAviso subtiposAvisoFilter = new MaestroSubtiposAviso();
		subtiposAvisoFilter.setMaestroTiposAviso(new MaestroTiposAviso(idTipoAviso40));

		return this.maestroSubtiposAvisoService.findSubtiposPs(subtiposAvisoFilter);
	}

	@GetMapping(value = "/subtiposavisosSsb")
	public @ResponseBody List<MaestroSubtiposAviso> subtiposavisosSsb(HttpServletRequest request,
			@RequestParam(value = "maestroTiposAviso.idTipoAviso40", required = false) Long idTipoAviso40) {
		MaestroSubtiposAviso subtiposAvisoFilter = new MaestroSubtiposAviso();
		subtiposAvisoFilter.setMaestroTiposAviso(new MaestroTiposAviso(idTipoAviso40));

		return this.maestroSubtiposAvisoService.findSubtiposSsb(subtiposAvisoFilter);
	}

	@GetMapping(value = "/tipoAvisosAll")
	public @ResponseBody List<MaestroTiposAviso> findTiposavisosAll(HttpServletRequest request) {

		return this.maestroTiposAvisoService.findAll(new MaestroTiposAviso(), null);
	}

	@GetMapping(value = "/tipoAvisosDss")
	public @ResponseBody List<MaestroTiposAviso> findTiposavisosDss(HttpServletRequest request) {

		return this.maestroTiposAvisoService.findAvisosDss(new MaestroTiposAviso());
	}

	@GetMapping(value = "/tipoAvisosPs")
	public @ResponseBody List<MaestroTiposAviso> findTiposavisosPs(HttpServletRequest request) {

		return this.maestroTiposAvisoService.findAvisosPs(new MaestroTiposAviso());
	}

	@GetMapping(value = "/tipoAvisosSsb")
	public @ResponseBody List<MaestroTiposAviso> findTiposavisosSsb(HttpServletRequest request) {

		return this.maestroTiposAvisoService.findAvisosSsb(new MaestroTiposAviso());
	}

	// tipos avisos sin automaticos
	@GetMapping(value = "/tipoAvisos")
	public @ResponseBody List<MaestroTiposAviso> tipoAvisos(HttpServletRequest request) {
		String usuario = null;
		if (UtilSeguridad.isDSS(request) || UtilSeguridad.isDirector(request)) {
			usuario = "DSS";
		} else if (UtilSeguridad.isPS(request)) {
			usuario = "PS";
		} else if (UtilSeguridad.isAdmin(request)) {
			usuario = "ADMIN";
		}

		return this.maestroTiposAvisoService.findPorUsuarios(new MaestroTiposAviso(), null, usuario);

	}

	// tipos avisos sin automaticos
	@GetMapping(value = "/actoresAll")
	public @ResponseBody List<MaestroActores> obtenerActoresAll(HttpServletRequest request) {

		return this.maestroActoresService.findNoAuto(new MaestroActores(), null);

	}

	// tipos avisos sin automaticos
	@GetMapping(value = "/actores")
	public @ResponseBody List<MaestroActores> obtenerActores(HttpServletRequest request) {

		return this.maestroActoresService.findNoSSB(new MaestroActores(), null);

	}

	@GetMapping(value = "/idTipoEntrada00")
	public @ResponseBody List<Combo> findIdTipoEntrada00(HttpServletRequest request) {

		List<Combo> returnList = new ArrayList<>();
		returnList.add(TipoExpedientes.idTipoEntrada00.TELEMATICA.getCombo());
		returnList.add(TipoExpedientes.idTipoEntrada00.PRESENCIAL.getCombo());
		returnList.add(TipoExpedientes.idTipoEntrada00.PAPEL0.getCombo());
		return returnList;
	}

	@GetMapping(value = "/tiposDocumentos")
	public @ResponseBody List<MaestroTiposDoc> findTiposDocumento(HttpServletRequest request) {
		MaestroTiposDoc tipoDocumento = new MaestroTiposDoc();
		tipoDocumento.setOrigen36(TipoDocumentoOrigenEnum.ORIGEN_APORTADOS.getId());
		return this.maestroTiposDocService.findAll(tipoDocumento, null);
	}

	@GetMapping(value = "/getRolDocuments")
	public @ResponseBody List<Combo> getRolDocuments(HttpServletRequest request,
			@RequestParam(value = "procedureID", required = true) String procedureID,
			@RequestParam(value = "idActionTelem", required = false) String idActionTelem,
			@RequestParam(value = "idTipoProceso", required = false) String idTipoProceso,
			@RequestParam(value = "roleID", required = false) String roleID,
			@RequestParam(value = "esPapel0", required = false) Integer esPapel0) {

		List<Combo> tiposList = new ArrayList<>();

		if (idTipoProceso != null) {
			idActionTelem = TipoProcesoEnum.getNuevoTipoByTipo(idTipoProceso);
		}

		// si venimos de la bandeja de papel0, los tipos de documentos a cargar son los
		// de solicitud o aportacion de papel0
		if (!Utilidades.esNulo(esPapel0) && esPapel0.compareTo(Constantes.VAL_NUM_SI) == 0) {
			if (idActionTelem.equalsIgnoreCase(TipoAportacionEnum.SOLICITUD.getTipo())) {
				idActionTelem = TipoAportacionEnum.SOLICITUD_CIUDADANO_PRESENCIAL.getTipo();
			} else {
				idActionTelem = TipoAportacionEnum.APORTACION_DOCUMENTOS_CIUDADANO_PRESENCIAL.getTipo();
			}
		}

		TDocumentRoleList documentRoleList = this.documentosBanTelService.getRolDocuments(procedureID, idActionTelem);

		if (null != documentRoleList && documentRoleList.getDocumentRole() != null) {
			for (TDocumentRole docu : documentRoleList.getDocumentRole()) {
				if ((roleID != null && !roleID.equalsIgnoreCase(docu.getDocumentRoleID()) || roleID == null)) {
					List<TStringI18N> roleNameI18nList = docu.getDocumentRoleName().getText();
					tiposList.add(new Combo(docu.getDocumentRoleID(),
							this.getRoleNameByTLanguage(roleNameI18nList, TLanguage.ES),
							this.getRoleNameByTLanguage(roleNameI18nList, TLanguage.EU)));
				}
			}
		}

		return tiposList;
	}

	private String getRoleNameByTLanguage(List<TStringI18N> roleNameI18nList, TLanguage language) {

		for (TStringI18N roleNameI18n : roleNameI18nList) {
			if (language.equals(roleNameI18n.getLocale())) {
				return roleNameI18n.getValue();
			}
		}

		return "";
	}

	@GetMapping(value = "/tramites")
	public @ResponseBody List<MaestroTramites> findTramites(HttpServletRequest request,
			@ModelAttribute MaestroTramites maestroTramites) {

		// TODO: No recuperar tramites no admisibles

		return this.maestroTramitesService.findAllLike(maestroTramites, null, false);
	}

	/**
	 * Obtenre la lista de tipos de procesos
	 * 
	 */
	@RequestMapping(value = "/tiposProcesos", method = RequestMethod.POST)
	public @ResponseBody List<Combo> getTiposProcesos(HttpServletRequest request) {
		ComboController.logger.info("[POST - tiposprocesos] : combo");

		List<Combo> returnList = new ArrayList<>();

		ArrayList<TipoProcesoEnum> listaTipos = new ArrayList<>();
		for (int i = 0; i < listaTipos.size(); i++) {
			returnList.add(listaTipos.get(i).getCombo());
		}

		for (TipoProcesoEnum tipoProceso : TipoProcesoEnum.values()) {
			returnList.add(tipoProceso.getCombo());
		}

		return returnList;

	}

	@GetMapping(value = "/situacioneFinalTarea")
	public @ResponseBody List<Combo> getComboSituacioneFinalTarea(
			@RequestParam(value = "idProcedimiento00", required = false) String idProcedimiento00,
			@RequestParam(value = "tipoEstudioDoc10", required = false) Long tipoEstudioDoc10,
			@RequestParam(value = "tramiteCerrado", required = false) Boolean tramiteCerrado,
			@RequestParam(value = "idExpediente", required = false) Long idExpediente) {

		List<Combo> estadoDocumentacionList = new ArrayList<>();
		Expedientes exp;
		if (Boolean.TRUE.equals(tramiteCerrado)) {
			// Si está cerrado se recuperan todos para poder seleccionar el que corresponda
			for (FinalizacionEstudioEnum enumeracion : FinalizacionEstudioEnum.valuesByProcedimiento(idProcedimiento00,
					tipoEstudioDoc10, null)) {
				estadoDocumentacionList.add(enumeracion.getCombo());
			}
		} else {
			exp = this.expedientesService.find(new Expedientes(idExpediente));
			if (exp.getfResolucion00() != null
					&& !EstadosExpedienteEnum.PEND_SUBSANACION.getId().equals(exp.getEstados().getIdEstado30())) {
				// Si esta resuelto y por lo tanto el estado no es pendiente de subsanación, la
				// unica situación posible es no hacer nada
				estadoDocumentacionList.add(FinalizacionEstudioEnum.NO_HACER_NADA.getCombo());
			} else {
				for (FinalizacionEstudioEnum enumeracion : FinalizacionEstudioEnum
						.valuesByProcedimiento(idProcedimiento00, tipoEstudioDoc10, exp.getDeOficio00())) {
					estadoDocumentacionList.add(enumeracion.getCombo());
				}
			}
		}

		return estadoDocumentacionList;
	}

	@GetMapping(value = "/estadosExpediente")
	public @ResponseBody List<Combo> findEstadosExpediente(HttpServletRequest request) {

		List<Combo> returnList = new ArrayList<>();
		for (EstadosExpedienteEnum enumeracion : EstadosExpedienteEnum.values()) {
			returnList.add(enumeracion.getCombo());
		}

		return returnList;
	}

	@GetMapping(value = "/meses")
	public @ResponseBody List<Combo> findMeses(HttpServletRequest request) {

		List<Combo> returnList = new ArrayList<>();
		returnList.add(MesesEnum.ENERO.getCombo());
		returnList.add(MesesEnum.FEBRERO.getCombo());
		returnList.add(MesesEnum.MARZO.getCombo());
		returnList.add(MesesEnum.ABRIL.getCombo());
		returnList.add(MesesEnum.MAYO.getCombo());
		returnList.add(MesesEnum.JUNIO.getCombo());
		returnList.add(MesesEnum.JULIO.getCombo());
		returnList.add(MesesEnum.AGOSTO.getCombo());
		returnList.add(MesesEnum.SEPTIEMBRE.getCombo());
		returnList.add(MesesEnum.OCTUBRE.getCombo());
		returnList.add(MesesEnum.NOVIEMBRE.getCombo());
		returnList.add(MesesEnum.DICIEMBRE.getCombo());
		return returnList;
	}

	@GetMapping(value = "/anyos")
	public @ResponseBody List<Combo> findAnyos(HttpServletRequest request) {
		List<Long> anyos = this.pagosService.findAllAnyos();
		List<Combo> anyosCombo = new ArrayList<>();
		for (Long anyo : anyos) {
			Combo combo = new Combo(anyo.toString(), anyo.toString(), anyo.toString());
			anyosCombo.add(combo);
		}
		return anyosCombo;
	}

	@GetMapping(value = "/anyosCopagos")
	public @ResponseBody List<Combo> findAnyosCopagos(HttpServletRequest request) {
		List<Long> anyos = this.copagosSeguimientoService.findAllAnyos();
		List<Combo> anyosCombo = new ArrayList<>();
		for (Long anyo : anyos) {
			Combo combo = new Combo(anyo.toString(), anyo.toString(), anyo.toString());
			anyosCombo.add(combo);
		}
		return anyosCombo;
	}

	@GetMapping(value = "/prestadores")
	public @ResponseBody List<Combo> findPrestadores(HttpServletRequest request) {

		PrestadorServicio prestadorServicio = new PrestadorServicio();
		List<PrestadorServicio> prestadores = this.prestadorServicioService.findAll(prestadorServicio, null);

		List<Combo> prestadoresCombo = new ArrayList<>();
		for (PrestadorServicio prestador : prestadores) {
			Combo combo = new Combo(prestador.getIdentificador73(), prestador.getRazonSocial73(),
					prestador.getRazonSocial73());
			prestadoresCombo.add(combo);
		}
		return prestadoresCombo;
	}

	@GetMapping(value = "/anioIPREMList")
	public @ResponseBody List<Iprem> getComboEjercicio(
			@RequestParam(value = "idExpediente00", required = false) String idExpediente00) {
		List<Iprem> anioIPREMList = this.ipremService.getAnioIPREMList();

		return anioIPREMList;
	}

	@GetMapping(value = "/tipoDatoEco")
	public @ResponseBody List<MaestroTiposDatoEco> getComboTipoDatoEco() {
		return this.maestroTiposDatoEcoService.findAllLike(new MaestroTiposDatoEco(), null, false);
	}

	@GetMapping(value = "/nivSoporte")
	public @ResponseBody List<MaestroNivSoporte> findNivelesSoporte(HttpServletRequest request) {
		return this.maestroNivSoporteService.findAll(new MaestroNivSoporte(), null);
	}

	@GetMapping(value = "/estadosInforme")
	public @ResponseBody List<Combo> findEstadosInforme(@QueryParam("tipoInforme16") String tipoInforme16,
			HttpServletRequest request) {

		// String tipoInforme16 = (String) request.getAttribute("tipoInforme16");

		List<Combo> listEstadoInformes = new ArrayList<>();

		if (UtilSeguridad.isDSS(request) || UtilSeguridad.isAdmin(request) || UtilSeguridad.isDirector(request)) {
			if (TipoInformesEnum.INFSOC.getId().equalsIgnoreCase(tipoInforme16)
					|| TipoInformesEnum.INFSUM.getId().equalsIgnoreCase(tipoInforme16)) {

				listEstadoInformes.add(EstadoInformesEnum.ENVIADO.getCombo());
			} else if (TipoInformesEnum.INFINT.getId().equalsIgnoreCase(tipoInforme16)) {
				listEstadoInformes.add(EstadoInformesEnum.SOLICITADO.getCombo());
				listEstadoInformes.add(EstadoInformesEnum.SOLICITADO_PROVEEDOR.getCombo());
				listEstadoInformes.add(EstadoInformesEnum.ENVIADO.getCombo());
			}
		} else if (UtilSeguridad.isSSB(request)) {
			if (TipoInformesEnum.INFSOC.getId().equalsIgnoreCase(tipoInforme16)) {
				listEstadoInformes.add(EstadoInformesEnum.INICIADO.getCombo());
				listEstadoInformes.add(EstadoInformesEnum.PENDIENTE_APORTAR.getCombo());
				listEstadoInformes.add(EstadoInformesEnum.PENDIENTE_ENVIAR.getCombo());
				listEstadoInformes.add(EstadoInformesEnum.ENVIADO.getCombo());
			} else if (TipoInformesEnum.INFINT.getId().equalsIgnoreCase(tipoInforme16)) {
				listEstadoInformes.add(EstadoInformesEnum.SOLICITADO.getCombo());
				listEstadoInformes.add(EstadoInformesEnum.EN_TRAMITACION.getCombo());
			}
		} else if (UtilSeguridad.isPS(request)) {
			if (TipoInformesEnum.INFINT.getId().equalsIgnoreCase(tipoInforme16)
					|| TipoInformesEnum.INFSUM.getId().equalsIgnoreCase(tipoInforme16)) {
				listEstadoInformes.add(EstadoInformesEnum.PENDIENTE_APORTAR.getCombo());
				listEstadoInformes.add(EstadoInformesEnum.PENDIENTE_ENVIAR.getCombo());
				listEstadoInformes.add(EstadoInformesEnum.ENVIADO.getCombo());
			}
		}

		return listEstadoInformes;
	}

	@GetMapping(value = "/gradoDependencia")
	public @ResponseBody List<Combo> findGradoDependencia(
			@RequestParam(value = "valorActual", required = false) Long valorActual, HttpServletRequest request) {
		List<Combo> gradoDependenciaList = new ArrayList<>();
		for (GradoDependenciaEnum enumeracion : GradoDependenciaEnum.valuesActivosYActual(valorActual)) {
			gradoDependenciaList.add(enumeracion.getCombo());
		}
		return gradoDependenciaList;
	}

	@GetMapping(value = "/motDenegacion")
	public @ResponseBody List<MaestroMotDenegacion> findMaestroMotDenegacion(
			@RequestParam(value = "procedimientoID", required = false) Long procedimientoID,
			HttpServletRequest request) {
		return this.maestroMotDenegacionService.findAll(new MaestroMotDenegacion(), null);
	}

	/**
	 * Metodo para obtener los motivos de anulación de cobros.
	 * 
	 * @param request HttpRequest
	 * @return List<MotAnuCobro>
	 */
	@GetMapping(value = "/motAnuCobro")
	public @ResponseBody List<MotAnuCobro> finMotivosAnulacionCobro(HttpServletRequest request) {
		return this.motAnuCobroService.findAllLike(new MotAnuCobro(), null, false);
	}

	@GetMapping(value = "/unidadesBaseInformes")
	public @ResponseBody List<UnidadesBase> getUnidadesBaseInformes(
			@RequestParam(value = "idUnidadBase92", required = false) Long idUnidadBase92,
			@RequestParam(value = "idProvincia92", required = false) String idProvincia92,
			@RequestParam(value = "idMunicipio92", required = false) String idMunicipio92,
			@RequestParam(value = "idUsuario80", required = false) Long idUsuario80) {

		List<UnidadesBase> listaUBAyuntamientoUsuario = new ArrayList<UnidadesBase>();
		if (null != idProvincia92 && null != idMunicipio92) {
			UnidadesBase ub = new UnidadesBase();
			ub.setIdProvincia92(idProvincia92);
			ub.setIdMunicipio92(idMunicipio92);
			ub.setUsuarios(new Usuarios(idUsuario80));
			ub.setBaja92("0");
			// ub.setUsuarios(usuario);
			listaUBAyuntamientoUsuario = this.unidadesBaseService.findUBAyunta(ub, false);
		} else if (null != idUnidadBase92) {

			UnidadesBase ub = new UnidadesBase();
			ub.setIdUnidadBase92(idUnidadBase92);
			listaUBAyuntamientoUsuario.add(this.unidadesBaseService.find(ub));
		}

		return listaUBAyuntamientoUsuario;
	}

	/**
	 * Obtenre la lista de tipos de procesos
	 * 
	 */
//	@RequestMapping(value = "/tiposMensajes", method = RequestMethod.GET)
//	public @ResponseBody List<HashMap<String, List<Combo>>> getTiposMensjae(@QueryParam("sentido") int sentido) {
//		ComboController.logger.info("[POST - tiposmensajes] : combo");
//
//		List<HashMap<String, List<Combo>>> retorno = new ArrayList<HashMap<String, List<Combo>>>();
//
//		if (Constantes.CERO == sentido || Constantes.DOS == sentido) {
//			HashMap<String, List<Combo>> grupo = new HashMap<String, List<Combo>>();
//			List<Combo> returnList = new ArrayList<>();
//			for (AccionesTelevidaEnum accion : AccionesTelevidaEnum.values()) {
//				returnList.add(accion.getCombo());
//			}
//			grupo.put("PS \u21E8 AD74A", returnList);
//			retorno.add(grupo);
//		}
//
//		if (Constantes.UNO == sentido || Constantes.DOS == sentido) {
//			HashMap<String, List<Combo>> grupo = new HashMap<String, List<Combo>>();
//			List<Combo> returnList = new ArrayList<>();
//			for (TipoComunicacionEnum tipo : TipoComunicacionEnum.values()) {
//				returnList.add(new Combo(tipo.value().toString(), tipo.value().toString(), tipo.value().toString()));
//			}
//			grupo.put("AD74A \u21E8 PS", returnList);
//			retorno.add(grupo);
//		}
//
//		return retorno;
//
//	}
	@RequestMapping(value = "/tiposMensajes", method = RequestMethod.GET)
	public @ResponseBody List<?> getTiposMensjae(@QueryParam("sentido") int sentido) {
		ComboController.logger.info("[POST - tiposmensajes] : combo");

		if (Constantes.DOS == sentido) {
			List<HashMap<String, List<Combo>>> retorno = new ArrayList<HashMap<String, List<Combo>>>();

			if (Constantes.CERO == sentido || Constantes.DOS == sentido) {
				HashMap<String, List<Combo>> grupo = new HashMap<String, List<Combo>>();
				List<Combo> returnList = new ArrayList<>();
				for (AccionesTelevidaEnum accion : AccionesTelevidaEnum.values()) {
					returnList.add(accion.getCombo());
				}
				grupo.put(UtilLiterales.getLiteralMessage(appMessageSource, "erroresTelevida.filtro.sentidoApp"),
						returnList);
				retorno.add(grupo);
			}

			if (Constantes.UNO == sentido || Constantes.DOS == sentido) {
				HashMap<String, List<Combo>> grupo = new HashMap<String, List<Combo>>();
				List<Combo> returnList = new ArrayList<>();
				for (TipoComunicacionEnum tipo : TipoComunicacionEnum.values()) {
					returnList
							.add(new Combo(tipo.value().toString(), tipo.value().toString(), tipo.value().toString()));
				}
				grupo.put(UtilLiterales.getLiteralMessage(appMessageSource, "erroresTelevida.filtro.sentidoPS"),
						returnList);
				retorno.add(grupo);
			}

			return retorno;
		} else if (Constantes.CERO == sentido) {
			List<Combo> returnList = new ArrayList<>();
			for (AccionesTelevidaEnum accion : AccionesTelevidaEnum.values()) {
				returnList.add(accion.getCombo());
			}
			return returnList;
		} else {
			List<Combo> returnList = new ArrayList<>();
			for (TipoComunicacionEnum tipo : TipoComunicacionEnum.values()) {
				returnList.add(new Combo(tipo.value().toString(), tipo.value().toString(), tipo.value().toString()));
			}
			return returnList;
		}

	}

	@GetMapping(value = "/tiposProceso")
	public @ResponseBody List<Combo> findTiposProceso(HttpServletRequest request) {
		List<Combo> tiposProcesoList = new ArrayList<>();
		for (ProcesosBatchEnum enumeracion : ProcesosBatchEnum.values()) {
			tiposProcesoList.add(enumeracion.getCombo());
		}
		return tiposProcesoList;
	}

	@GetMapping(value = "/estadosProceso")
	public @ResponseBody List<Combo> findEstadosProceso(HttpServletRequest request) {
		List<Combo> tiposProcesoList = new ArrayList<>();
		for (EstadosProcesosBatchEnum enumeracion : EstadosProcesosBatchEnum.values()) {
			tiposProcesoList.add(enumeracion.getCombo());
		}
		return tiposProcesoList;
	}
}
