package com.rjconsultores.ventaboletos.web.gui.controladores.bpe;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

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.zkoss.util.resource.Labels;
import org.zkoss.zhtml.Messagebox;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Filedownload;

import com.rjconsultores.ventaboletos.constantes.Constantes;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Estado;
import com.rjconsultores.ventaboletos.service.BpeService;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.EstadoService;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;

@Controller("busquedaBpeExportacaoController")
@Scope("prototype")
public class BusquedaBpeExportacaoController extends MyGenericForwardComposer {
	private static final long serialVersionUID = 1L;

	private static Logger log = LogManager.getLogger(BusquedaBpeExportacaoController.class);

	@Autowired
	private BpeService bpeService;

	@Autowired
	private EmpresaService empresaService;

	@Autowired
	private EstadoService estadoService;

	private List<Empresa> lsEmpresa;
	private List<Estado> lsEstado;

	private Datebox datInicial;
	private Datebox datFinal;

	private MyComboboxEstandar cmbEmpresa;
	private MyComboboxEstandar cmbEstado;
	
	private Checkbox consultaOtimizada;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		lsEmpresa = empresaService.obtenerTodos();
		lsEstado = estadoService.obtenerTodos();

		super.doAfterCompose(comp);
		
		consultaOtimizada.setChecked(true);
	}

	public void onClick$btnExeExportacao(Event ev) throws InterruptedException {
		Empresa empresa = null;
		Estado estado = null;

		Comboitem itemEmpresa = cmbEmpresa.getSelectedItem();
		Comboitem itemEstado = cmbEstado.getSelectedItem();

		if (itemEmpresa != null) {
			empresa = (Empresa) itemEmpresa.getValue();
		}

		if (itemEstado != null) {
			estado = (Estado) itemEstado.getValue();
		}

		if (empresa != null && estado != null) {

			try {
				String nomeArquivo = getNomeArquivoExportacaoECF(datInicial.getValue(), estado, "BPE");
				String writerExp = bpeService.buscarArquivoExportacaoBPE(datInicial.getValue(), datFinal.getValue(), empresa, estado, nomeArquivo, consultaOtimizada.isChecked());

				File arquivo = criarArquivo(writerExp, nomeArquivo);

				if (arquivo == null) {
					Messagebox.show(
							Labels.getLabel("relatorio.parametro.msgNoData"),
							Labels.getLabel("indexController.mnSubMenuBpeFiscal.exportacao.label"),
							Messagebox.OK, Messagebox.INFORMATION);
					return;
				}

				downloadArquivo(arquivo, nomeArquivo);

			} catch (Exception e) {
				log.error("ERRO na exportação do arquivo BPE", e);
				
				Messagebox.show(
						Labels.getLabel("relatorio.parametro.msgNoData"),
						Labels.getLabel("indexController.mnSubMenuBpeFiscal.exportacao.label"),
						Messagebox.OK, Messagebox.INFORMATION);
				return;
			}
		}
	}

	public File criarArquivo(final String writerExp, final String nomeArquivo) {
		File file = null;
		PrintWriter writer = null;
		if (writerExp != null) {
			try {
				file = File.createTempFile(nomeArquivo + "-", ".fs");
				writer = new PrintWriter(new OutputStreamWriter(new FileOutputStream(file), Constantes.UTF_8));
				writer.write(writerExp);
			} catch (IOException e) {
				log.error("", e);

			} finally {
				if (writer != null) {
					writer.close();
				}
			}
		}
		return file;
	}

	private String getNomeArquivoExportacaoECF(Date dataInicial, Estado estado, String tipo) {
		String[] mesano = new SimpleDateFormat("MM/yyyy").format(dataInicial).split("/");

		String mes = mesano[0].toString();
		String ano = mesano[1].toString();

		String nome = "";

		switch (Integer.valueOf(mes)) {
		case 1:
			nome = "Jan";
			break;
		case 2:
			nome = "Fev";
			break;
		case 3:
			nome = "Mar";
			break;
		case 4:
			nome = "Abr";
			break;
		case 5:
			nome = "Mai";
			break;
		case 6:
			nome = "Jun";
			break;
		case 7:
			nome = "Jul";
			break;
		case 8:
			nome = "Ago";
			break;
		case 9:
			nome = "Set";
			break;
		case 10:
			nome = "Out";
			break;
		case 11:
			nome = "Nov";
			break;
		case 12:
			nome = "Dez";
			break;
		default:
			break;
		}

		String nomeArquivo = "TotalBus " + estado.getCveestado() + " " + tipo + " " + nome + ano;

		return nomeArquivo;
	}

	private void downloadArquivo(File arquivoTxt, String nome) throws Exception {
		String contentType = "application/notepad";
		InputStream isFile = new FileInputStream(arquivoTxt);
		String nomeArquivo = arquivoTxt.getName();

		if (nome != null && !nome.isEmpty()) {
			nomeArquivo = nome + ".fs";
		}

		Filedownload.save(isFile, contentType, nomeArquivo);

		if (arquivoTxt != null) {
			arquivoTxt.delete();
		}
	}

	public List<Empresa> getLsEmpresa() {
		return lsEmpresa;
	}

	public List<Estado> getLsEstado() {
		return lsEstado;
	}

	public void setLsEstado(List<Estado> lsEstado) {
		this.lsEstado = lsEstado;
	}
}
