package com.rjconsultores.ventaboletos.web.utilerias.servlet;

import java.io.ByteArrayInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.ApplicationContext;

import com.rjconsultores.ventaboletos.constantes.Constantes;
import com.rjconsultores.ventaboletos.entidad.Constante;
import com.rjconsultores.ventaboletos.entidad.Imagem;
import com.rjconsultores.ventaboletos.service.ConstanteService;
import com.rjconsultores.ventaboletos.utilerias.Application;
import com.rjconsultores.ventaboletos.web.utilerias.spring.AppContext;

/**
 * Servlet implementation class ImageServlet
 */
public class ImageServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private static final String PATH_IMAGENES = "/com/rjconsultores/ventaboletos/web/cliente/imagenes/";
//	private static final String IMAGENE_EMPRESA = "empresa.png";
//	private static final String IMAGENE_EMPRESA_GENERICA = "empresa_generica.png";
	private static Boolean IMAGENE_EMPRESA_GENERICA_CHECKED = null;
//	private static Imagem IMAGEM_EMPRESA_CARREGADA = null;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
		// Set content type
		resp.setContentType("image/png");
		try {
			String imagene = request.getParameter("imagene");
			if (imagene != null) {
				// Open the file and output streams
				imagene = getNombreImagene(imagene);
				
				InputStream in = getImagem(imagene);
				if (in != null) {
					OutputStream out = resp.getOutputStream();

					// Copy the contents of the file to the output stream
					byte[] buf = new byte[1024];
					int count = 0;
					while ((count = in.read(buf)) >= 0) {
						out.write(buf, 0, count);
					}
					in.close();
					out.close();
				}
				
				
			}
		} catch (FileNotFoundException fnfe) {
			log("Arquivo da Imagem nao localizado");
		}
	}

	/**
	 * Muda a imagem para uma imagem generica da empresa.
	 * 
	 * Utilizado para carregar a imagem padrão ao invés da do custom
	 * 
	 * @param imagene
	 * @return
	 */
	private String getNombreImagene(String imagene){
		if (!imagene.equalsIgnoreCase(Constantes.IMAGEM_EMPRESA)){
			return imagene;
		}
		
		boolean imageneGenericaEmpresaActivo =  false;
		
		if (IMAGENE_EMPRESA_GENERICA_CHECKED == null){
			
			IMAGENE_EMPRESA_GENERICA_CHECKED = false;
			
			ConstanteService constanteService = getConstanteService();
			Constante constante = constanteService.buscarPorNomeConstante("IMAGENE_EMPRESA_GENERICA");
			
			if ( (constante != null) && StringUtils.isNotBlank(constante.getValorconstante())){
				imageneGenericaEmpresaActivo= Boolean.parseBoolean(constante.getValorconstante());
				
				IMAGENE_EMPRESA_GENERICA_CHECKED = imageneGenericaEmpresaActivo;
			}
			
		}
		
		if ( (IMAGENE_EMPRESA_GENERICA_CHECKED != null) && (IMAGENE_EMPRESA_GENERICA_CHECKED)  ){
			imagene = Constantes.IMAGEM_EMPRESA_GENERICA;
		}
		
		return imagene;
		
		
	}
	
	private InputStream getImagem(String imagene) {
		InputStream inputStream = null;
		try {
			Application application = (Application) AppContext.getApplicationContext().getBean("app");
			Imagem imagem = application.getImage();
			if ((imagem != null) && imagem.getImagem() != null) {
				inputStream = getImagemLoaded(imagem.getImagem());
			}
		} catch (Exception e) {
			log("Erro ao carregar imagem do banco de dados.");
		} finally {
			if (inputStream != null) {
				try {
					inputStream.close();
				} catch (Exception e) {
				}
			}
		}
		return inputStream;

	}
	
	private InputStream getImagemLoaded(byte[] imagene) throws Exception {
		InputStream inputStream = null;
		try {
			inputStream =  new ByteArrayInputStream(imagene);
		} catch (Exception e) {
			throw e;
		}
		return inputStream;
	}

	
	private ConstanteService getConstanteService() {
		ApplicationContext appContext = AppContext.getApplicationContext();
		BeanFactory factory = (BeanFactory) appContext;
		ConstanteService cs = (ConstanteService) factory.getBean("constanteService");
		return cs;
	}
	
	
}
