package com.ejie.ab79.control;

import java.util.Date;
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.comun.Constantes;
import com.ejie.ab79.model.preguntasRespuestas.PreguntasProtocolo;
import com.ejie.ab79.model.preguntasRespuestas.RelProPre;
import com.ejie.ab79.service.preguntasRespuestas.PreguntasProtocoloService;
import com.ejie.x38.dto.TableRequestDto;

/**
 * InformeTecnicoController  
 * 
 *  
 */
@SessionAttributes("usuario")
@Controller
@RequestMapping(value = "/preguntasValidar")

public class PreguntasValidarController {

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

	@Autowired
	private PreguntasProtocoloService preguntasProtocoloService;

	/**
	 * Método de presentacion del mantenimiento de las preguntas a validar
	 * 
	 * @param model
	 *            Model
	 * @return String
	 */
	@RequestMapping(value = "/maint", method = RequestMethod.GET)
	public String getFormEdit(Model model) {
		PreguntasValidarController.logger.info("[GET - View] : preguntasValidar");
		return "preguntasValidar";
	}

	/**
	 * Método para añadir preguntas de validación
	 * 
	 * @param preguntaValidar
	 * @param usuario
	 * @return
	 */
	@RequestMapping(method = RequestMethod.POST)
	public @ResponseBody PreguntasProtocolo add(@RequestBody PreguntasProtocolo preguntaValidar,
			@ModelAttribute("usuario") Usuario usuario) {

		Date fechaHoy = new Date();
		preguntaValidar.setFechaRegistro(fechaHoy);
		preguntaValidar.setUsuarioRegistro(usuario.getUsuario());
		preguntaValidar.setPreguntaValidar(Constantes.VALIDAR);

		PreguntasProtocolo preguntaValidarAux = this.preguntasProtocoloService.add(preguntaValidar);
		PreguntasValidarController.logger.info("[POST] : PreguntaValidar insertada correctamente");
		return preguntaValidarAux;
	}

	/**
	 * Método para editar preguntas de validación
	 * 
	 * @param preguntaValidar
	 * @param usuario
	 * @return
	 */
	@RequestMapping(method = RequestMethod.PUT)
	public @ResponseBody PreguntasProtocolo edit(@RequestBody PreguntasProtocolo preguntaValidar,
			@ModelAttribute("usuario") Usuario usuario) {

		Date fechaHoy = new Date();
		preguntaValidar.setFechaUltmodificacion(fechaHoy);
		preguntaValidar.setUsuarioUltmodificacion(usuario.getUsuario());
		preguntaValidar.setPreguntaValidar(Constantes.VALIDAR);

		PreguntasProtocolo preguntaValidarAux = this.preguntasProtocoloService.update(preguntaValidar);
		PreguntasValidarController.logger.info("[POST] : PreguntaValidar editada correctamente");
		return preguntaValidarAux;
	}

	/**
	 * 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 = "/{idPreguntaProtocolo}", method = RequestMethod.DELETE)
	@ResponseStatus(value = HttpStatus.OK)
	public @ResponseBody PreguntasProtocolo borrarPreguntas(
			@PathVariable("idPreguntaProtocolo") Integer idPreguntaValidar) {
		RelProPre relProPre = new RelProPre();
		relProPre.setIdPreguntaProtocolo(idPreguntaValidar);
		this.preguntasProtocoloService.borrarRelProPreByPregunta(relProPre);
		PreguntasValidarController.logger
				.info("[borrarRelProPreByPregunta] : Preguntas tabla rel_pro_pre borradas correctamente");

		PreguntasProtocolo preguntaValidar = new PreguntasProtocolo();
		preguntaValidar.setIdPreguntaProtocolo(idPreguntaValidar);
		this.preguntasProtocoloService.remove(preguntaValidar);
		PreguntasValidarController.logger.info("[remove] : Pregunta validar borrada correctamente");

		return preguntaValidar;
	}

	/**
	 * Comprueba que la pregunta no exista en otro protocolo
	 * 
	 * @param idPreguntaProtocolo
	 * @return boolean
	 */
	@RequestMapping(value = "/existeEnOtroProtocolo/{idPreguntaProtocolo}", method = RequestMethod.GET)
	@ResponseStatus(value = HttpStatus.OK)
	public @ResponseBody boolean existeEnOtroProtocolo(@PathVariable("idPreguntaProtocolo") Integer idPreguntaValidar) {

		PreguntasProtocolo preguntaValidar = new PreguntasProtocolo();
		preguntaValidar.setIdPreguntaProtocolo(idPreguntaValidar);
		PreguntasValidarController.logger.info("[GET] : Comprobar si existe la pregunta en otro informe técnico.");

		boolean existe = this.preguntasProtocoloService.findValidarEnOtroProtocolo(preguntaValidar);
		PreguntasValidarController.logger.info("[GET] : existeEnOtroInfromeTecnico - " + existe);

		return existe;
	}

	/**
	 * Comprueba que el dato establecimiento no exista en BBDD
	 * 
	 * @param identEstablecimiento
	 * @return boolen
	 */
	@RequestMapping(value = "/identDatoEstablecimientoRepetido/{identDatoEstablecimiento:.+}", method = RequestMethod.GET)
	@ResponseStatus(value = HttpStatus.OK)
	public @ResponseBody boolean identDatoEstablecimientoRepetido(
			@PathVariable("identDatoEstablecimiento") String identDatoEstablecimiento) {

		PreguntasProtocolo preguntaValidar = new PreguntasProtocolo();
		preguntaValidar.setIdentDatoEstablecimiento(identDatoEstablecimiento);
		PreguntasValidarController.logger.info("[GET] : Comprobar que el dato establecimiento no exista en BBDD.");

		boolean repetido = this.preguntasProtocoloService.findIdentDatoEstablecimientoRepetido(preguntaValidar);
		PreguntasValidarController.logger.info("[GET] : identDatoEstablecimientoRepetido - " + repetido);

		return repetido;

	}

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

		try {
			List<PreguntasProtocolo> listaPreguntasValidar;

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

			if (filterPreguntasValidar.getTipoPregunta() != null) {
				if (filterPreguntasValidar.getTipoPregunta().equals("")) {
					filterPreguntasValidar.setTipoPregunta(null);
				}
			}
			if (filterPreguntasValidar.getPreguntaValidar() != null) {
				if (filterPreguntasValidar.getPreguntaValidar().equals("")) {
					filterPreguntasValidar.setPreguntaValidar(null);
				}
			}
			if (filterPreguntasValidar.getIdentDatoEstablecimiento() != null) {
				if (filterPreguntasValidar.getIdentDatoEstablecimiento().equals("")) {
					filterPreguntasValidar.setIdentDatoEstablecimiento(null);
				}
			}

			listaPreguntasValidar = this.preguntasProtocoloService.findAllLike(filterPreguntasValidar, tableRequestDto,
					false);

			this.preguntasProtocoloService.getExcelPreguntasValidar(listaPreguntasValidar, response);

		} catch (

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