package com.ejie.ab79.service.preguntasRespuestas;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.ejie.ab79.comun.Constantes;
import com.ejie.ab79.dao.preguntasRespuestas.RespuestasProtocoloDao;
import com.ejie.ab79.model.REST.servicioWeb.RespuestaProtocolo;
import com.ejie.ab79.model.inspecciones.Inspecciones;
import com.ejie.ab79.model.preguntasRespuestas.FicherosAdjPro;
import com.ejie.ab79.model.preguntasRespuestas.PreguntasProtocolo;
import com.ejie.ab79.model.preguntasRespuestas.PreguntasRespuestasProtocolo;
import com.ejie.ab79.model.preguntasRespuestas.RelProPre;
import com.ejie.ab79.model.preguntasRespuestas.RespuestasProtocolo;
import com.ejie.ab79.webservice.adaptadores.ab61WebServiceAdaptador;
import com.ejie.x38.dto.JerarquiaDto;
import com.ejie.x38.dto.TableRequestDto;
import com.ejie.x38.dto.TableResponseDto;
import com.ejie.x38.dto.TableRowDto;

/**
 * RespuestasProtocoloServiceImpl  
 * 
 *  
 */

@Service(value = "respuestasProtocoloService")
public class RespuestasProtocoloServiceImpl implements RespuestasProtocoloService {

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

	@Autowired
	private RespuestasProtocoloDao respuestasProtocoloDao;
	@Autowired
	private FicherosAdjProService ficherosAdjProService;
	@Autowired
	private ab61WebServiceAdaptador ab61WebServiceAdaptadorService;

	/**
	 * Inserts a single row in the RespuestasProtocolo table.
	 *
	 * @param respuestasProtocolo
	 *            RespuestasProtocolo
	 * @return RespuestasProtocolo
	 */
	@Transactional(rollbackFor = Throwable.class)
	public RespuestasProtocolo add(RespuestasProtocolo respuestasProtocolo) {
		return this.respuestasProtocoloDao.add(respuestasProtocolo);
	}

	/**
	 * Updates a single row in the RespuestasProtocolo table.
	 *
	 * @param respuestasProtocolo
	 *            RespuestasProtocolo
	 * @return RespuestasProtocolo
	 */
	@Transactional(rollbackFor = Throwable.class)
	public RespuestasProtocolo update(RespuestasProtocolo respuestasProtocolo) {
		return this.respuestasProtocoloDao.update(respuestasProtocolo);
	}

	/**
	 * Finds a single row in the RespuestasProtocolo table.
	 *
	 * @param respuestasProtocolo
	 *            RespuestasProtocolo
	 * @return RespuestasProtocolo
	 */
	public RespuestasProtocolo find(RespuestasProtocolo respuestasProtocolo) {
		return (RespuestasProtocolo) this.respuestasProtocoloDao.find(respuestasProtocolo);
	}

	@Override
	public RelProPre findRelProPre(Inspecciones inspeccion, RespuestaProtocolo respuestaProtocolo) {
		return (RelProPre) this.respuestasProtocoloDao.findRelProPre(inspeccion, respuestaProtocolo);
	}

	/**
	 * Deletes a single row in the RespuestasProtocolo table.
	 *
	 * @param respuestasProtocolo
	 *            RespuestasProtocolo
	 */
	@Transactional(rollbackFor = Throwable.class)
	public void remove(RespuestasProtocolo respuestasProtocolo) {
		this.respuestasProtocoloDao.remove(respuestasProtocolo);
	}

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

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

	@Override
	public List<RespuestaProtocolo> findRespuestasProtocoloREST(Integer idInspeccion) {
		return (List<RespuestaProtocolo>) this.respuestasProtocoloDao.findRespuestasProtocoloREST(idInspeccion);
	}

	/*
	 * OPERACIONES RUP_TABLE
	 */

	/**
	 * Removes rows from the RespuestasProtocolo table.
	 *
	 * @param filterRespuestasProtocolo
	 *            RespuestasProtocolo
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @param startsWith
	 *            Boolean
	 */
	public void removeMultiple(RespuestasProtocolo filterRespuestasProtocolo, TableRequestDto tableRequestDto,
			Boolean startsWith) {
		this.respuestasProtocoloDao.removeMultiple(filterRespuestasProtocolo, tableRequestDto, startsWith);
	}

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

		TableResponseDto<RespuestasProtocolo> usuarioDto = new TableResponseDto<RespuestasProtocolo>(tableRequestDto,
				recordNum, listaRespuestasProtocolo);

		if (tableRequestDto.getMultiselection().getSelectedIds() != null) {
			List<TableRowDto<RespuestasProtocolo>> reorderSelection = this.respuestasProtocoloDao
					.reorderSelection(filterRespuestasProtocolo, tableRequestDto, startsWith);
			usuarioDto.setReorderedSelection(reorderSelection);
			usuarioDto.addAdditionalParam("reorderedSelection", reorderSelection);
			usuarioDto.addAdditionalParam("selectedAll", tableRequestDto.getMultiselection().getSelectedAll());
		}
		if (tableRequestDto.getSeeker().getSelectedIds() != null) {
			tableRequestDto.setMultiselection(tableRequestDto.getSeeker());
			List<TableRowDto<RespuestasProtocolo>> reorderSeeker = this.respuestasProtocoloDao
					.reorderSelection(filterRespuestasProtocolo, tableRequestDto, startsWith);
			usuarioDto.setReorderedSeeker(reorderSeeker);
			usuarioDto.addAdditionalParam("reorderedSeeker", reorderSeeker);
		}
		return usuarioDto;
	}

	/**
	 * Searches rows in the RespuestasProtocolo table.
	 *
	 * @param filterRespuestasProtocolo
	 *            RespuestasProtocolo
	 * @param searchRespuestasProtocolo
	 *            RespuestasProtocolo
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<TableRowDto<RespuestasProtocolo>>
	 */
	public List<TableRowDto<RespuestasProtocolo>> search(RespuestasProtocolo filterRespuestasProtocolo,
			RespuestasProtocolo searchRespuestasProtocolo, TableRequestDto tableRequestDto, Boolean startsWith) {
		return this.respuestasProtocoloDao.search(filterRespuestasProtocolo, searchRespuestasProtocolo, tableRequestDto,
				startsWith);
	}

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

	/*
	 * OPERACIONES RUP_TABLE JERARQUIA
	 */

	/**
	 * Finder method in the hierarchical the RespuestasProtocolo table.
	 *
	 * @param filterRespuestasProtocolo
	 *            RespuestasProtocolo
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return TableResponseDto<JerarquiaDto<RespuestasProtocolo>>
	 */
	public TableResponseDto<JerarquiaDto<RespuestasProtocolo>> jerarquia(RespuestasProtocolo filterRespuestasProtocolo,
			TableRequestDto tableRequestDto, Boolean startsWith) {
		List<JerarquiaDto<RespuestasProtocolo>> listaRespuestasProtocolo = this.respuestasProtocoloDao
				.findAllLikeJerarquia(filterRespuestasProtocolo, tableRequestDto);
		Long recordNum = this.respuestasProtocoloDao.findAllLikeCountJerarquia(filterRespuestasProtocolo,
				tableRequestDto);
		return new TableResponseDto<JerarquiaDto<RespuestasProtocolo>>(tableRequestDto, recordNum,
				listaRespuestasProtocolo);
	}

	/**
	 * Finder method for siblings rows in the hierarchical the
	 * RespuestasProtocolo table.
	 *
	 * @param filterRespuestasProtocolo
	 *            RespuestasProtocolo
	 * @param tableRequestDto
	 *            TableRequestDto
	 * @return TableResponseDto<JerarquiaDto<RespuestasProtocolo>>
	 */
	public TableResponseDto<JerarquiaDto<RespuestasProtocolo>> jerarquiaChildren(
			RespuestasProtocolo filterRespuestasProtocolo, TableRequestDto tableRequestDto) {
		TableResponseDto<JerarquiaDto<RespuestasProtocolo>> tableResponseDto = new TableResponseDto<JerarquiaDto<RespuestasProtocolo>>();
		tableResponseDto.addAdditionalParam(TableResponseDto.CHILDREN,
				this.respuestasProtocoloDao.findAllChild(filterRespuestasProtocolo, tableRequestDto));
		return tableResponseDto;
	}

	/**
	 * Exporta Datos al clipBoard
	 *
	 */
	public List<RespuestasProtocolo> getMultiple(RespuestasProtocolo filterRespuestasProtocolo,
			TableRequestDto tableRequestDto, Boolean startsWith) {
		return this.respuestasProtocoloDao.getMultiple(filterRespuestasProtocolo, tableRequestDto, startsWith);
	}

	/**
	 * Método que convierte las respuestas antes de guardarlas en BBDD
	 * 
	 */
	@Override
	public List<PreguntasRespuestasProtocolo> parseEnvioRespuestasProtocolo(
			List<PreguntasRespuestasProtocolo> preguntasRespuestasProtocolo) {
		for (PreguntasRespuestasProtocolo preguntaRespuesta : preguntasRespuestasProtocolo) {

			if (preguntaRespuesta.getRespuestasProtocolo() != null
					&& preguntaRespuesta.getRespuestasProtocolo().getRespuesta() != null) {

				switch (preguntaRespuesta.getPreguntasProtocolo().getIdTipoPregunta()) {
				case Constantes.TIPO_PREGUNTA_SINO:

					if (Constantes.SINO_SI_NUMERO.equals(preguntaRespuesta.getRespuestasProtocolo().getRespuesta())) {

						if (LocaleContextHolder.getLocale().toString().equals(Constantes.CASTELLANO)) {
							preguntaRespuesta.getRespuestasProtocolo().setRespuesta(Constantes.SINO_SI_CASTELLANO);
						} else if (LocaleContextHolder.getLocale().toString().equals(Constantes.EUSKERA)) {
							preguntaRespuesta.getRespuestasProtocolo().setRespuesta(Constantes.SINO_SI_EUSKERA);
						}

					} else if (Constantes.SINO_NO_NUMERO
							.equals(preguntaRespuesta.getRespuestasProtocolo().getRespuesta())) {

						if (LocaleContextHolder.getLocale().toString().equals(Constantes.CASTELLANO)) {
							preguntaRespuesta.getRespuestasProtocolo().setRespuesta(Constantes.SINO_NO_CASTELLANO);
						} else if (LocaleContextHolder.getLocale().toString().equals(Constantes.EUSKERA)) {
							preguntaRespuesta.getRespuestasProtocolo().setRespuesta(Constantes.SINO_NO_EUSKERA);
						}

					} else if (Constantes.SINO_NP_NUMERO
							.equals(preguntaRespuesta.getRespuestasProtocolo().getRespuesta())) {
						preguntaRespuesta.getRespuestasProtocolo().setRespuesta(Constantes.SINO_NP);
					}

					break;

				case Constantes.TIPO_PREGUNTA_CORRECTO_INCORRECTO:

					if (Constantes.CORRECTO_NUMERO.equals(preguntaRespuesta.getRespuestasProtocolo().getRespuesta())) {

						if (LocaleContextHolder.getLocale().toString().equals(Constantes.CASTELLANO)) {
							preguntaRespuesta.getRespuestasProtocolo().setRespuesta(Constantes.CORRECTO_CASTELLANO);
						} else if (LocaleContextHolder.getLocale().toString().equals(Constantes.EUSKERA)) {
							preguntaRespuesta.getRespuestasProtocolo().setRespuesta(Constantes.CORRECTO_EUSKERA);
						}

					} else if (Constantes.INCORRECTO_NUMERO
							.equals(preguntaRespuesta.getRespuestasProtocolo().getRespuesta())) {

						if (LocaleContextHolder.getLocale().toString().equals(Constantes.CASTELLANO)) {
							preguntaRespuesta.getRespuestasProtocolo().setRespuesta(Constantes.INCORRECTO_CASTELLANO);
						} else if (LocaleContextHolder.getLocale().toString().equals(Constantes.EUSKERA)) {
							preguntaRespuesta.getRespuestasProtocolo().setRespuesta(Constantes.INCORRECTO_EUSKERA);
						}

					} else if (Constantes.NA_NUMERO.equals(preguntaRespuesta.getRespuestasProtocolo().getRespuesta())) {
						preguntaRespuesta.getRespuestasProtocolo().setRespuesta(Constantes.NA);
					} else if (Constantes.NO_SELECCIONADO
							.equals(preguntaRespuesta.getRespuestasProtocolo().getRespuesta())) {
						preguntaRespuesta.getRespuestasProtocolo().setRespuesta(null);
					}

					break;
				}

			}

		}

		return preguntasRespuestasProtocolo;

	}

	/**
	 * Método para parsear las respuestas recibidas y pintarlas correctamente en
	 * la vista
	 * 
	 */
	@Override
	public List<PreguntasRespuestasProtocolo> parseRecogidaRespuestasProtocolo(
			List<PreguntasRespuestasProtocolo> preguntasRespuestasProtocolo) {
		for (PreguntasRespuestasProtocolo preguntaRespuesta : preguntasRespuestasProtocolo) {

			if (preguntaRespuesta.getRespuestasProtocolo() != null) {

				switch (preguntaRespuesta.getPreguntasProtocolo().getIdTipoPregunta()) {
				case Constantes.TIPO_PREGUNTA_SINO:

					if (Constantes.SINO_SI_CASTELLANO.equals(preguntaRespuesta.getRespuestasProtocolo().getRespuesta())
							|| Constantes.SINO_SI_EUSKERA
									.equals(preguntaRespuesta.getRespuestasProtocolo().getRespuesta())) {
						preguntaRespuesta.getRespuestasProtocolo().setRespuesta(Constantes.SINO_SI_NUMERO);
					} else if (Constantes.SINO_NO_CASTELLANO
							.equals(preguntaRespuesta.getRespuestasProtocolo().getRespuesta())
							|| Constantes.SINO_NO_EUSKERA
									.equals(preguntaRespuesta.getRespuestasProtocolo().getRespuesta())) {
						preguntaRespuesta.getRespuestasProtocolo().setRespuesta(Constantes.SINO_NO_NUMERO);
					} else if (Constantes.SINO_NP.equals(preguntaRespuesta.getRespuestasProtocolo().getRespuesta())) {
						preguntaRespuesta.getRespuestasProtocolo().setRespuesta(Constantes.SINO_NP_NUMERO);
					}

					break;

				case Constantes.TIPO_PREGUNTA_CORRECTO_INCORRECTO:

					if (Constantes.CORRECTO_CASTELLANO.equals(preguntaRespuesta.getRespuestasProtocolo().getRespuesta())
							|| Constantes.CORRECTO_EUSKERA
									.equals(preguntaRespuesta.getRespuestasProtocolo().getRespuesta())) {
						preguntaRespuesta.getRespuestasProtocolo().setRespuesta(Constantes.CORRECTO_NUMERO);
					} else if (Constantes.INCORRECTO_CASTELLANO
							.equals(preguntaRespuesta.getRespuestasProtocolo().getRespuesta())
							|| Constantes.INCORRECTO_EUSKERA
									.equals(preguntaRespuesta.getRespuestasProtocolo().getRespuesta())) {
						preguntaRespuesta.getRespuestasProtocolo().setRespuesta(Constantes.INCORRECTO_NUMERO);
					} else if (Constantes.NA.equals(preguntaRespuesta.getRespuestasProtocolo().getRespuesta())) {
						preguntaRespuesta.getRespuestasProtocolo().setRespuesta(Constantes.NA_NUMERO);
					}

					break;
				}

			}

		}

		return preguntasRespuestasProtocolo;
	}

	/**
	 * Método para parsear las respuestas que nos llegan de la hoja de Excel
	 * antes de guardarlas en BBDD
	 * 
	 */
	@Override
	public PreguntasRespuestasProtocolo parseRespuestasExcelProtocolo(PreguntasRespuestasProtocolo preguntaRespuesta) {

		switch (preguntaRespuesta.getPreguntasProtocolo().getIdTipoPregunta()) {

		case Constantes.TIPO_PREGUNTA_NUMERICO:
			if (!preguntaRespuesta.getRespuestasProtocolo().getRespuesta().matches("-?\\d+")
					&& !"".equals(preguntaRespuesta.getRespuestasProtocolo().getRespuesta())) {
				return null;
			}
			break;

		case Constantes.TIPO_PREGUNTA_FECHA:

			if (!preguntaRespuesta.getRespuestasProtocolo().getRespuesta()
					.matches("^(3[01]|[12][0-9]|0[1-9])/(1[0-2]|0[1-9])/[0-9]{4}$")
					&& !preguntaRespuesta.getRespuestasProtocolo().getRespuesta()
							.matches("^[0-9]{4}/(1[0-2]|0[1-9])/(3[01]|[12][0-9]|0[1-9])$")
					&& !"".equals(preguntaRespuesta.getRespuestasProtocolo().getRespuesta())) {
				return null;
			}
			break;

		case Constantes.TIPO_PREGUNTA_SINO:
			if (Constantes.SINO_SI_CASTELLANO
					.equalsIgnoreCase(preguntaRespuesta.getRespuestasProtocolo().getRespuesta())) {
				preguntaRespuesta.getRespuestasProtocolo().setRespuesta(Constantes.SINO_SI_CASTELLANO);
			} else if (Constantes.SINO_SI_EUSKERA
					.equalsIgnoreCase(preguntaRespuesta.getRespuestasProtocolo().getRespuesta())) {
				preguntaRespuesta.getRespuestasProtocolo().setRespuesta(Constantes.SINO_SI_EUSKERA);
			} else if (Constantes.SINO_NO_CASTELLANO
					.equalsIgnoreCase(preguntaRespuesta.getRespuestasProtocolo().getRespuesta())) {
				preguntaRespuesta.getRespuestasProtocolo().setRespuesta(Constantes.SINO_NO_CASTELLANO);
			} else if (Constantes.SINO_NO_EUSKERA
					.equalsIgnoreCase(preguntaRespuesta.getRespuestasProtocolo().getRespuesta())) {
				preguntaRespuesta.getRespuestasProtocolo().setRespuesta(Constantes.SINO_NO_EUSKERA);
			} else if (Constantes.SINO_NP.equalsIgnoreCase(preguntaRespuesta.getRespuestasProtocolo().getRespuesta())) {
				preguntaRespuesta.getRespuestasProtocolo().setRespuesta(Constantes.SINO_NP);
			} else if (!"".equals(preguntaRespuesta.getRespuestasProtocolo().getRespuesta())) {
				return null;
			}
			break;

		case Constantes.TIPO_PREGUNTA_CORRECTO_INCORRECTO:
			if (Constantes.CORRECTO_CASTELLANO
					.equalsIgnoreCase(preguntaRespuesta.getRespuestasProtocolo().getRespuesta())) {
				preguntaRespuesta.getRespuestasProtocolo().setRespuesta(Constantes.CORRECTO_CASTELLANO);
			} else if (Constantes.CORRECTO_EUSKERA
					.equalsIgnoreCase(preguntaRespuesta.getRespuestasProtocolo().getRespuesta())) {
				preguntaRespuesta.getRespuestasProtocolo().setRespuesta(Constantes.CORRECTO_EUSKERA);
			} else if (Constantes.INCORRECTO_CASTELLANO
					.equalsIgnoreCase(preguntaRespuesta.getRespuestasProtocolo().getRespuesta())) {
				preguntaRespuesta.getRespuestasProtocolo().setRespuesta(Constantes.INCORRECTO_CASTELLANO);
			} else if (Constantes.INCORRECTO_EUSKERA
					.equalsIgnoreCase(preguntaRespuesta.getRespuestasProtocolo().getRespuesta())) {
				preguntaRespuesta.getRespuestasProtocolo().setRespuesta(Constantes.INCORRECTO_EUSKERA);
			} else if (Constantes.NA.equalsIgnoreCase(preguntaRespuesta.getRespuestasProtocolo().getRespuesta())) {
				preguntaRespuesta.getRespuestasProtocolo().setRespuesta(Constantes.NA);
			} else if (!"".equals(preguntaRespuesta.getRespuestasProtocolo().getRespuesta())) {
				return null;
			}
			break;

		case Constantes.TIPO_PREGUNTA_CHECKBOX:

			if (!"".equals(preguntaRespuesta.getRespuestasProtocolo().getRespuesta())
					&& preguntaRespuesta.getPreguntasProtocolo().getOpcionesPrePro() != null) {

				String[] opciones = preguntaRespuesta.getRespuestasProtocolo().getRespuesta().trim().split(";");
				String respuestaOpciones = "";

				for (int i = 0; i < opciones.length; i++) {
					for (int j = 0; j < preguntaRespuesta.getPreguntasProtocolo().getOpcionesPrePro().size(); j++) {

						if (preguntaRespuesta.getPreguntasProtocolo().getOpcionesPrePro().get(j)
								.getDescripcionCastellano().equalsIgnoreCase(opciones[i].trim())) {
							respuestaOpciones += preguntaRespuesta.getPreguntasProtocolo().getOpcionesPrePro().get(j)
									.getIdOpcionPrePro() + ";";
							break;
						}
					}
				}
				String[] numeroOpcionesCorrectas = respuestaOpciones.split(";");
				if (!"".equals(respuestaOpciones) && numeroOpcionesCorrectas.length == opciones.length) {
					preguntaRespuesta.getRespuestasProtocolo().setRespuesta(respuestaOpciones);
				} else {
					return null;
				}
			}
			break;
		}

		return preguntaRespuesta;
	}

	/**
	 * Método que elimina las respuestas de protocolo en base al idInspeccion
	 * 
	 */
	@Override
	public void deleteByInspeccion(Integer idInspeccion) {
		this.respuestasProtocoloDao.deleteByInspeccion(idInspeccion);
	}

	@Override
	public RespuestasProtocolo findByIdRelProPreInspeccion(RespuestasProtocolo respuestasProtocolo) {
		return this.respuestasProtocoloDao.findByIdRelProPreInspeccion(respuestasProtocolo);
	}

	public RespuestasProtocolo findByInspeccionYPregunta(Inspecciones inspeccion,
			PreguntasProtocolo preguntaProtocolo) {
		return this.respuestasProtocoloDao.findByInspeccionYPregunta(inspeccion, preguntaProtocolo);
	}

	@Override
	@Transactional
	public void removeRespuestasFicherosByInspeccion(Inspecciones inspeccion) {

		List<RespuestasProtocolo> respuestasProtocolo = this.respuestasProtocoloDao.findByInspeccion(inspeccion);

		for (RespuestasProtocolo respuesta : respuestasProtocolo) {
			List<FicherosAdjPro> ficheros = this.ficherosAdjProService
					.findFicherosByIdRespuesta(respuesta.getIdRespuestaProtocolo());
			for (FicherosAdjPro fichero : ficheros) {
				try {
					// Eliminamos el fiuchero del PID
					this.ab61WebServiceAdaptadorService.eliminarDocumentoPid(fichero.getOidPid());
					RespuestasProtocoloServiceImpl.logger.info("Eliminado fichero del PID - " + fichero.getOidPid());

					// Eliminamos el fichero de BBDD
					this.ficherosAdjProService.remove(fichero);
					RespuestasProtocoloServiceImpl.logger
							.info("Eliminado fichero de BBDD - " + fichero.getIdFicherosAdjPro());

				} catch (Exception e) {
					RespuestasProtocoloServiceImpl.logger
							.error("Error al eliminar las respuestas de protocolo - " + e.getMessage(), e);
				}

			}
			// Eliminamos la respuesta
			this.respuestasProtocoloDao.remove(respuesta);
		}

	}

	@Override
	@Transactional
	public void removeRespuestaFicheros(PreguntasProtocolo preguntaProtocolo, Integer idRespuestaProtocolo) {

		RespuestasProtocolo respuesta = new RespuestasProtocolo(idRespuestaProtocolo);

		List<FicherosAdjPro> ficheros = this.ficherosAdjProService
				.findFicherosByIdRespuesta(respuesta.getIdRespuestaProtocolo());
		for (FicherosAdjPro fichero : ficheros) {
			try {
				// Eliminamos el fiuchero del PID
				this.ab61WebServiceAdaptadorService.eliminarDocumentoPid(fichero.getOidPid());
				RespuestasProtocoloServiceImpl.logger.info("Eliminado fichero del PID - " + fichero.getOidPid());

				// Eliminamos el fichero de BBDD
				this.ficherosAdjProService.remove(fichero);
				RespuestasProtocoloServiceImpl.logger
						.info("Eliminado fichero de BBDD - " + fichero.getIdFicherosAdjPro());

			} catch (Exception e) {
				RespuestasProtocoloServiceImpl.logger
						.error("Error al eliminar las respuestas de protocolo - " + e.getMessage(), e);
			}

		}
		// Eliminamos la respuesta
		this.respuestasProtocoloDao.remove(respuesta);
	}

	@Transactional(rollbackFor = Throwable.class)
	public RespuestasProtocolo update_respuesta(RespuestasProtocolo respuestasProtocolo) {
		return this.respuestasProtocoloDao.update_respuesta(respuestasProtocolo);
	}

}
