package com.ejie.m62fb.control.registroVPP;


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

import javax.servlet.http.HttpServletRequest;
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.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
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.bind.annotation.ResponseStatus;
import org.springframework.web.multipart.MultipartFile;

import com.ejie.m62fb.model.documento.Documento;
import com.ejie.m62fb.model.documento.DocumentoRegVPP;
import com.ejie.m62fb.service.registroVPP.DocumentosService;
import com.ejie.m62fb.utils.constants.IberErrorsMsgConstants;
import com.ejie.m62fb.utils.documentos.DocumentosUtil;
import com.ejie.m62fb.utils.error.UFException;
import com.ejie.x38.control.bind.annotation.RequestJsonBody;
import com.ejie.x38.dto.JQGridRequestDto;
import com.ejie.x38.dto.JQGridResponseDto;

/**
 * DocumentosController
XXXX
 */
 
@Controller
@RequestMapping(value = "/documentos")
public class DocumentosController  {

	private static final Logger logger = LoggerFactory.getLogger(DocumentosController.class);
	@Autowired
	private DocumentosService documentosService;


	/**
	 * 
	 * @param response HttpServletResponse
	 * @param idElemRelac BigDecimal
	 * @param fuente int
	 * @param file MultipartFile
	 * @return Resultado
	 * @throws Exception excepci&oacute;n
	 */
     @RequestMapping( method = RequestMethod.POST)
     public @ResponseBody
     String  adjuntar(
                 HttpServletResponse response,
                 @RequestParam(value = "idElemRelac", required = false) BigDecimal idElemRelac,
                 @RequestParam(value = "fuente", required = false) int fuente,
                 @RequestParam(value = "numExpediente", required = false) String numExpediente,
                 @RequestParam(value = "file", required = false) MultipartFile file) throws Exception {
    	 try {
    		 if (numExpediente!= null && numExpediente.length()>=18){
    			 numExpediente=numExpediente.substring(0,18);
    		 }
    		 
    		 DocumentosController.logger.error("NUMEXPEDIENTE-->"+numExpediente);
           if (file == null || file.getSize() == 0) {
        	   throw new UFException(IberErrorsMsgConstants.DOCUMENTO_VACIO);
                 // throw new Exception();
           }else{
        	   DocumentoRegVPP documentoRegVPP= new DocumentoRegVPP();
        	   documentoRegVPP.setFuente(fuente);
        	   documentoRegVPP.setIdElemRelac(idElemRelac);
        	   documentoRegVPP.setDocumento(DocumentosUtil.generateM62Documento(file,numExpediente));
        	   documentosService.add(documentoRegVPP);
           }

          
           }   catch (UFException e) {
        	   DocumentosController.logger.error(e.getMessage());
			throw e;
		} catch (Exception e) {
			DocumentosController.logger.error(e.getMessage());
			throw new UFException(e.getMessage());
		}
		return "ok";
     }

	/**
	 * 
	 * @param numDocumento
	 * @param response
	 */
	@RequestMapping(value = "/{numDocumento}", method = RequestMethod.GET)
	public void getById(@PathVariable BigDecimal numDocumento,
		    HttpServletResponse response) {
	    try {
	      // get your file as InputStream
	      InputStream is = null;
	      Documento documento = new Documento();
			documento.setNumDocumento(numDocumento);
			documento = this.documentosService.find(documento);
			DocumentosController.logger
					.info("[GET - findBy_PK] : Obtener DOCUMENTO por PK");
	        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) {
	    	DocumentosController.logger.info(IberErrorsMsgConstants.DOCUMENTO_ERROR_LECTURA, ex);
	    	throw new UFException(IberErrorsMsgConstants.DOCUMENTO_ERROR_LECTURA);
	    } catch (SQLException e) {
	    	DocumentosController.logger.error(e.getMessage());
	    	throw new UFException(e.getMessage());
		}
	}
	 /**
	 * Metodo de presentacion del RUP_TABLE.
	 * 
	 * @param model Model
	 * @return String
	 */
	@RequestMapping(value = "/maint", method = RequestMethod.GET)
	public String getFormEdit(Model model) {
		DocumentosController.logger.info("[GET - View] : documentos");
		return "documentos";
	}
	 /**
	 * Operacion de filtrado del componente RUP_TABLE.
	 * 
	 * @param filterDocumento DocumentoRegVPP
	 *            Bean que contiene los parametros de filtrado a emplear.
	 * @param jqGridRequestDto
	 *            Dto que contiene los parametros de configuracion propios del
	 *            RUP_TABLE a aplicar en el filtrado.
	 * @param request
	 *           HttpServletRequest
	 * @param session
	 *           HttpSession
	 * @return JQGridResponseDto<Documento>
	 *            Dto que contiene el resultado del filtrado realizado por el 
	 *            componente RUP_TABLE.
	 */
	@RequestMapping(value = "/filter", method = RequestMethod.POST)
	public @ResponseBody JQGridResponseDto<DocumentoRegVPP> filter(
			@RequestJsonBody(param="filter") DocumentoRegVPP filterDocumento,
			@RequestJsonBody JQGridRequestDto jqGridRequestDto,
			HttpServletRequest request,HttpSession session) {
		session.setAttribute("FUENTE", filterDocumento.getFuente());
		DocumentosController.logger.info("[POST - filter] : Obtener Documentos");
		return this.documentosService.filter(filterDocumento, jqGridRequestDto, false);
	}
	/**
	 * Operacion CRUD Delete. Borrado del registro correspondiente al
	 * identificador especificado.
	 *
	 * @param numDocumento Integer
	 *            Identificador del objeto que se desea eliminar.
	 * @return Elemento
	 *            Bean eliminado.
	 */
	@RequestMapping(value = "/{numDocumento}", method = RequestMethod.DELETE)
	@ResponseStatus(value = HttpStatus.OK)
    public @ResponseBody DocumentoRegVPP remove(@PathVariable BigDecimal numDocumento,HttpSession session) {
		DocumentoRegVPP documentoRegVPP = new DocumentoRegVPP();
		documentoRegVPP.setFuente(Integer.parseInt(session.getAttribute("FUENTE").toString()));
		Documento documento=new Documento(numDocumento);
		documentoRegVPP.setDocumento(documento);
        this.documentosService.remove(documentoRegVPP);
        DocumentosController.logger.info("[DELETE] : Documento borrado correctamente");
       	return documentoRegVPP;
    }
}	
