package com.ejie.ab79.control.inspecciones;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

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.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
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.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.SessionAttributes;

import com.ejie.ab79.clientesWS.ab61WebService.Usuario;
import com.ejie.ab79.dao.inspecciones.EstadosInspeccionDao;
import com.ejie.ab79.dao.inspecciones.ResultadosInspeccionDao;
import com.ejie.ab79.model.ActuacionesJson;
import com.ejie.ab79.model.DocumentosDescargar;
import com.ejie.ab79.model.InspeccionesJson;
import com.ejie.ab79.model.Inspectores;
import com.ejie.ab79.model.PreguntasJson;
import com.ejie.ab79.model.RelEstIns;
import com.ejie.ab79.model.actuaciones.Actuaciones;
import com.ejie.ab79.model.actuaciones.RelActDoc;
import com.ejie.ab79.model.expedientes.DatosTerceros;
import com.ejie.ab79.model.inspecciones.EstadosInspeccion;
import com.ejie.ab79.model.inspecciones.Inspecciones;
import com.ejie.ab79.model.inspecciones.RelExpIns;
import com.ejie.ab79.model.inspecciones.ResultadosInspeccion;
import com.ejie.ab79.model.preguntasRespuestas.FicherosAdjExp;
import com.ejie.ab79.model.preguntasRespuestas.FicherosAdjPro;
import com.ejie.ab79.model.preguntasRespuestas.OpcionesPreExp;
import com.ejie.ab79.model.preguntasRespuestas.PreguntasExpediente;
import com.ejie.ab79.model.preguntasRespuestas.RespuestasExpediente;
import com.ejie.ab79.model.preguntasRespuestas.RespuestasProtocolo;
import com.ejie.ab79.service.ActuacionesJsonService;
import com.ejie.ab79.service.DocumentosDescargarService;
import com.ejie.ab79.service.InspeccionesJsonService;
import com.ejie.ab79.service.PreguntasJsonService;
import com.ejie.ab79.service.RelEstInsService;
import com.ejie.ab79.service.actuaciones.ActuacionesService;
import com.ejie.ab79.service.actuaciones.RelActDocService;
import com.ejie.ab79.service.expedientes.DatosDireccionesService;
import com.ejie.ab79.service.expedientes.DatosTercerosService;
import com.ejie.ab79.service.inspecciones.InspeccionesService;
import com.ejie.ab79.service.inspecciones.RelExpInsService;
import com.ejie.ab79.service.preguntasRespuestas.FicherosAdjExpService;
import com.ejie.ab79.service.preguntasRespuestas.FicherosAdjProService;
import com.ejie.ab79.service.preguntasRespuestas.OpcionesPreExpService;
import com.ejie.ab79.service.preguntasRespuestas.PreguntasExpedienteService;
import com.ejie.ab79.service.preguntasRespuestas.RespuestasExpedienteService;
import com.ejie.ab79.service.preguntasRespuestas.RespuestasProtocoloService;
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;

/**
 * InspeccionesController  
 * 
 *  
 */

@Controller
@SessionAttributes("usuario")
@RequestMapping(value = "/inspecciones")

public class InspeccionesController {

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

	@Autowired
	private InspeccionesService inspeccionesService;

	@Autowired
	private EstadosInspeccionDao estadosInspeccionDao;

	@Autowired
	private ResultadosInspeccionDao resultadosInspeccionDao;

	@Autowired
	private DocumentosDescargarService documentosDescargarService;

	@Autowired
	private PreguntasExpedienteService preguntasExpedienteService;

	@Autowired
	private OpcionesPreExpService opcionesPreExpService;

	@Autowired
	private RespuestasExpedienteService respuestasExpedienteService;

	@Autowired
	private FicherosAdjExpService ficherosAdjExpService;

	@Autowired
	private ActuacionesService actuacionesService;

	@Autowired
	private RelActDocService relActDocService;

	@Autowired
	private RelEstInsService relEstInsService;

	@Autowired
	private DatosTercerosService datosTercerosService;

	@Autowired
	private DatosDireccionesService datosDireccionesService;

	@Autowired
	private RespuestasProtocoloService respuestasProtocoloService;

	@Autowired
	private FicherosAdjProService ficherosAdjProService;

	@Autowired
	private RelExpInsService relExpInsService;

	@Autowired
	private PreguntasJsonService preguntasJsonService;

	@Autowired
	private InspeccionesJsonService inspeccionesJsonService;

	@Autowired
	private ActuacionesJsonService actuacionesJsonService;

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

	/**
	 * Operacion CRUD Read. Devuelve el bean correspondiente al identificador
	 * indicado.
	 * 
	 * @param idInspeccion
	 *            Integer
	 * @return Inspecciones Objeto correspondiente al identificador indicado.
	 */
	@RequestMapping(value = "/{idInspeccion}", method = RequestMethod.GET)
	public @ResponseBody Inspecciones get(@PathVariable Integer idInspeccion) {
		Inspecciones inspecciones = new Inspecciones();
		inspecciones.setIdInspeccion(idInspeccion);
		inspecciones = this.inspeccionesService.find(inspecciones);
		InspeccionesController.logger.info("[GET - findBy_PK] : Obtener Inspecciones por PK");
		return inspecciones;
	}

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

	/**
	 * Operacion CRUD Edit. Modificacion del bean indicado.
	 *
	 * @param inspecciones
	 *            Inspecciones Bean que contiene la informacion a modificar.
	 * @return Inspecciones Bean resultante de la modificacion.
	 */
	@RequestMapping(method = RequestMethod.PUT)
	public @ResponseBody Inspecciones edit(@RequestBody Inspecciones inspecciones) {
		Inspecciones inspeccionesAux = this.inspeccionesService.update(inspecciones);
		InspeccionesController.logger.info("[PUT] : Inspecciones actualizado correctamente");
		return inspeccionesAux;
	}

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

	/**
	 * Operacion CRUD Delete. Borrado del registro correspondiente al
	 * identificador especificado.
	 *
	 * @param idInspeccion
	 *            Integer Identificador del objeto que se desea eliminar.
	 * @return Inspecciones Bean eliminado.
	 */
	@RequestMapping(value = "/{idInspeccion}", method = RequestMethod.DELETE)
	@ResponseStatus(value = HttpStatus.OK)
	public @ResponseBody Inspecciones remove(@PathVariable Integer idInspeccion) {
		Inspecciones inspecciones = new Inspecciones();
		inspecciones.setIdInspeccion(idInspeccion);
		this.inspeccionesService.remove(inspecciones);
		InspeccionesController.logger.info("[DELETE] : Inspecciones borrado correctamente");
		return inspecciones;
	}

	/*
	 * 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) {
		InspeccionesController.logger.info("[GET - View] : inspecciones");
		return "inspecciones";
	}

	/**
	 * M�todo que devuelve la vista modal para crear una inspecci�n desde
	 * AB79
	 * 
	 * @param model
	 * @param abrirModal
	 * @return
	 */
	@RequestMapping(value = "/crearInspeccionModal", method = RequestMethod.GET)
	public String crearInspeccionModal(Model model) {
		InspeccionesController.logger.info("GET - View : crearInspeccion");
		return "crearInspeccion";
	}

	@RequestMapping(value = "/generarInspeccion", method = RequestMethod.POST)
	public @ResponseBody String generarInspeccion(@RequestBody Inspecciones inspeccion,
			@ModelAttribute("usuario") Usuario usuario) {

		Inspecciones inspeccionAux = this.inspeccionesService.generarInspeccion(inspeccion, usuario);
		return "fichadeinspeccion/maint/" + inspeccionAux.getIdInspeccion();
	}

	/**
	 * Operacion de filtrado del componente RUP_TABLE.
	 * 
	 * @param filterInspecciones
	 *            Inspecciones 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<Inspecciones> Dto que contiene el resultado del
	 *         filtrado realizado por el componente RUP_TABLE.
	 */
	@RequestMapping(value = "/filter", method = RequestMethod.POST)
	public @ResponseBody TableResponseDto<Inspecciones> filter(
			@RequestJsonBody(param = "filter") Inspecciones filterInspecciones,
			@RequestJsonBody TableRequestDto tableRequestDto) {
		InspeccionesController.logger.info("[POST - filter] : Obtener Inspeccioness");
		return this.inspeccionesService.filter(filterInspecciones, tableRequestDto, false);
	}

	/**
	 * Operacion de busqueda del componente RUP_TABLE.
	 * 
	 * @param filterInspecciones
	 *            Inspecciones Bean que contiene los parametros de filtrado a
	 *            emplear.
	 * @param searchInspecciones
	 *            Inspecciones 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<Inspecciones> Dto que contiene el resultado de la
	 *         busqueda realizada por el componente RUP_TABLE.
	 */
	@RequestMapping(value = "/search", method = RequestMethod.POST)
	public @ResponseBody List<TableRowDto<Inspecciones>> search(
			@RequestJsonBody(param = "filter") Inspecciones filterInspecciones,
			@RequestJsonBody(param = "search") Inspecciones searchInspecciones,
			@RequestJsonBody TableRequestDto tableRequestDto) {
		InspeccionesController.logger.info("[POST - search] : Buscar Inspeccioness");
		return this.inspeccionesService.search(filterInspecciones, searchInspecciones, tableRequestDto, false);
	}

	/**
	 * Borrado multiple de registros
	 * 
	 * @param filterInspecciones
	 *            Inspecciones 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(param = "filter") Inspecciones filterInspecciones,
			@RequestJsonBody TableRequestDto tableRequestDto) {
		InspeccionesController.logger
				.info("[POST - search] : [POST - removeMultiple] : Eliminar multiples Inspeccioness");
		this.inspeccionesService.removeMultiple(filterInspecciones, tableRequestDto, false);
		InspeccionesController.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 filterInspecciones
	 *            Inspecciones 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<Inspecciones>> Dto que contiene el
	 *         resultado del filtrado realizado por el componente RUP_TABLE.
	 */
	@RequestMapping(value = "/jerarquia/filter", method = RequestMethod.POST)
	public @ResponseBody TableResponseDto<JerarquiaDto<Inspecciones>> jerarquia(
			@RequestJsonBody(param = "filter") Inspecciones filterInspecciones,
			@RequestJsonBody TableRequestDto tableRequestDto) {
		InspeccionesController.logger.info("[POST - jerarquia] : Obtener Inspeccioness jerarquia");
		return this.inspeccionesService.jerarquia(filterInspecciones, tableRequestDto, false);
	}

	/**
	 * Recupera los hijos de los registros desplegados en la visualizacion
	 * jerarquica.
	 * 
	 * @param filterInspecciones
	 *            Inspecciones 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<Inspecciones>> Dto que contiene el
	 *         resultado del filtrado realizado por el componente RUP_TABLE.
	 */
	@RequestMapping(value = "/jerarquiaChildren", method = RequestMethod.POST)
	public @ResponseBody TableResponseDto<JerarquiaDto<Inspecciones>> jerarquiaChildren(
			@RequestJsonBody(param = "filter") Inspecciones filterInspecciones,
			@RequestJsonBody TableRequestDto tableRequestDto) {
		InspeccionesController.logger.info("[POST - jerarquia] : Obtener Inspeccioness jerarquia - Hijos");
		return this.inspeccionesService.jerarquiaChildren(filterInspecciones, tableRequestDto);
	}

	/**
	 * EXPORTERS
	 */

	@RequestMapping(value = "/clipboardReport", method = RequestMethod.POST)
	protected @ResponseBody List<Inspecciones> getClipboardReport(
			@RequestJsonBody(param = "filter") Inspecciones filterInspecciones,
			@RequestJsonBody TableRequestDto tableRequestDto) {
		InspeccionesController.logger.info("[POST - clipboardReport] : : Copiar multiples usuarios");
		return this.inspeccionesService.getMultiple(filterInspecciones, tableRequestDto, false);
	}

	/**
	 * M�todo que genera una hoja de excel con los resultados de b�squeda de
	 * inspecciones.
	 */
	@RequestMapping(value = { "/exportarExcel/{sidx}/{sord}" }, method = RequestMethod.POST)
	public void getExcel(@ModelAttribute Inspecciones filterInspecciones, @PathVariable String sidx,
			@PathVariable String sord, @ModelAttribute TableRequestDto tableRequestDto, HttpServletRequest request,
			HttpServletResponse response) {

		try {
			List<Inspecciones> listaInspecciones;

			tableRequestDto.setSidx(sidx);
			tableRequestDto.setSord(sord);

			if (filterInspecciones.getIdentificadorInspeccion().equals("")) {
				filterInspecciones.setIdentificadorInspeccion(null);
			}
			if (filterInspecciones.getDatosDirecciones().getCodigoPostal().equals("")) {
				filterInspecciones.getDatosDirecciones().setCodigoPostal(null);
			}
			if (filterInspecciones.getDatosDirecciones().getDireccion().equals("")) {
				filterInspecciones.getDatosDirecciones().setDireccion(null);
			}
			if (filterInspecciones.getDatosDirecciones().getEscalera().equals("")) {
				filterInspecciones.getDatosDirecciones().setEscalera(null);
			}
			if (filterInspecciones.getDatosDirecciones().getLetra().equals("")) {
				filterInspecciones.getDatosDirecciones().setLetra(null);
			}
			if (filterInspecciones.getDatosDirecciones().getNumero().equals("")) {
				filterInspecciones.getDatosDirecciones().setNumero(null);
			}
			if (filterInspecciones.getDatosDirecciones().getPiso().equals("")) {
				filterInspecciones.getDatosDirecciones().setPiso(null);
			}
			if (filterInspecciones.getDatosDirecciones().getComplementoDireccion() != null
					&& filterInspecciones.getDatosDirecciones().getComplementoDireccion().equals("")) {
				filterInspecciones.getDatosDirecciones().setComplementoDireccion(null);
			}
			if (filterInspecciones.getExpediente().getFolderNumber().equals("")) {
				filterInspecciones.getExpediente().setFolderNumber(null);
			}
			if (filterInspecciones.getExpediente().getTitulo().equals("")) {
				filterInspecciones.getExpediente().setTitulo(null);
			}
			if (filterInspecciones.getnRegistro().equals("")) {
				filterInspecciones.setnRegistro(null);
			}
			if (filterInspecciones.getInspector().getIdInspector() == null) {
				filterInspecciones.setInspector(null);
			}

			if (filterInspecciones.getIdsComboEstadoInspeccion() != null) {
				List<String> idsComboEstadoInspeccion = new ArrayList<String>();
				String str[];
				if (!"".equals(filterInspecciones.getIdsComboEstadoInspeccion())) {
					str = filterInspecciones.getIdsComboEstadoInspeccion().split(",");
					idsComboEstadoInspeccion = Arrays.asList(str);
				}

				List<EstadosInspeccion> estadosInspeccion = this.estadosInspeccionDao
						.findByDesEstIns(idsComboEstadoInspeccion);
				if (!estadosInspeccion.isEmpty()) {
					String idsEstadoInspeccion = "";
					for (EstadosInspeccion estadoInspeccion : estadosInspeccion) {
						idsEstadoInspeccion += estadoInspeccion.getIdEstadoInspeccion() + ",";
					}

					idsEstadoInspeccion = idsEstadoInspeccion.substring(0, idsEstadoInspeccion.length() - 1);
					filterInspecciones.setIdsEstadoInspeccion(idsEstadoInspeccion);
				}

			}

			if (filterInspecciones.getResultadoInspeccion() != null
					&& filterInspecciones.getResultadoInspeccion().getDesResIns() != null) {
				List<ResultadosInspeccion> resultadosInspeccion = this.resultadosInspeccionDao
						.findByDesResIns(filterInspecciones.getResultadoInspeccion().getDesResIns());
				if (!resultadosInspeccion.isEmpty()) {
					String idsResultadoInspeccion = "";
					for (ResultadosInspeccion resultadoInspeccion : resultadosInspeccion) {
						idsResultadoInspeccion += resultadoInspeccion.getIdResultadoInspeccion() + ",";
					}

					idsResultadoInspeccion = idsResultadoInspeccion.substring(0, idsResultadoInspeccion.length() - 1);
					filterInspecciones.setIdsResultadoInspeccion(idsResultadoInspeccion);
				}
			}

			listaInspecciones = this.inspeccionesService.findAllLike(filterInspecciones, tableRequestDto, false);

			this.inspeccionesService.getExcel(listaInspecciones, response);

		} catch (Exception e) {
			InspeccionesController.logger.error("[Exportar Excel] ERROR : ", e);
		}
	}

	@RequestMapping(value = { "/asignarInspector/{idInspector}" }, method = RequestMethod.POST)
	public @ResponseBody String asignarInspector(String[] valores, @PathVariable Integer idInspector) {

		List<Inspecciones> listaInspecciones = new ArrayList<Inspecciones>();

		for (int x = 0; x < valores.length; x++) {
			Inspecciones inspeccion = new Inspecciones();
			inspeccion.setIdInspeccion(Integer.parseInt(valores[x]));
			Inspectores inspector = new Inspectores();
			inspector.setIdInspector(idInspector);

			inspeccion.setInspector(inspector);

			listaInspecciones.add(inspeccion);
		}

		listaInspecciones = this.inspeccionesService.asignarInspector(listaInspecciones);

		return null;
	}

	@RequestMapping(value = { "/enviarTablet/{enviar}" }, method = RequestMethod.POST)
	public @ResponseBody String enviarTablet(String[] valores, @PathVariable Integer enviar) {

		List<Inspecciones> listaInspecciones = new ArrayList<Inspecciones>();

		for (int x = 0; x < valores.length; x++) {
			Inspecciones inspeccion = new Inspecciones();
			inspeccion.setIdInspeccion(Integer.parseInt(valores[x]));

			listaInspecciones.add(inspeccion);
		}

		listaInspecciones = this.inspeccionesService.enviarTablet(listaInspecciones, enviar);

		return null;
	}

	@RequestMapping(value = {
			"/inspeccionesAsociadas/{provinciaPrecargada}/{direccionPrecargada}" }, method = RequestMethod.POST)
	public @ResponseBody Integer inspeccionesAsociadasDireccion(@PathVariable Integer provinciaPrecargada,
			@PathVariable Integer direccionPrecargada) {

		Integer inspeccionesAsociadas = this.inspeccionesService.inspeccionesAsociadasDireccion(provinciaPrecargada,
				direccionPrecargada);

		return inspeccionesAsociadas;
	}

	@RequestMapping(value = { "/inspeccionesAsociadas/{provinciaPrecargada}" }, method = RequestMethod.POST)
	public @ResponseBody Integer inspeccionesAsociadas(@PathVariable Integer provinciaPrecargada) {

		Integer inspeccionesAsociadas = this.inspeccionesService.inspeccionesAsociadas(provinciaPrecargada);

		return inspeccionesAsociadas;
	}

	/**
	 * 
	 * @param idInspeccion
	 *            Integer
	 * 
	 * @return Integer
	 */
	@RequestMapping(value = "/comprobarInspectorInspeccion/{idInspeccion}", method = RequestMethod.GET)
	public @ResponseBody Inspectores comprobarInspectorInspeccion(@PathVariable int idInspeccion) {

		return this.inspeccionesService.comprobarInspectorInspeccion(idInspeccion);
	}

	/**
	 * 
	 * @param idInspeccion
	 *            Integer
	 * 
	 * @return Integer
	 */
	@RequestMapping(value = "/eliminarInspeccionOficioSinExpedienteAbierto/{idInspeccion}", method = RequestMethod.GET)
	public @ResponseBody Inspecciones eliminarInspeccionOficioSinExpedienteAbierto(@PathVariable int idInspeccion) {

		Inspecciones inspeccion = new Inspecciones();
		inspeccion.setIdInspeccion(idInspeccion);
		Inspecciones inspeccionBD = this.inspeccionesService.find(inspeccion);

		DocumentosDescargar documentosDescargar = new DocumentosDescargar();
		documentosDescargar.setInspeccion(inspeccion);
		List<DocumentosDescargar> listaDocumentosDescargas = this.documentosDescargarService
				.findAll(documentosDescargar, new TableRequestDto());

		if (!listaDocumentosDescargas.isEmpty()) {

			for (int i = 0; i < listaDocumentosDescargas.size(); i++) {
				this.documentosDescargarService.remove(listaDocumentosDescargas.get(i));
			}

		}

		PreguntasExpediente preguntasExpediente = new PreguntasExpediente();
		preguntasExpediente.setInspeccion(inspeccion);

		List<PreguntasExpediente> listaPreguntasExpediente = this.preguntasExpedienteService
				.findAll(preguntasExpediente, new TableRequestDto());

		if (!listaPreguntasExpediente.isEmpty()) {

			for (int i = 0; i < listaPreguntasExpediente.size(); i++) {

				eliminarOpcionesPreguntaExpediente(listaPreguntasExpediente.get(i));
				eliminarRespuestaPreguntaExpediente(listaPreguntasExpediente.get(i));
				eliminarArchivosAdjRespPreguntaExpediente(listaPreguntasExpediente.get(i));
				eliminarPreguntaJSON(listaPreguntasExpediente.get(i));
				this.preguntasExpedienteService.remove(listaPreguntasExpediente.get(i));
			}

		}

		Actuaciones actuaciones = new Actuaciones();
		actuaciones.setInspeccion(inspeccion);

		List<Actuaciones> listaActuaciones = this.actuacionesService.findAll(actuaciones, new TableRequestDto());

		if (!listaActuaciones.isEmpty()) {

			for (int i = 0; i < listaActuaciones.size(); i++) {

				eliminarDocumentosActuaciones(listaActuaciones.get(i));
				this.actuacionesService.remove(listaActuaciones.get(i));
			}

		}

		RelEstIns relEstIns = new RelEstIns();
		relEstIns.setInspeccionBD(new Inspecciones(idInspeccion));

		List<RelEstIns> listaRelEstIns = this.relEstInsService.findAll(relEstIns, new TableRequestDto());

		if (!listaRelEstIns.isEmpty()) {

			for (int i = 0; i < listaRelEstIns.size(); i++) {

				this.relEstInsService.remove(listaRelEstIns.get(i));
				eliminarDatosTerceroYDireccion(listaRelEstIns.get(i));

			}

		}

		RespuestasProtocolo respuestasProtocolo = new RespuestasProtocolo();
		respuestasProtocolo.setInspeccion(new Inspecciones(idInspeccion));

		List<RespuestasProtocolo> listaRespuestasProtocolo = this.respuestasProtocoloService
				.findAll(respuestasProtocolo, new TableRequestDto());

		if (!listaRespuestasProtocolo.isEmpty()) {

			for (int i = 0; i < listaRespuestasProtocolo.size(); i++) {

				eliminarArchivosAdjuntosRespuestasProtocolo(listaRespuestasProtocolo.get(i));
				this.respuestasProtocoloService.remove(listaRespuestasProtocolo.get(i));
			}

		}

		RelExpIns relExpIns = new RelExpIns();
		relExpIns.setInspecciones(new Inspecciones(idInspeccion));

		List<RelExpIns> listaRelExpIns = this.relExpInsService.findAll(relExpIns, new TableRequestDto());

		if (!listaRelExpIns.isEmpty()) {

			for (int i = 0; i < listaRelExpIns.size(); i++) {
				this.relExpInsService.remove(listaRelExpIns.get(i));
			}

		}

		InspeccionesJson inspeccionesJson = new InspeccionesJson();
		inspeccionesJson.setIdInspeccion(idInspeccion);
		List<InspeccionesJson> listaInspeccionesJson = this.inspeccionesJsonService.findAll(inspeccionesJson,
				new TableRequestDto());

		if (!listaInspeccionesJson.isEmpty()) {

			for (int i = 0; i < listaInspeccionesJson.size(); i++) {
				eliminarActuacionesJson(listaInspeccionesJson.get(i));
				this.inspeccionesJsonService.remove(listaInspeccionesJson.get(i));
			}

		}

		this.inspeccionesService.remove(inspeccionBD);

		return inspeccion;
	}

	private void eliminarOpcionesPreguntaExpediente(PreguntasExpediente preguntasExpediente) {

		OpcionesPreExp opcionesPreExp = new OpcionesPreExp();
		opcionesPreExp.setIdPreguntaExpediente(preguntasExpediente.getIdPreguntaExpediente());

		List<OpcionesPreExp> listaOpcionesPreExp = this.opcionesPreExpService.findAll(opcionesPreExp,
				new TableRequestDto());

		if (!listaOpcionesPreExp.isEmpty()) {

			for (int i = 0; i < listaOpcionesPreExp.size(); i++) {
				this.opcionesPreExpService.remove(listaOpcionesPreExp.get(i));
			}

		}
	}

	private void eliminarRespuestaPreguntaExpediente(PreguntasExpediente preguntasExpediente) {

		RespuestasExpediente respuestasExpediente = new RespuestasExpediente();
		respuestasExpediente.setPreguntaExpediente(preguntasExpediente);

		List<RespuestasExpediente> listaRespuestasExpediente = this.respuestasExpedienteService
				.findAll(respuestasExpediente, new TableRequestDto());

		if (!listaRespuestasExpediente.isEmpty()) {

			for (int i = 0; i < listaRespuestasExpediente.size(); i++) {
				eliminarFicherosAjuntoExpediente(listaRespuestasExpediente.get(i));
				this.respuestasExpedienteService.remove(listaRespuestasExpediente.get(i));
			}

		}
	}

	private void eliminarArchivosAdjRespPreguntaExpediente(PreguntasExpediente preguntasExpediente) {

		FicherosAdjExp ficherosAdjExp = new FicherosAdjExp();
		ficherosAdjExp.setIdPreguntaExpediente(preguntasExpediente.getIdPreguntaExpediente());

		List<FicherosAdjExp> listaFicherosAdjExp = this.ficherosAdjExpService.findAll(ficherosAdjExp,
				new TableRequestDto());

		if (!listaFicherosAdjExp.isEmpty()) {

			for (int i = 0; i < listaFicherosAdjExp.size(); i++) {
				this.ficherosAdjExpService.remove(listaFicherosAdjExp.get(i));
			}

		}
	}

	private void eliminarPreguntaJSON(PreguntasExpediente preguntasExpediente) {

		PreguntasJson preguntasJson = new PreguntasJson();
		preguntasJson.setIdPreguntaExpediente(preguntasExpediente.getIdPreguntaExpediente());

		List<PreguntasJson> listaPreguntasJson = this.preguntasJsonService.findAll(preguntasJson,
				new TableRequestDto());

		if (!listaPreguntasJson.isEmpty()) {

			for (int i = 0; i < listaPreguntasJson.size(); i++) {
				this.preguntasJsonService.remove(listaPreguntasJson.get(i));
			}

		}
	}

	private void eliminarDocumentosActuaciones(Actuaciones actuaciones) {

		RelActDoc relActDoc = new RelActDoc();
		relActDoc.setActuacion(actuaciones);
		List<RelActDoc> listaRelActDoc = this.relActDocService.findAll(relActDoc, new TableRequestDto());

		if (!listaRelActDoc.isEmpty()) {

			for (int i = 0; i < listaRelActDoc.size(); i++) {
				this.relActDocService.remove(listaRelActDoc.get(i));
			}

		}
	}

	private void eliminarDatosTerceroYDireccion(RelEstIns relEstIns) {

		DatosTerceros datosTerceros = new DatosTerceros();
		datosTerceros.setIdTercero(relEstIns.getIdTercero());
		this.datosDireccionesService.eliminarTercero(datosTerceros);
		this.datosTercerosService.removeIdTercero(datosTerceros);

	}

	private void eliminarArchivosAdjuntosRespuestasProtocolo(RespuestasProtocolo respuestasProtocolo) {

		FicherosAdjPro ficherosAdjPro = new FicherosAdjPro();
		ficherosAdjPro.setIdRespuestaProtocolo(respuestasProtocolo.getIdRespuestaProtocolo());

		List<FicherosAdjPro> listaFicherosAdjPro = this.ficherosAdjProService.findAll(ficherosAdjPro,
				new TableRequestDto());

		if (!listaFicherosAdjPro.isEmpty()) {

			for (int i = 0; i < listaFicherosAdjPro.size(); i++) {
				this.ficherosAdjProService.remove(listaFicherosAdjPro.get(i));
			}

		}
	}

	private void eliminarFicherosAjuntoExpediente(RespuestasExpediente respuestasExpediente) {

		FicherosAdjExp ficherosAdjExp = new FicherosAdjExp();
		ficherosAdjExp.setIdRespuestaExpediente(respuestasExpediente.getIdRespuestaExpediente());
		List<FicherosAdjExp> listaFicherosAdjExp = this.ficherosAdjExpService.findAll(ficherosAdjExp,
				new TableRequestDto());

		if (!listaFicherosAdjExp.isEmpty()) {

			for (int i = 0; i < listaFicherosAdjExp.size(); i++) {
				this.ficherosAdjExpService.remove(listaFicherosAdjExp.get(i));
			}

		}

	}

	private void eliminarActuacionesJson(InspeccionesJson inspeccionesJson) {

		ActuacionesJson actuacionesJson = new ActuacionesJson();
		actuacionesJson.setInspeccionesJson(new InspeccionesJson(inspeccionesJson.getIdInspeccionJson()));
		List<ActuacionesJson> listaActuacionesJson = this.actuacionesJsonService.findAll(actuacionesJson,
				new TableRequestDto());

		if (!listaActuacionesJson.isEmpty()) {

			for (int i = 0; i < listaActuacionesJson.size(); i++) {
				this.actuacionesJsonService.remove(listaActuacionesJson.get(i));
			}

		}

	}

}
