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

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.zkoss.util.media.Media;
import org.zkoss.util.resource.Labels;
import org.zkoss.zhtml.Filedownload;
import org.zkoss.zhtml.Fileupload;
import org.zkoss.zhtml.Messagebox;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;

import com.rjconsultores.ventaboletos.entidad.AliasServico;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.service.AliasServicoService;
import com.rjconsultores.ventaboletos.service.RutaService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderCatalogoDeRutas;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderEmpresaModificacionMassivaTarifa;

@Controller("modificacionMasivaTarifasAliasController")
@Scope("prototype")
public class ModificacionMasivaTarifasAliasController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;

	@Autowired
	private RutaService rutaService;
	
	@Autowired
	private AliasServicoService aliasServicoService;

	private List<Empresa> lsEmpresas;
	private List<Ruta> lsRutas;
	private List<Empresa> lsAddRmvEmpresas;
	private List<Ruta> lsAddRmvRutas;

	private Combobox cmbEmpresa;
	private Combobox cmbRuta;
	private MyListbox empresaList;
	private MyListbox rutaList;

	private static Logger log = Logger.getLogger(ModificacionMasivaTarifasAliasController.class);

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

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

	public List<Ruta> getLsRutas() {
		return lsRutas;
	}

	public void setLsRutas(List<Ruta> lsRutas) {
		this.lsRutas = lsRutas;
	}

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		
		lsEmpresas = UsuarioLogado.getUsuarioLogado().getEmpresa();
		lsRutas = rutaService.obtenerTodos();
		
		empresaList.setItemRenderer(new RenderEmpresaModificacionMassivaTarifa());
		rutaList.setItemRenderer(new RenderCatalogoDeRutas());
		
		lsAddRmvEmpresas = new ArrayList<Empresa>();
		lsAddRmvRutas = new ArrayList<Ruta>();
	}

	public void onClick$btnGerarExcel(Event ev) {
		onClick$btnGerarExcelLinear(null);
	}

	public void onClick$btnGerarExcelLinear(Event ev) {

		try {

			BigDecimal coeficiente = new BigDecimal(BigInteger.ZERO);

			// Estilo padrão
			HSSFWorkbook wb = new HSSFWorkbook();

			// fonte em negrito:
			HSSFFont fonte = wb.createFont();
			fonte.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
			HSSFCellStyle estilo = wb.createCellStyle();
			estilo.setFont(fonte);

			List<AliasServico> lsAliasServico = aliasServicoService.buscarPorLinhaEmpresa(lsAddRmvRutas, lsAddRmvEmpresas);

			if (!lsAliasServico.isEmpty()) {

				gerarExcelSemAgrupamento(lsAliasServico, wb, estilo, coeficiente);

				String nomeArquivo =
						UsuarioLogado.getUsuarioLogado().getNombusuario()
								+ "_" + Calendar.getInstance().getTime().getTime()
								+ "_" + "modMassivaT";

				File fNomeArquivo = File.createTempFile(nomeArquivo, ".tmp");

				FileOutputStream stream = new FileOutputStream(fNomeArquivo);
				stream.flush();
				wb.write(stream);
				stream.close();

				InputStream is = null;
				is = new FileInputStream(fNomeArquivo);
				Filedownload.save(is, "application/xls", "modificacionMasivaAlias.xls");

				fNomeArquivo.delete();
			}
			else {
				Messagebox.show(Labels.getLabel("modificacionMasivaTarifasUploadController.MSG.excelVazio"),
						Labels.getLabel("modificacionMasivaTarifasController.window.title"), Messagebox.OK, Messagebox.INFORMATION);
			}

		} catch (Exception ex) {
			log.error("", ex);
		}
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	public void onClick$btnUpLoadExcel(Event ev) throws InterruptedException, IOException {
		Media mExcel = Fileupload.get();

		if (mExcel != null) {
			Map args = new HashMap();
			args.put("mExcel", mExcel);

			openWindow("/gui/tarifas/modificacionMasivaAliasUpload.zul",
					Labels.getLabel("modificacionMasivaAliasTarifasController.window.title"), args, MODAL);
		}
	}

	public void onClick$btnAdicionarEmpresa(Event ev) {
		Comboitem cbiEmpresa = cmbEmpresa.getSelectedItem();
		if (cbiEmpresa != null) {
			Empresa empresa = (Empresa) cbiEmpresa.getValue();

			if(!lsAddRmvEmpresas.contains(empresa)){
				lsAddRmvEmpresas.add(empresa);
				empresaList.setData(lsAddRmvEmpresas);
			}

			cmbEmpresa.setSelectedItem(null);
		}
	}

	public void onClick$btnRemoverEmpresa(Event ev) {
		Empresa empresa = (Empresa) empresaList.getSelected();
		if (empresa != null) {
			lsAddRmvEmpresas.remove(empresa);
			empresaList.setData(lsAddRmvEmpresas);
		}
	}

	public void onClick$btnAdicionarRuta(Event ev) {
		Comboitem cbiRuta = cmbRuta.getSelectedItem();
		if (cbiRuta != null) {
			Ruta ruta = (Ruta) cbiRuta.getValue();

			if (!lsAddRmvRutas.contains(ruta)) {
				lsAddRmvRutas.add(ruta);
				rutaList.setData(lsAddRmvRutas);
			}
			
			cmbRuta.setSelectedItem(null);
		}
	}

	public void onClick$btnRemoverRuta(Event ev) {
		Ruta ruta = (Ruta) rutaList.getSelected();
		if (ruta != null) {
			lsAddRmvRutas.remove(ruta);
			rutaList.setData(lsAddRmvRutas);
		}
	}
	
	
	private void gerarExcelSemAgrupamento(List<AliasServico> lsRutaCombinacion, HSSFWorkbook wb, HSSFCellStyle estilo, BigDecimal coeficiente){
		HSSFSheet sheet1 = wb.createSheet("UTIL");
		int contRow = 1;
		
		HSSFRow rowCabecalho = sheet1.createRow(0);

		HSSFCell cell = rowCabecalho.createCell(0);
		cell.setCellValue(Labels.getLabel("modificacionMasivaAliasTarifasController.lblAliasOrigem"));
		cell.setCellStyle(estilo);
		
		HSSFCell cell0 = rowCabecalho.createCell(1);
		cell0.setCellValue(Labels.getLabel("modificacionMasivaAliasTarifasController.lblAliasDestino"));
		cell0.setCellStyle(estilo);

		HSSFCell cell1 = rowCabecalho.createCell(2);
		cell1.setCellValue(Labels.getLabel("modificacionMasivaAliasTarifasController.lblOrigem"));
		cell1.setCellStyle(estilo);

		HSSFCell cell2 = rowCabecalho.createCell(3);
		cell2.setCellValue(Labels.getLabel("modificacionMasivaAliasTarifasController.lblDestino"));
		cell2.setCellStyle(estilo);

		HSSFCell cell3 = rowCabecalho.createCell(4);
		cell3.setCellValue(Labels.getLabel("modificacionMasivaAliasTarifasController.lblLinha"));
		cell3.setCellStyle(estilo);
		
		HSSFCell cell4 = rowCabecalho.createCell(5);
		cell4.setCellValue(Labels.getLabel("modificacionMasivaAliasTarifasController.lblCorrida"));
		cell4.setCellStyle(estilo);
		
		HSSFCell cell5 = rowCabecalho.createCell(6);
		cell5.setCellValue(Labels.getLabel("modificacionMasivaAliasTarifasController.lblAlias"));
		cell5.setCellStyle(estilo);
		
		
		for (AliasServico aliasServico : lsRutaCombinacion) {
			HSSFRow row = sheet1.createRow(contRow++);
			row.createCell(0).setCellValue(aliasServico.getAliasOrigen().getParadaId());
			row.createCell(1).setCellValue(aliasServico.getAliasDestino().getParadaId());
			row.createCell(2).setCellValue(aliasServico.getOrigen().getParadaId());
			row.createCell(3).setCellValue(aliasServico.getDestino().getParadaId());
			row.createCell(4).setCellValue(aliasServico.getRuta().getRutaId());
			row.createCell(5).setCellValue(aliasServico.getCorridaId() == null ? "" : aliasServico.getCorridaId().toString());
			row.createCell(6).setCellValue(aliasServico.getAliasServicoId());
		}
		for (int i = 0; i <= 6; i++) {
			sheet1.autoSizeColumn(i);
		}
	}
}
