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

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.zkoss.util.media.Media;
import org.zkoss.zhtml.Filedownload;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.InputEvent;
import org.zkoss.zk.ui.event.UploadEvent;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.Textbox;

import com.rjconsultores.ventaboletos.vo.configuracioneccomerciales.ConfigCoordenadas;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderConfigLayoutImpressaoBoleto;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderConfigLayoutImpressaoBoletoMensagem;

@Controller("configLayoutImpressaoBoletoController")
@Scope("prototype")
public class ConfigLayoutImpressaoBoletoController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;
	private MyListbox campoCoordenadasList;
	private MyListbox campoCoordenadasMensagemList;
	private Combobox cmbCampo;
	private Intbox txtLinha;
	private Intbox txtColuna;
	private Intbox txtTamanho;
	private Intbox txtLinhaMensagem;
	private Intbox txtColunaMensagem;
	private Textbox txtLayout;
	private Textbox txtMensagem;
	private Integer linha;
	private Integer coluna;
	private List<ConfigCoordenadas> lsConfigCoordenadas;
	private List<ConfigCoordenadas> lsConfigCoordenadasMensagens;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		linha = 0;
		coluna = 0;
		txtLinha.setValue(linha);
		txtColuna.setValue(coluna);
		txtLinhaMensagem.setValue(linha);
		txtColunaMensagem.setValue(coluna);

		lsConfigCoordenadas = new ArrayList<ConfigCoordenadas>();
		lsConfigCoordenadasMensagens = new ArrayList<ConfigCoordenadas>();

		campoCoordenadasList.setItemRenderer(new RenderConfigLayoutImpressaoBoleto());
		campoCoordenadasMensagemList.setItemRenderer(new RenderConfigLayoutImpressaoBoletoMensagem());
	}

	public void onClick$btnSalvar(Event ev) throws IOException {
		StringBuilder txt = new StringBuilder();

		List<ConfigCoordenadas> lsArquivo = new ArrayList<ConfigCoordenadas>();
		lsArquivo.addAll(lsConfigCoordenadas);
		lsArquivo.addAll(lsConfigCoordenadasMensagens);

		for (ConfigCoordenadas c : lsArquivo) {
			txt.append(c.getCampo()).append(".linha=").append(c.getLinha()).append("\n");
			txt.append(c.getCampo()).append(".coluna=").append(c.getColuna()).append("\n");

			if (c.getTamanho() != null) {
				txt.append(c.getCampo()).append(".tamanho=").append(c.getTamanho()).append("\n");
			}

			if (c.getCampo().contains("getMensagem")) {
				txt.append(c.getCampo()).append(".str=").append(c.getMensagem()).append("\n");
			}
		}

		String nomeArquivo = "coordenadas";

		File fNomeArquivo = File.createTempFile(nomeArquivo, ".tmp");
		
		FileOutputStream stream = new FileOutputStream(fNomeArquivo);
		stream.flush();
		stream.write(txt.toString().getBytes());
		stream.close();
		

		InputStream is = new FileInputStream(fNomeArquivo);
		Filedownload.save(is, "application/properties", "coordenadas.properties");
		fNomeArquivo.delete();
	}

	public void onClick$btnAddCampoCoordenadas(Event ev) {
		String campo = "VAZIO";
		String lbCampo = cmbCampo.getText();
		Comboitem cbiCampo = cmbCampo.getSelectedItem();
		if (cbiCampo != null) {
			campo = (String) cbiCampo.getValue();
		}

		Integer linha = txtLinha.getValue();
		Integer coluna = txtColuna.getValue();
		Integer tamanho = txtTamanho.getValue();

		ConfigCoordenadas configCoordenadas = new ConfigCoordenadas();
		configCoordenadas.setLbCampo(lbCampo);
		configCoordenadas.setCampo(campo);
		configCoordenadas.setLinha(linha);
		configCoordenadas.setColuna(coluna);
		configCoordenadas.setTamanho(tamanho);

		if ((!campo.equals("VAZIO")) && (linha != null) && (coluna != null)) {
			if (!lsConfigCoordenadas.contains(configCoordenadas)) {
				lsConfigCoordenadas.add(configCoordenadas);

				campoCoordenadasList.setData(lsConfigCoordenadas);

				cmbCampo.setSelectedItem(null);
				txtLinha.setValue(null);
				txtColuna.setValue(null);
				txtTamanho.setValue(null);
			}
		}
	}

	public void onClick$btnRemoverCampoCoordenadas(Event ev) {
		ConfigCoordenadas configCoordenadas = (ConfigCoordenadas)
				campoCoordenadasList.getSelected();

		lsConfigCoordenadas.remove(configCoordenadas);

		campoCoordenadasList.setData(lsConfigCoordenadas);
	}

	public void onClick$btnAddCampoCoordenadasMensagem(Event ev) {
		Integer linha = txtLinhaMensagem.getValue();
		Integer coluna = txtColunaMensagem.getValue();
		Integer qtdeMensagens = lsConfigCoordenadasMensagens.size();

		ConfigCoordenadas configCoordenadas = new ConfigCoordenadas();
		configCoordenadas.setLbCampo("Mensagem " + qtdeMensagens);
		configCoordenadas.setCampo("getMensagem" + qtdeMensagens);
		configCoordenadas.setLinha(linha);
		configCoordenadas.setColuna(coluna);
		configCoordenadas.setMensagem(txtMensagem.getValue());

		if ((linha != null) && (coluna != null)) {
			if (!lsConfigCoordenadasMensagens.contains(configCoordenadas)) {
				lsConfigCoordenadasMensagens.add(configCoordenadas);

				campoCoordenadasMensagemList.setData(lsConfigCoordenadasMensagens);

				txtLinhaMensagem.setValue(null);
				txtColunaMensagem.setValue(null);
				txtMensagem.setValue(null);
			}
		}
	}

	public void onClick$btnRemoverCampoCoordenadasMensagem(Event ev) {
		ConfigCoordenadas configCoordenadas = (ConfigCoordenadas)
				campoCoordenadasMensagemList.getSelected();

		lsConfigCoordenadasMensagens.remove(configCoordenadas);

		campoCoordenadasMensagemList.setData(lsConfigCoordenadasMensagens);
	}

	public void onChange$txtLayout(InputEvent ev) {
		linha = 0;
		coluna = 0;
		String teste = txtLayout.getValue();

		char[] array = teste.toCharArray();
		for (char c : array) {
			if (c == '\n') {
				linha = linha + 1;
			} else {
				coluna = coluna + 1;
			}
		}

		txtLinha.setValue(linha);

		coluna = coluna / 2;
		txtColuna.setValue(coluna);

		txtLayout.setText("");
	}

	public void onUpload(UploadEvent event) throws IOException {
		Media media = event.getMedia();

		Properties props = new Properties();
		InputStream in = media.getStreamData();
		props.load(in);
		in.close();
	}
}
