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

import java.util.Arrays;
import java.util.List;

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.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.Filedownload;

import com.rjconsultores.ventaboletos.dao.CajaDAO;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.enums.RelatorioVendaCartaoCashMonitorModeloEnum;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.utilerias.MoneyHelper;
import com.rjconsultores.ventaboletos.vo.cashmonitor.RelatorioVendaCartaoCashMonitorVO;
import com.rjconsultores.ventaboletos.web.utilerias.ConstraintNoEmpty;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxPuntoVenta;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;

//Mantis 15657

@Controller("relatorioVendaCartaoCashMonitorController")
@Scope("prototype")
@SuppressWarnings("serial")
public class RelatorioVendaCartaoCashMonitorController extends MyGenericForwardComposer {

	@Autowired
	private EmpresaService empresaService;

	@Autowired
	private CajaDAO cajaDAO;

	private Datebox dataInicial;
	private Datebox dataFinal;
	private MyComboboxEstandar cmbEmpresa;
	private MyComboboxPuntoVenta cmbAgencia;
	private MyComboboxEstandar cmbModelo;
	private List<Empresa> lsEmpresas;
	private List<RelatorioVendaCartaoCashMonitorModeloEnum> lsModelo;
	
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		lsEmpresas = empresaService.obtenerTodos();
		lsModelo = Arrays.asList(RelatorioVendaCartaoCashMonitorModeloEnum.values());
	}
	
	public void onClick$btnSalvarRelatorioCSV(Event ev) throws Exception {
		cmbModelo.setConstraint(new ConstraintNoEmpty());
		cmbModelo.getValue();

		salvarRelatorioCSV();
	}

	private void salvarRelatorioCSV() throws Exception {
		Empresa empresa = null;
		if (cmbEmpresa.getSelectedIndex() != -1) {
			empresa = (Empresa) cmbEmpresa.getSelectedItem().getValue();
		}

		PuntoVenta puntoVenta = null;
		if (cmbAgencia.getSelectedIndex() != -1) {
			puntoVenta = (PuntoVenta) cmbAgencia.getSelectedItem().getValue();
		}

		List<RelatorioVendaCartaoCashMonitorVO> listaVO = cajaDAO.buscarVendaCartaoCashMonitor(dataInicial.getValue(), dataFinal.getValue(), empresa, puntoVenta);

		final String QUEBRA_LINHA = "\n";

		StringBuilder csv = new StringBuilder();
		addCampoCSV(csv, Labels.getLabel("relatorioVendaCartaoCashMonitorController.data_transacao.label"));
		addCampoCSV(csv, Labels.getLabel("relatorioVendaCartaoCashMonitorController.loja.label"));
		addCampoCSV(csv, Labels.getLabel("relatorioVendaCartaoCashMonitorController.adquirente.label"));
		addCampoCSV(csv, Labels.getLabel("relatorioVendaCartaoCashMonitorController.nsu.label"));
		addCampoCSV(csv, Labels.getLabel("relatorioVendaCartaoCashMonitorController.autorizacao.label"));
		addCampoCSV(csv, Labels.getLabel("relatorioVendaCartaoCashMonitorController.valor_bruto.label"));
		addCampoCSV(csv, Labels.getLabel("relatorioVendaCartaoCashMonitorController.condicao_venda.label"));
		addCampoCSV(csv, Labels.getLabel("relatorioVendaCartaoCashMonitorController.bandeira.label"));
		addCampoCSV(csv, Labels.getLabel("relatorioVendaCartaoCashMonitorController.codigo_pedido.label"));

		// addCampoCSV(csv, "LOJA");
		// addCampoCSV(csv, "ADQUIRENTE");
		// addCampoCSV(csv, "NSU");
		// addCampoCSV(csv, "AUTORIZACAO");
		// addCampoCSV(csv, "VALOR BRUTO");
		// addCampoCSV(csv, "CONDICAO DE VENDA");
		// addCampoCSV(csv, "BANDEIRA");
		// addCampoCSV(csv, "CODIGO PEDIDO");

		RelatorioVendaCartaoCashMonitorModeloEnum modelo = (RelatorioVendaCartaoCashMonitorModeloEnum) cmbModelo.getSelectedItem().getValue();

		if (RelatorioVendaCartaoCashMonitorModeloEnum.COM_VALORES_TOTAIS_VENDAS.equals(modelo)) {
			for (RelatorioVendaCartaoCashMonitorVO vo: listaVO) {
				csv.append(QUEBRA_LINHA);
				addCamposPadroes(csv, vo);
			}
		} else if (RelatorioVendaCartaoCashMonitorModeloEnum.ABERTO_POR_PARCELAS.equals(modelo)) {
			addCampoCSV(csv, Labels.getLabel("relatorioVendaCartaoCashMonitorController.valor_parcela.label"));
			addCampoCSV(csv, Labels.getLabel("relatorioVendaCartaoCashMonitorController.numero_parcela.label"));

			for (RelatorioVendaCartaoCashMonitorVO vo : listaVO) {
				Integer parcelas = vo.getParcelas();

				for (int parcela = 1; parcela <= parcelas; parcela++) {
					csv.append(QUEBRA_LINHA);

					addCamposPadroes(csv, vo);
					addCampoCSV(csv, MoneyHelper.getValor(vo.getValorParcela()));
					addCampoCSV(csv, String.valueOf(parcela));

				}
			}
		}

		Filedownload.save(csv.toString().getBytes(), "text/csv", "cash_monitor_" + System.currentTimeMillis() + ".csv");
	}

	private void addCampoCSV(StringBuilder csv, String valor) {
		if (valor != null) {
			csv.append("\"" + valor + "\";");
		} else {
			csv.append("\"\";");
		}
	}

	private void addCamposPadroes(StringBuilder csv, RelatorioVendaCartaoCashMonitorVO vo) {
		addCampoCSV(csv, vo.getDataTransacao());
		addCampoCSV(csv, vo.getLoja());
		addCampoCSV(csv, vo.getAdquirente());
		addCampoCSV(csv, vo.getNsu());
		addCampoCSV(csv, vo.getAutorizacao());
		addCampoCSV(csv, MoneyHelper.getValor(vo.getValorBruto()));
		addCampoCSV(csv, vo.getCondicaoVenda());
		addCampoCSV(csv, vo.getBandeira());
		addCampoCSV(csv, vo.getCodigoPedido() != null ? vo.getCodigoPedido().toString() : "");
	}

	// gets/sets
	public List<Empresa> getLsEmpresas() {
		return lsEmpresas;
	}

	public void setLsEmpresas(List<Empresa> lsEmpresas) {
		this.lsEmpresas = lsEmpresas;
	}

	public List<RelatorioVendaCartaoCashMonitorModeloEnum> getLsModelo() {
		return lsModelo;
	}

	public void setLsModelo(List<RelatorioVendaCartaoCashMonitorModeloEnum> lsModelo) {
		this.lsModelo = lsModelo;
	}
}