package com.ejie.m62fb.control.registroVPP;

import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.List;

import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.io.FilenameUtils;
import org.apache.poi.util.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
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.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.ejie.m62fb.model.AcuerdoVivienda;
import com.ejie.m62fb.model.SolicitudReserva;
import com.ejie.m62fb.model.documento.DocumentoAcuerdoReserva;
import com.ejie.m62fb.service.registroVPP.AcuerdoViviendaService;
import com.ejie.m62fb.service.registroVPP.DocumentoAcuerdoReservaService;
import com.ejie.m62fb.service.registroVPP.ViviendaReservadaService;
import com.ejie.m62fb.utils.constants.AppConstantes;
import com.ejie.m62fb.utils.constants.IberErrorsMsgConstants;
import com.ejie.m62fb.utils.documentos.DocumentosUtil;
import com.ejie.m62fb.utils.error.UFException;
import com.ejie.m62fb.utils.properties.AppPropertiesUtils;
import com.ejie.m62fb.utils.properties.AppResourcesUtil;
import com.ejie.m62fb.utils.sql.Utilidades;

/**
 * AcuerdoViviendaController.
 * 
XXXX
 */
@Controller
@RequestMapping(value = "/acuerdoVivienda")
public class AcuerdoViviendaController {

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

	@Autowired
	private AcuerdoViviendaService acuerdoViviendaService;

	@Autowired
	private ViviendaReservadaService viviendaReservadaService;
	@Autowired
	private DocumentoAcuerdoReservaService documentoAcuerdoReservaService;

	/**
	 * Operacion CRUD Create. Creacion de un nuevo registro a partir del bean
	 * indicado.
	 * 
	 * @param acuerdoVivienda
	 *            AcuerdoVivienda Bean que contiene la informacion con la que se
	 *            va a crear el nuevo registro.
	 * @return AcuerdoVivienda Bean resultante del proceso de creacion.
	 */
	@RequestMapping(method = RequestMethod.POST)
	public @ResponseBody
	AcuerdoVivienda add(@RequestBody AcuerdoVivienda acuerdoVivienda) {
		AcuerdoVivienda acuerdoVivAux = this.acuerdoViviendaService
				.guardar(acuerdoVivienda);
		AcuerdoViviendaController.logger
				.info("[POST] : Vivienda insertada correctamente");
		return acuerdoVivAux;
	}

	/**
	 * Comprueba si existe un acuerdo para la solicitud
	 * 
	 * @param idM62r38t0
	 *            Integer
	 * @return boolean
	 */
	@RequestMapping(value = "/existeAcuerdo", method = RequestMethod.GET)
	public @ResponseBody
	boolean existeAcuerdo(
			@RequestParam(value = "idM62r38t0", required = false) Integer idM62r38t0) {
		AcuerdoVivienda acuerdoVivFilter = new AcuerdoVivienda();
		acuerdoVivFilter.setSolicitudReserva(new SolicitudReserva(idM62r38t0));
		Long countAcuerdo = this.acuerdoViviendaService
				.findAllCount(acuerdoVivFilter);
		AcuerdoViviendaController.logger
				.info("[GET] : Comprobando si existe un acuerdo para la solicitud idM62r38t0:" + idM62r38t0);
		return countAcuerdo > 0;
	}
	/**
	 * Comprueba si existen viviendas solicitadas sin viviendas reservadas
	 * 
	 * @param idM62r38t0
	 *            BigDecimal
	 * @return boolean
	 */
	@RequestMapping(value = "/hayVivSolicitadasSinVivReservadas", method = RequestMethod.GET)
	public @ResponseBody
	boolean hayVivSolicitadasSinVivReservadas(
			@RequestParam(value = "idM62r38t0", required = false) BigDecimal idM62r38t0) {
		AcuerdoViviendaController.logger
				.info("[GET] : Comprobando si existen viviendas solicitadas sin viviendas reservadas para la solicitud idM62r38t0:" + idM62r38t0);
		return this.acuerdoViviendaService.hayVivSolicitadasSinVivReservadas(idM62r38t0);
	}
	/**
	 * 
	 * @param idM62r38t0
	 *            Integer
	 * @param isInline
	 *            boolean
	 * @param modelMap
	 *            ModelMap
	 * @param session
	 *            HttpSession
	 * @return ModelAndView
	 */
	@RequestMapping(value = "/generarPDF")
	public ModelAndView generarPDF(
			@RequestParam(value = "idSolicitud", required = true) Integer idM62r38t0,
			@RequestParam(value = "isInline", required = false) boolean isInline,
			ModelMap modelMap, HttpSession session) {

		// Recopilar e informar los datos del Report
		List<AcuerdoVivienda> datosReport = this.acuerdoViviendaService
				.fillReportData(idM62r38t0, modelMap);

		// Nombre fichero
		modelMap.put("fileName", "Resolucion");
		// En línea (no descarga fichero)
		modelMap.put("isInline", isInline);

		// Titulo y cabeceras (parameter)
		modelMap.put("M62FB_FIRMA", AppResourcesUtil.getProps()
				.getPropertiesEntry(AppPropertiesUtils.REPORTS_FIRMA));
		modelMap.put("M62FB_PATH_IMG", AppResourcesUtil.getProps()
				.getPropertiesEntry(AppPropertiesUtils.REPORTS_IMAGES));
		modelMap.put("M62FB_DIRECCION_ES", AppResourcesUtil.getProps()
				.getPropertiesEntry(AppPropertiesUtils.REPORTS_DIREC_ES));
		modelMap.put("M62FB_DIRECCION_EU", AppResourcesUtil.getProps()
				.getPropertiesEntry(AppPropertiesUtils.REPORTS_DIREC_EU));

		AcuerdoVivienda acuerdoAux = datosReport.get(0);
		// "En Vitoria-Gasteiz, a 15 de enero de 2016");
		modelMap.put("M62FB_FECHA_ES", Utilidades.formatFechaReport(
				acuerdoAux.getFecAcuerdo(), AppConstantes.ES_LOCALE));
		// "Vitoria-Gasteiz, 2016ko urtarrilaren 15(e)an");
		modelMap.put("M62FB_FECHA_EU",Utilidades.formatFechaReport(acuerdoAux.getFecAcuerdo(), AppConstantes.EU_LOCALE));

		// Informamos los datos para el DocumentoAcuerdoReserva de BBDD
		DocumentoAcuerdoReserva documentoAcuerdoReserva = new DocumentoAcuerdoReserva();
		documentoAcuerdoReserva.setNomDocumento("Resolucion.pdf");
		documentoAcuerdoReserva.setIdAcuerdoReserva(acuerdoAux.getIdM62r41t0());
		// Guardamos en session los parametros para guardar el PDF en BBDD
		session.setAttribute("documentoAcuerdoReserva", documentoAcuerdoReserva);
		session.setAttribute("documentoAcuerdoReservaService",
				this.documentoAcuerdoReservaService);

		// Generación del PDF
		ModelAndView modelAndView = new ModelAndView("pdfAcuerdoReserva",
				modelMap);
		return modelAndView;
	}

	/**
	 * 
	 * @param idM62r38t0
	 *            Integer
	 * @param response
	 *            HttpServletResponse
	 */
	@RequestMapping(value = "/getDocumento", method = RequestMethod.GET)
	public void getById(
			@RequestParam(value = "idSolicitud", required = true) Integer idM62r38t0,
			HttpServletResponse response) {
		try {
			// Conseguir el Acuerdo de la Solicitud
			AcuerdoVivienda acuerdo = this.acuerdoViviendaService
					.findBySolicitud(new SolicitudReserva(idM62r38t0));

			// Recuperar el DocumentoAcuerdoReserva
			DocumentoAcuerdoReserva documento = this.documentoAcuerdoReservaService
					.findByAcuerdo(acuerdo);
			AcuerdoViviendaController.logger
					.info("[GET - findBy_PK] : Obtener DOCUMENTO por Acuerdo");

			// Get your file as InputStream
			if (documento != null) {
				InputStream is = documento.getContenido().getBinaryStream();
				response.setContentType(DocumentosUtil
						.getContentType(FilenameUtils.getExtension(documento
								.getNomDocumento())));
				response.setHeader("Content-disposition",
						"attachment; fileName=\"" + documento.getNomDocumento()
								+ "\"");
				IOUtils.copy(is, response.getOutputStream());
				response.flushBuffer();
			}
		} catch (IOException ex) {
			AcuerdoViviendaController.logger.info(
					IberErrorsMsgConstants.DOCUMENTO_ERROR_LECTURA, ex);
			throw new UFException(
					IberErrorsMsgConstants.DOCUMENTO_ERROR_LECTURA);
		} catch (SQLException e) {
			AcuerdoViviendaController.logger.error(e.getMessage());
			throw new UFException(e.getMessage());
		}
	}
}