package com.ejie.ab79.control;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

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.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.comun.Constantes;
import com.ejie.ab79.model.preguntasRespuestas.OpcionesPrePro;
import com.ejie.ab79.model.preguntasRespuestas.PreguntasProtocolo;
import com.ejie.ab79.model.preguntasRespuestas.RelProPre;
import com.ejie.ab79.service.preguntasRespuestas.OpcionesPreProService;
import com.ejie.ab79.service.preguntasRespuestas.PreguntasProtocoloService;
import com.ejie.x38.control.bind.annotation.RequestJsonBody;
import com.ejie.x38.dto.TableRequestDto;
import com.ejie.x38.dto.TableResponseDto;

/**
 * PreguntasProtocoloController  
 * 
 *  
 */
@SessionAttributes("usuario")
@Controller
@RequestMapping(value = "/preguntasprotocolo")

public class PreguntasProtocoloController {

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

	@Autowired
	private PreguntasProtocoloService preguntasProtocoloService;

	@Autowired
	private OpcionesPreProService opcionesPreProService;

	/**
	 * Operacion CRUD Read. Devuelve el bean correspondiente al identificador
	 * indicado.
	 * 
	 * @param idPreguntaProtocolo
	 *            Integer
	 * @return PreguntasProtocolo Objeto correspondiente al identificador
	 *         indicado.
	 */
	@RequestMapping(value = "/{idPreguntaProtocolo}", method = RequestMethod.GET)
	public @ResponseBody PreguntasProtocolo get(@PathVariable Integer idPreguntaProtocolo) {

		PreguntasProtocolo preguntaProtocolo = new PreguntasProtocolo();
		preguntaProtocolo.setIdPreguntaProtocolo(idPreguntaProtocolo);
		preguntaProtocolo = this.preguntasProtocoloService.find(preguntaProtocolo);
		List<OpcionesPrePro> opciones = this.preguntasProtocoloService.findOpcionesPrePro();
		String opcionesEs = "";
		String opcionesEu = "";
		List<OpcionesPrePro> opcionesPregunta = new ArrayList<OpcionesPrePro>();

		if (preguntaProtocolo.getIdTipoPregunta() == Constantes.TIPO_PREGUNTA_CHECKBOX) {
			for (OpcionesPrePro opcion : opciones) {
				if (preguntaProtocolo.getIdPreguntaProtocolo().equals(opcion.getIdPreguntaProtocolo())) {
					opcionesEs += opcion.getDescripcionCastellano() + "; ";
					opcionesEu += opcion.getDescripcionEuskera() + "; ";
					opcionesPregunta.add(opcion);
				}
			}

			preguntaProtocolo.setOpcionesPrePro(opcionesPregunta);

			if (opcionesEs.length() > 0 && opcionesEu.length() > 0) {
				opcionesEs = opcionesEs.substring(0, opcionesEs.length() - 2);
				opcionesEu = opcionesEu.substring(0, opcionesEu.length() - 2);
				preguntaProtocolo.setOpcionesEs(opcionesEs);
				preguntaProtocolo.setOpcionesEu(opcionesEu);
			}
		}

		PreguntasProtocoloController.logger.info("[GET - findBy_PK] : Obtener PreguntasProtocolo por PK");

		return preguntaProtocolo;
	}

	@RequestMapping(value = "/existeEnOtroProtocolo/{idProtocolo}/{idPreguntaProtocolo}", method = RequestMethod.GET)
	public @ResponseBody boolean existeEnOtroProtocolo(@PathVariable Integer idProtocolo,
			@PathVariable Integer idPreguntaProtocolo) {
		PreguntasProtocoloController.logger.info("[GET] : Comprobar si existe la pregunta en otro informe técnico ");

		boolean existe;
		existe = this.preguntasProtocoloService.findPreguntasEnOtroProtocolo(idProtocolo, idPreguntaProtocolo);

		PreguntasProtocoloController.logger.info("[GET] : existeEnOtroInfromeTecnico - " + existe);

		return existe;
	}

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

	@RequestMapping(value = "/getPreguntasRelProPre/{idProtocolo}", method = RequestMethod.GET)
	public @ResponseBody List<PreguntasProtocolo> getPreguntasRelProPre(@PathVariable Integer idProtocolo) {
		PreguntasProtocoloController.logger.info("[GET - getPreguntasRelProPre] : Obtener Preguntas RelProPre");

		PreguntasProtocolo preguntaProtocolo = new PreguntasProtocolo();
		preguntaProtocolo.setIdProtocolo(idProtocolo);

		return this.preguntasProtocoloService.getPreguntasRelProPre(preguntaProtocolo, Constantes.NO_VALIDAR);
	}

	/**
	 * Añade una pregunta a AB7911T00 y a a la relación AB7919T00
	 * 
	 * @param preguntaProtocolo
	 * @param usuario
	 * @return
	 */
	@RequestMapping(value = "/addPreguntaRelacion", method = RequestMethod.POST)
	public @ResponseBody PreguntasProtocolo addPreguntaRelacion(@RequestBody PreguntasProtocolo preguntaProtocolo,
			@ModelAttribute("usuario") Usuario usuario) {

		Date fechaHoy = new Date();

		PreguntasProtocolo preguntaProtocoloAux = new PreguntasProtocolo();
		preguntaProtocolo.setFechaRegistro(fechaHoy);
		preguntaProtocolo.setUsuarioRegistro(usuario.getUsuario());

		RelProPre relProPre = new RelProPre();
		relProPre.setIdProtocolo(preguntaProtocolo.getIdProtocolo());
		relProPre.setFechaRegistro(fechaHoy);
		relProPre.setUsuarioRegistro(usuario.getUsuario());

		preguntaProtocoloAux = this.preguntasProtocoloService.addPreguntaRelacion(preguntaProtocolo, relProPre);

		PreguntasProtocoloController.logger.info("[POST] : Pregunta para tipo informe técnico insertada correctamente");

		return preguntaProtocoloAux;
	}

	/**
	 * Modifica una pregunta en AB7911T00 si no existe en otro informe técnico o
	 * si el usuario acepta, si no crea una pregunta en AB7911T00 y la añade a
	 * la relación AB7919T00
	 * 
	 * @param preguntaProtocolo
	 * @param usuario
	 * @return
	 */
	@RequestMapping(value = "/editPreguntaRelacion", method = RequestMethod.PUT)
	public @ResponseBody PreguntasProtocolo editPreguntaRelacion(@RequestBody PreguntasProtocolo preguntaProtocolo,
			@ModelAttribute("usuario") Usuario usuario) {

		Date fechaHoy = new Date();

		PreguntasProtocolo preguntaProtocoloAux = new PreguntasProtocolo();
		preguntaProtocolo.setFechaRegistro(fechaHoy);
		preguntaProtocolo.setFechaUltmodificacion(fechaHoy);
		preguntaProtocolo.setUsuarioRegistro(usuario.getUsuario());
		preguntaProtocolo.setUsuarioUltmodificacion(usuario.getUsuario());

		preguntaProtocoloAux = this.preguntasProtocoloService.updatePreguntaOpciones(preguntaProtocolo);

		PreguntasProtocoloController.logger.info("[PUT] : Pregunta para tipo informe técnico editada correctamente");

		return preguntaProtocoloAux;
	}

	/**
	 * Borra un registro de la tabla que relaciona las preguntas con los
	 * informes técnicos AB7919T00
	 * 
	 * @param idRelProPre
	 * @return
	 */
	@RequestMapping(value = "borrarPreguntaRelProPre/{idRelProPre}", method = RequestMethod.DELETE)
	@ResponseStatus(value = HttpStatus.OK)
	public @ResponseBody RelProPre borrarPreguntaRelProPre(@PathVariable Integer idRelProPre) {
		RelProPre relProPre = new RelProPre();
		relProPre.setIdRelProPre(idRelProPre);
		this.preguntasProtocoloService.borrarPreguntaRelProPre(relProPre);
		PreguntasProtocoloController.logger
				.info("[borrarPreguntaRelProPre] : Pregunta RelProPre borrada correctamente");
		return relProPre;
	}

	/**
	 * Añade una pregunta que ya existe en AB7911T00 a la relación AB7919T00
	 * 
	 * @param preguntaProtocolo
	 * @param usuario
	 * @return
	 */
	@RequestMapping(value = "/agregarPreguntaARelacion", method = RequestMethod.POST)
	public @ResponseBody RelProPre agregarPreguntaARelacion(@RequestBody PreguntasProtocolo preguntaProtocolo,
			@ModelAttribute("usuario") Usuario usuario) {

		Date fechaHoy = new Date();

		RelProPre relProPre = new RelProPre();
		relProPre.setIdPreguntaProtocolo(preguntaProtocolo.getIdPreguntaProtocolo());
		relProPre.setIdProtocolo(preguntaProtocolo.getIdProtocolo());
		relProPre.setFechaRegistro(fechaHoy);
		relProPre.setUsuarioRegistro(usuario.getUsuario());

		relProPre = this.preguntasProtocoloService.insertRelProPre(relProPre);

		PreguntasProtocoloController.logger.info("[POST] : Pregunta para tipo informe técnico insertada correctamente");

		return relProPre;
	}

	/**
	 * Método que actualiza el orden de las preguntas del informe técnico en
	 * AB7919T00
	 * 
	 * @param preguntaProtocolo
	 * @param usuario
	 * @return
	 */
	@RequestMapping(value = "/asignarPadre", method = RequestMethod.PUT)
	public @ResponseBody PreguntasProtocolo asignarPadre(@RequestBody PreguntasProtocolo preguntaProtocolo,
			@ModelAttribute("usuario") Usuario usuario) {

		Date fechaHoy = new Date();

		RelProPre relProPre = new RelProPre();
		relProPre.setIdRelProPre(preguntaProtocolo.getIdRelProPre());
		relProPre.setOrden(preguntaProtocolo.getOrden());
		relProPre.setIdPreguntaProtocoloPadre(preguntaProtocolo.getIdPreguntaProtocolo());
		relProPre.setFechaUltmodificacion(fechaHoy);
		relProPre.setUsuarioUltmodificacion(usuario.getUsuario());

		this.preguntasProtocoloService.updateRelProPre(relProPre);

		PreguntasProtocoloController.logger
				.info("[PUT] : Preguntas para tipo informe técnico reordenadas correctamente");

		return preguntaProtocolo;
	}

	/**
	 * Método que actualiza el orden de las preguntas del informe técnico en
	 * AB7919T00
	 * 
	 * @param preguntaProtocolo
	 * @param usuario
	 * @return
	 */
	@RequestMapping(value = "/reordenar", method = RequestMethod.PUT)
	public @ResponseBody List<PreguntasProtocolo> reordenar(@RequestBody List<PreguntasProtocolo> preguntasProtocolo,
			@ModelAttribute("usuario") Usuario usuario) {

		Date fechaHoy = new Date();

		for (PreguntasProtocolo preguntaProtocolo : preguntasProtocolo) {

			RelProPre relProPre = new RelProPre();
			relProPre.setIdRelProPre(preguntaProtocolo.getIdRelProPre());
			relProPre.setOrden(preguntaProtocolo.getOrden());
			relProPre.setIdPreguntaProtocoloPadre(preguntaProtocolo.getIdPreguntaPadre());
			relProPre.setFechaUltmodificacion(fechaHoy);
			relProPre.setUsuarioUltmodificacion(usuario.getUsuario());

			this.preguntasProtocoloService.updateRelProPre(relProPre);
		}

		PreguntasProtocoloController.logger
				.info("[PUT] : Preguntas para tipo informe técnico reordenadas correctamente");

		return preguntasProtocolo;
	}

	/**
	 * Borra uno o varios registro de la tabla que relaciona las preguntas con
	 * los informes técnicos AB7919T00 y también de la tabla de preguntas
	 * AB7911T00
	 * 
	 * @param idRelProPre
	 * @return
	 */
	@RequestMapping(value = "borrarPreguntas/{idPreguntaProtocolo}", method = RequestMethod.DELETE)
	@ResponseStatus(value = HttpStatus.OK)
	public @ResponseBody RelProPre borrarPreguntas(@PathVariable Integer idPreguntaProtocolo) {
		RelProPre relProPre = new RelProPre();
		relProPre.setIdPreguntaProtocolo(idPreguntaProtocolo);
		this.preguntasProtocoloService.borrarRelProPreByPregunta(relProPre);
		PreguntasProtocoloController.logger
				.info("[borrarRelProPreByPregunta] : Preguntas tabla rel_pro_pre borradas correctamente");

		PreguntasProtocolo preguntaProtocolo = new PreguntasProtocolo();
		preguntaProtocolo.setIdPreguntaProtocolo(idPreguntaProtocolo);
		this.opcionesPreProService.removeByPregunta(preguntaProtocolo);
		this.preguntasProtocoloService.remove(preguntaProtocolo);
		PreguntasProtocoloController.logger
				.info("[remove] : Preguntas tabla preguntas_protocolo borradas correctamente");

		return relProPre;
	}

}
