/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.rjconsultores.ventaboletos.web.gui.controladores.configuracioneccomerciales;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.net.MalformedURLException;

import javax.activation.MimetypesFileTypeMap;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.xhtmlrenderer.pdf.ITextRenderer;
import org.zkforge.ckez.CKeditor;
import org.zkoss.util.resource.Labels;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Filedownload;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Radiogroup;

import com.itextpdf.text.DocumentException;
import com.rjconsultores.ventaboletos.entidad.ConfContratoPuntoVenta;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.service.ConfContratoPuntoVentaService;
import com.rjconsultores.ventaboletos.vo.configuracioneccomerciales.ConfLayoutContratoVO;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;

@Controller("configLayoulGeradorContratoController")
@Scope("prototype")
public class ConfigLayoulGeradorContratoController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	private CKeditor chkConfigLayoutGeradorContratoPrazo;
	private CKeditor chkConfigLayoutGeradorContratoVista;
	private Combobox cmbPuntoVenta;
	private Combobox cmbEmpresa;
	private final String contratoPrazo = "Contrato_Prazo.pdf";
	private final String contratoAVista = "Contrato_AVista.pdf";
	@Autowired
	private ConfContratoPuntoVentaService confContratoPuntoVentaService;

	private ConfContratoPuntoVenta confContratoPuntoVenta;
	private static Logger log = LogManager.getLogger(ConfigLayoulGeradorContratoController.class);
	private Radiogroup rdbGroup;

	public void onClick$btnExecutarRelatorio(Event ev) throws Exception {
		executarRelatorio();
	}

	/**
	 * @throws Exception
	 * 
	 */
	private void executarRelatorio() throws Exception {
		
		cmbPuntoVenta.getValue();
		cmbEmpresa.getValue();
		
		if(cmbPuntoVenta.getSelectedItem() == null || cmbEmpresa.getSelectedItem() == null){
			return;
		}
		try {
				Integer puntoVentaId = ((PuntoVenta)cmbPuntoVenta.getSelectedItem().getValue()).getPuntoventaId();
				Integer empresaId = ((Empresa)cmbEmpresa.getSelectedItem().getValue()).getEmpresaId();
				
				ConfLayoutContratoVO  confLayoutContratoVO =  buscarInformacoesPontoVendaparaGerarContratos(puntoVentaId, empresaId);
		    	if(confLayoutContratoVO == null){
					Messagebox.show(Labels.getLabel("configLayoutGeradorContratoController.lbNoResultado.value"),
							Labels.getLabel("configLayoutGeradorContratoController.window.title"),
							Messagebox.OK, Messagebox.EXCLAMATION);
					return;
		    	}    	
		    	String layout = "";
		    	    	
				if(rdbGroup.getSelectedItem().getValue().equals("P")) {
						layout = formatarLayout(confLayoutContratoVO, chkConfigLayoutGeradorContratoPrazo.getValue());			
						gerarPDF(layout, contratoPrazo);			
				}else if(rdbGroup.getSelectedItem().getValue().equals("A")) {
						layout = formatarLayout(confLayoutContratoVO, chkConfigLayoutGeradorContratoVista.getValue());
						gerarPDF(layout, contratoAVista);		
				} 		
			}catch (Exception e) {
				log.error("",e);
			}
      
	}

	private String formatarLayout(ConfLayoutContratoVO confLayoutContratoVO, String html) {
		return confContratoPuntoVentaService.formatarLayout(confLayoutContratoVO, html);
	}

	private void gerarPDF(String html, String nomeArquivo) throws IOException, MalformedURLException, FileNotFoundException, DocumentException {
		
		FileInputStream inputStream = null;
		OutputStream output = null;
		BufferedWriter writer  = null;
		try {
	
			File fileHtml = File.createTempFile("contrato.html", ".tmp");
	        String url = fileHtml.toURI().toURL().toString();
	        System.out.println("Temp file: " + fileHtml.getAbsolutePath());
			
			writer = new BufferedWriter(new FileWriter(fileHtml));
			writer.write(html); 
			writer.close();
	
			File filePDF = File.createTempFile("pdfgerado.pdf", ".tmp");
			System.out.println("Temp file: " + filePDF.getAbsolutePath());
			output = new FileOutputStream(filePDF.getAbsolutePath());
	
			ITextRenderer renderer = new ITextRenderer();
			renderer.setDocument(url);
			renderer.layout();
			renderer.createPDF(output);

			if (filePDF.exists()) {
				inputStream = new FileInputStream(filePDF);
				Filedownload.save(inputStream, new MimetypesFileTypeMap().getContentType(filePDF), nomeArquivo);
			}
		
			output.close();
			fileHtml.delete();
			filePDF.delete();
		
		} catch (FileNotFoundException e) {
			inputStream.close();
			output.close();
			log.error("",e);
		}
	}
	
	public void onClick$botaoSalvar(Event ev) throws Exception {

		try {
			confContratoPuntoVenta.setTextoContratoAVista(chkConfigLayoutGeradorContratoVista.getValue());
			confContratoPuntoVenta.setTextoContratoPrazo(chkConfigLayoutGeradorContratoPrazo.getValue());
			
			if(confContratoPuntoVenta.getConfigContratoPuntoVentaId() != null){
				confContratoPuntoVentaService.actualizacion(confContratoPuntoVenta);
				Messagebox.show(Labels.getLabel("configLayoutGeradorContratoController.MBAtualizacao.value"),
						Labels.getLabel("configLayoutGeradorContratoController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			}else{
				confContratoPuntoVentaService.suscribir(confContratoPuntoVenta);
				Messagebox.show(Labels.getLabel("configLayoutGeradorContratoController.MBNovo.value"),
						Labels.getLabel("configLayoutGeradorContratoController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
			}
			
		} catch (Exception e) {
			log.error(e);
		}
		
	}

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		if(!confContratoPuntoVentaService.obtenerTodos().isEmpty()){
			confContratoPuntoVenta = confContratoPuntoVentaService.obtenerTodos().get(0);
		}		
		if(confContratoPuntoVenta == null){
			confContratoPuntoVenta = new ConfContratoPuntoVenta();
			confContratoPuntoVenta.setTextoContratoAVista("");
			confContratoPuntoVenta.setTextoContratoPrazo("");
		}
		
	}

	public ConfContratoPuntoVenta getConfContratoPuntoVenta() {
		return confContratoPuntoVenta;
	}

	public void setConfContratoPuntoVenta(ConfContratoPuntoVenta confContratoPuntoVenta) {
		this.confContratoPuntoVenta = confContratoPuntoVenta;
	}
	
	private ConfLayoutContratoVO buscarInformacoesPontoVendaparaGerarContratos(Integer puntoVentaId, Integer empresaIsd){
		return confContratoPuntoVentaService.buscarInformacoesPontoVendaparaGerarContratos(puntoVentaId, empresaIsd);
	}

}
