package com.ejie.ab63.control.plantillas;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;

import javax.annotation.Resource;
import javax.servlet.http.Cookie;
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.context.i18n.LocaleContextHolder;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ModelAttribute;
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.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttributes;

import com.ejie.ab63.adaptadores.ab61WebServiceAdaptadorService;
import com.ejie.ab63.clientesWS.ab61WebService.Ab61Exception;
import com.ejie.ab63.comun.CargarPropiedades;
import com.ejie.ab63.comun.Constantes;
import com.ejie.ab63.model.expedientes.RelExpPla;
import com.ejie.ab63.model.plantillas.ParametrosConfig;
import com.ejie.ab63.model.plantillas.Plantillas;
import com.ejie.ab63.model.procedimientos.Procedimientos;
import com.ejie.ab63.model.usuario.Usuario;
import com.ejie.ab63.service.plantillas.ParametrosConfigService;
import com.ejie.ab63.service.plantillas.PlantillasService;
import com.ejie.ab63.tramita.adapter.PifAdapterService;
import com.ejie.ab63.util.PermisosXLNETS;
import com.ejie.x38.control.bind.annotation.RequestJsonBody;
import com.ejie.x38.dto.JQGridRequestDto;
import com.ejie.x38.dto.JQGridResponseDto;

/**
 * PlantillasController  
 * 
 *  
 */

@Controller
@SessionAttributes("usuario")
@RequestMapping(value = "/plantillas")

public class PlantillasController {

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

	@Autowired
	private PlantillasService plantillasService;

	@Autowired
	private ab61WebServiceAdaptadorService ab61WebServiceAdaptadorService;

	@Resource
	ReloadableResourceBundleMessageSource appMessageSource;

	@Autowired
	private ParametrosConfigService parametrosConfigService;

	@Autowired
	private PifAdapterService pifAdapterService;

	public static final String TEMP_PATH = CargarPropiedades.getConfigAplicacion("TEMP.DIR");

	/**
	 * Metodo de presentacion del RUP_TABLE.
	 * 
	 * @param model
	 *            Model
	 * @return String
	 */
	@RequestMapping(value = "/maint/{idProcedimiento}/{idExpediente}", method = RequestMethod.GET)
	public String getFormEditPlantilla(@PathVariable Integer idProcedimiento, @PathVariable String idExpediente,
			Model model) {
		PlantillasController.logger.info("[GET - View] : plantillas");
		model.addAttribute("idProcedimiento", idProcedimiento);
		model.addAttribute("idExpediente", idExpediente);

		model.addAttribute("origen", Constantes.ORIGEN_EXPEDIENTE);

		ParametrosConfig parametrosConfig = new ParametrosConfig();
		parametrosConfig.setDescripcion(Constantes.CONFIGURACION_DOCUMENTOS);
		parametrosConfig = this.parametrosConfigService.find(parametrosConfig);

		model.addAttribute("parametroConfig", parametrosConfig.getValor());

		model.addAttribute("plantilla", new Plantillas());
		return "plantillas";
	}

	/**
	 * Metodo para llamar al webservice de la AB61 y que me genere el documento
	 * rtf
	 * 
	 * @param model
	 *            Model
	 * @return String
	 * @throws AB61Exception
	 */
	@RequestMapping(value = "/llamarWebService/descargarDocumento/{procedureId}/{folderId}/{idPlantilla}", method = RequestMethod.GET)
	public @ResponseBody String descargarDocumento(@PathVariable String procedureId, @PathVariable String folderId,
			@PathVariable Integer idPlantilla) throws Ab61Exception {
		PlantillasController.logger.info("[GET - generarDocumento] : generarDocumento");

		return ab61WebServiceAdaptadorService.descargarDocumento(idPlantilla, procedureId, folderId,
				Constantes.CODIGO_APLICACION);

	}

	@RequestMapping(value = "/descargar", method = RequestMethod.POST)
	public @ResponseBody String descargar(HttpServletResponse httpResponse, @ModelAttribute Plantillas plantilla)
			throws Exception {

		String rutaDocumento = plantilla.getRutaDocumento();
		BufferedInputStream contenidoXml = this.pifAdapterService
				.getFile("/" + Constantes.CODIGO_APLICACION + "/" + rutaDocumento);
		int numRead;
		final int bufferSize = 1024;
		byte[] buffer = new byte[bufferSize];
		ByteArrayOutputStream outString = new ByteArrayOutputStream();
		try {
			while ((numRead = contenidoXml.read(buffer)) != -1) {
				outString.write(buffer, 0, numRead);
			}
		} finally {
			contenidoXml.close();
		}
		byte[] strbase64Doc1 = outString.toByteArray();

		// String nombreDocumento =
		// rutaDocumento.substring(rutaDocumento.indexOf("/"));
		String nombreDocumento = rutaDocumento;
		httpResponse.setHeader("Content-Disposition", "attachment; filename=\"" + nombreDocumento + "\"");
		Cookie cookie = new Cookie("fileDownload", "true");
		cookie.setMaxAge(2);
		cookie.setPath("/");
		httpResponse.addCookie(cookie);
		httpResponse.setContentType("application/doc");

		httpResponse.setContentLength(strbase64Doc1.length);
		httpResponse.getOutputStream().write(strbase64Doc1);

		httpResponse.getOutputStream().flush();
		httpResponse.getOutputStream().close();
		return null;
	}

	/**
	 * Metodo para llamar al webservice de la AB61 y que me genere el documento
	 * rtf
	 * 
	 * @param model
	 *            Model
	 * @return String
	 * @throws AB61Exception
	 */
	@RequestMapping(value = "/llamarWebService/{procedureId}/{folderId}/{idPlantilla}", method = RequestMethod.GET)
	public @ResponseBody String generarDocumento(@PathVariable String procedureId, @PathVariable String folderId,
			@PathVariable Integer idPlantilla, @ModelAttribute(value = "usuario") Usuario usuario)
			throws Ab61Exception {
		PlantillasController.logger.info("[GET - generarDocumento] : generarDocumento");

		return ab61WebServiceAdaptadorService.generarDocumento(idPlantilla, procedureId, folderId,
				usuario.getNombreUsuario().toLowerCase());

	}

	@RequestMapping(value = "/llamarWebService/eliminarDocumento/{idPlantilla}/{procedureId}/{folderId}", method = RequestMethod.GET)
	public @ResponseBody String eliminarDocumento(HttpServletRequest httpRequest, @PathVariable Integer idPlantilla,
			@PathVariable String procedureId, @PathVariable String folderId,
			@ModelAttribute(value = "usuario") Usuario usuario) throws Ab61Exception {

		PlantillasController.logger.info("Entrada a eliminarDocumento");
		return ab61WebServiceAdaptadorService.eliminarDocumento(idPlantilla, folderId, procedureId);

	}

	/**
	 * Metodo para llamar al webservice de la AB61 y que me modifique el
	 * documento rtf
	 * 
	 * @param model
	 *            Model
	 * @return String
	 * @throws AB61Exception
	 */
	@RequestMapping(value = "/llamarWebService/modificarDocumento/{idPlantilla}/{procedureId}/{folderId}", method = RequestMethod.GET)
	public @ResponseBody String modificarDocumento(@PathVariable String procedureId, @PathVariable String folderId,
			@PathVariable Integer idPlantilla, @ModelAttribute(value = "usuario") Usuario usuario)
			throws Ab61Exception {
		PlantillasController.logger.info("[GET - modificarDocumento] : modificarDocumento");

		String nombre = usuario.getNombreUsuario();
		return ab61WebServiceAdaptadorService.modificarDocumento(idPlantilla, procedureId, folderId, nombre);
	}

	/**
	 * Operacion de filtrado del componente RUP_TABLE.
	 * 
	 * @param filterPlantillas
	 *            Plantillas 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.
	 * @return JQGridResponseDto<Plantillas> Dto que contiene el resultado del
	 *         filtrado realizado por el componente RUP_TABLE.
	 */
	@RequestMapping(value = "/tabla/{IdProcedimiento}/{IdExpediente}/filter", method = RequestMethod.POST)
	public @ResponseBody JQGridResponseDto<Plantillas> filter(
			@RequestJsonBody(param = "filter") Plantillas filterPlantillas, @PathVariable Integer IdProcedimiento,
			// @PathVariable Integer origen,
			@PathVariable Integer IdExpediente, @RequestJsonBody JQGridRequestDto jqGridRequestDto) {

		if (IdExpediente == Constantes.MAGIC_NUMBER_0) {
			IdExpediente = null;
		}
		PlantillasController.logger.info("[POST - filter] : Obtener Plantillass");

		filterPlantillas.setProcedimientos(new Procedimientos(IdProcedimiento));
		// filterPlantillas.setOrigen(origen);
		RelExpPla relExpPla = new RelExpPla();
		relExpPla.setIdExpediente(IdExpediente);
		relExpPla.setIdProcedimiento(IdProcedimiento);
		filterPlantillas.setRelExpPla(relExpPla);
		return this.plantillasService.filter(filterPlantillas, jqGridRequestDto, false);

	}

	/**
	 * llama al webService que realiza la tarea indicada
	 * 
	 * @param idPlantilla
	 *            Integer
	 * @param procedureId
	 *            String
	 * @param folderId
	 *            String
	 * @param n38Login
	 *            String
	 * @return String
	 * @throws Ab61Exception
	 */
	@RequestMapping(value = "/aportarDocumento/{idPlantilla}/{procedureId}/{folderId}", method = RequestMethod.GET)
	public @ResponseBody String aportarDocumento(HttpServletRequest httpRequest, @PathVariable Integer idPlantilla,
			@PathVariable String procedureId, @PathVariable String folderId,
			@ModelAttribute(value = "usuario") Usuario usuario) throws Ab61Exception {

		PlantillasController.logger.info("Entrada a aportarDocumento");

		return this.plantillasService.aportarDocumento(idPlantilla, procedureId, folderId,
				PermisosXLNETS.fncLogin(httpRequest), usuario.getNombreUsuario());
	}

	/**
	 * Captura las excepciones AB61Exception.
	 *
	 */
	@ExceptionHandler(value = { Ab61Exception.class })
	public void handleSQLException(HttpServletRequest request, HttpServletResponse response, Exception ex)
			throws Exception {

		String mensajeError = "";

		if (LocaleContextHolder.getLocale().getLanguage().equalsIgnoreCase(Constantes.CASTELLANO))
			mensajeError = ((Ab61Exception) ex).getFaultInfo().getMensajeCastellano();
		else
			mensajeError = ((Ab61Exception) ex).getFaultInfo().getMensajeEuskera();

		// stated Content-Length
		response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
		response.setContentType("text/html;charset=UTF-8");
		response.getWriter().write(mensajeError);
		response.flushBuffer();
	}
}
