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

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.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.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 org.zkoss.zul.api.Datebox;

import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.PricingEspecifico;
import com.rjconsultores.ventaboletos.entidad.PricingEspecificoCategoria;
import com.rjconsultores.ventaboletos.service.ClaseServicioService;
import com.rjconsultores.ventaboletos.service.ParadaService;
import com.rjconsultores.ventaboletos.service.PricingEspecificoService;
import com.rjconsultores.ventaboletos.service.VigenciaTarifaService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxParada;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderEmpresaModificacionMassivaTarifa;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderParadaModificaoMassivaPricingEspecifico;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderTipoClasse;

@Controller("modificacionMasivaPricingEspecificoController")
@Scope("prototype")
public class ModificacionMasivaPricingEspecificoController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;

	@Autowired
	private ClaseServicioService claseServicioService;
	@Autowired
	private ParadaService paradaService;
	@Autowired
	private VigenciaTarifaService vigenciaTarifaService;
	@Autowired
	private PricingEspecificoService pricingEspecificoService;

	private List<Empresa> lsEmpresas;
	private List<ClaseServicio> lsTipoClasse;

	private List<Empresa> lsAddRmvEmpresas;
	private List<ClaseServicio> lsAddTipoClasse;
	private List<Parada> lsAddOrigem;
	private List<Parada> lsAddDestino;

	private Combobox cmbEmpresa;
	private Combobox cmbTipoClasse;
	private MyComboboxParada cmbOrigem;
	private MyComboboxParada cmbDestino;

	private Datebox txtVigenciaInicial;
	private Datebox txtVigenciaFinal;

	private MyListbox empresaList;
	private MyListbox tipoClasseList;
	private MyListbox origemList;
	private MyListbox destinoList;

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

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

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

	public List<ClaseServicio> getLsTipoClasse() {
		return lsTipoClasse;
	}

	public void setLsTipoClasse(List<ClaseServicio> lsTipoClasse) {
		this.lsTipoClasse = lsTipoClasse;
	}

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);

		lsEmpresas = UsuarioLogado.getUsuarioLogado().getEmpresa();
		lsTipoClasse = claseServicioService.obtenerTodos();

		empresaList.setItemRenderer(new RenderEmpresaModificacionMassivaTarifa());
		tipoClasseList.setItemRenderer(new RenderTipoClasse());
		origemList.setItemRenderer(new RenderParadaModificaoMassivaPricingEspecifico());
		destinoList.setItemRenderer(new RenderParadaModificaoMassivaPricingEspecifico());

		lsAddRmvEmpresas = new ArrayList<Empresa>();
		lsAddTipoClasse = new ArrayList<ClaseServicio>();
		lsAddOrigem = new ArrayList<Parada>();
		lsAddDestino = new ArrayList<Parada>();
	}

	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<PricingEspecifico> lsPricingEspecifico =
					pricingEspecificoService.buscar(lsAddRmvEmpresas, lsAddTipoClasse, lsAddOrigem, lsAddOrigem, txtVigenciaInicial.getValue(), txtVigenciaFinal.getValue());

			if (!lsPricingEspecifico.isEmpty()) {

				gerarExcelSemAgrupamento(lsPricingEspecifico, wb, estilo, coeficiente);

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

				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", "modificacionMasivaPricingEspecifico.xls");

				fNomeArquivo.delete();
			}
			else {
				Messagebox.show(Labels.getLabel("modificacionMasivaPricingEspecificoController.MSG.excelVazio"),
						Labels.getLabel("modificacionMasivaPricingEspecificoController.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/pricing/modificacionMasivaPricingEspecificoUpload.zul",
					Labels.getLabel("modificacionMasivaPricingEspecificoController.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$btnAdicionarTipoClasse(Event ev) {
		Comboitem cbiTipoClasse = cmbTipoClasse.getSelectedItem();
		if (cbiTipoClasse != null) {
			ClaseServicio tipoClasse = (ClaseServicio) cbiTipoClasse.getValue();
			if (!lsAddTipoClasse.contains(tipoClasse)) {
				lsAddTipoClasse.add(tipoClasse);
				tipoClasseList.setData(lsAddTipoClasse);
			}
			cmbTipoClasse.setSelectedItem(null);
		}
	}

	public void onClick$btnRemoverTipoClasse(Event ev) {
		ClaseServicio tipoClasse = (ClaseServicio) tipoClasseList.getSelected();
		if (tipoClasse != null) {
			lsAddTipoClasse.remove(tipoClasse);
			tipoClasseList.setData(lsAddTipoClasse);
		}
	}

	public void onClick$btnAdicionarOrigem(Event ev) {
		Comboitem cbiOrigem = cmbOrigem.getSelectedItem();
		if (cbiOrigem != null) {
			Parada origem = (Parada) cbiOrigem.getValue();
			if (!lsAddOrigem.contains(origem)) {
				lsAddOrigem.add(origem);
				origemList.setData(lsAddOrigem);
			}
			cmbOrigem.setSelectedItem(null);
		}
	}

	public void onClick$btnRemoverOrigem(Event ev) {
		Parada origem = (Parada) origemList.getSelected();
		if (origem != null) {
			lsAddOrigem.remove(origem);
			origemList.setData(lsAddOrigem);
		}
	}

	public void onClick$btnAdicionarDestino(Event ev) {
		Comboitem cbiDestino = cmbDestino.getSelectedItem();
		if (cbiDestino != null) {
			Parada destino = (Parada) cbiDestino.getValue();
			if (!lsAddDestino.contains(destino)) {
				lsAddDestino.add(destino);
				destinoList.setData(lsAddDestino);
			}
			cmbDestino.setSelectedItem(null);
		}
	}

	public void onClick$btnRemoverDestino(Event ev) {
		Parada destino = (Parada) destinoList.getSelected();
		if (destino != null) {
			lsAddDestino.remove(destino);
			destinoList.setData(lsAddDestino);
		}
	}

	private void gerarExcelSemAgrupamento(List<PricingEspecifico> lsPricingEspecifico, HSSFWorkbook wb, HSSFCellStyle estilo, BigDecimal coeficiente) throws ParseException {
		HSSFSheet sheet1 = wb.createSheet("UTIL");
		int contRow = 1;

		HSSFRow rowCabecalho = sheet1.createRow(0);

		HSSFCell cell0 = rowCabecalho.createCell(0);
		cell0.setCellValue(Labels.getLabel("modificacionMasivaPricingEspecificoController.lblIdPricingEspecifico"));
		cell0.setCellStyle(estilo);

		HSSFCell cell1 = rowCabecalho.createCell(1);
		cell1.setCellValue(Labels.getLabel("modificacionMasivaPricingEspecificoController.lblNomePricingEspecifico"));
		cell1.setCellStyle(estilo);

		HSSFCell cell2 = rowCabecalho.createCell(2);
		cell2.setCellValue(Labels.getLabel("modificacionMasivaPricingEspecificoController.lblServico"));
		cell2.setCellStyle(estilo);

		HSSFCell cell3 = rowCabecalho.createCell(3);
		cell3.setCellValue(Labels.getLabel("modificacionMasivaPricingEspecificoController.lblCanalVenda"));
		cell3.setCellStyle(estilo);

		HSSFCell cell4 = rowCabecalho.createCell(4);
		cell4.setCellValue(Labels.getLabel("modificacionMasivaPricingEspecificoController.lblTipoPassageiro"));
		cell4.setCellStyle(estilo);

		HSSFCell cell5 = rowCabecalho.createCell(5);
		cell5.setCellValue(Labels.getLabel("modificacionMasivaPricingEspecificoController.lblTipoClasse"));
		cell5.setCellStyle(estilo);

		HSSFCell cell6 = rowCabecalho.createCell(6);
		cell6.setCellValue(Labels.getLabel("modificacionMasivaPricingEspecificoController.lblMarca"));
		cell6.setCellStyle(estilo);

		HSSFCell cell7 = rowCabecalho.createCell(7);
		cell7.setCellValue(Labels.getLabel("modificacionMasivaPricingEspecificoController.lblOrigem"));
		cell7.setCellStyle(estilo);

		HSSFCell cell8 = rowCabecalho.createCell(8);
		cell8.setCellValue(Labels.getLabel("modificacionMasivaPricingEspecificoController.lblDestino"));
		cell8.setCellStyle(estilo);

		HSSFCell cell9 = rowCabecalho.createCell(9);
		cell9.setCellValue(Labels.getLabel("modificacionMasivaPricingEspecificoController.lblDataHoraInicio"));
		cell9.setCellStyle(estilo);

		HSSFCell cell10 = rowCabecalho.createCell(10);
		cell10.setCellValue(Labels.getLabel("modificacionMasivaPricingEspecificoController.lblDataHoraInicioSimulado"));
		cell10.setCellStyle(estilo);

		HSSFCell cell11 = rowCabecalho.createCell(11);
		cell11.setCellValue(Labels.getLabel("modificacionMasivaPricingEspecificoController.lblDataHoraFim"));
		cell11.setCellStyle(estilo);

		HSSFCell cell12 = rowCabecalho.createCell(12);
		cell12.setCellValue(Labels.getLabel("modificacionMasivaPricingEspecificoController.lblDataHoraFimSimulado"));
		cell12.setCellStyle(estilo);

		HSSFCell cell13 = rowCabecalho.createCell(13);
		cell13.setCellValue(Labels.getLabel("modificacionMasivaPricingEspecificoController.lblCancelar"));
		cell13.setCellStyle(estilo);

		SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");

		for (PricingEspecifico pricing : lsPricingEspecifico) {
			HSSFRow row = sheet1.createRow(contRow++);
			row.createCell(0).setCellValue(pricing.getPricingespecificoId());
			row.createCell(1).setCellValue(pricing.getNombPricing());
			row.createCell(2).setCellValue(pricing.getCorridaId() != null ? pricing.getCorridaId().toString() : "");
//			row.createCell(3).setCellValue(pricing.getTipoPtovta().getDesctipo());
			row.createCell(4).setCellValue(categoriasToString(pricing.getPricingEspecificoCategoriaList()));
			row.createCell(5).setCellValue(pricing.getClaseServicio().getDescclase());
			row.createCell(6).setCellValue(pricing.getMarca().getDescmarca());
			row.createCell(7).setCellValue(pricing.getParada().getDescparada());
			row.createCell(8).setCellValue(pricing.getParada1().getDescparada());
			row.createCell(9).setCellValue(formato.format(pricing.getFechorinicio()));
			row.createCell(10).setCellValue("");
			row.createCell(11).setCellValue(formato.format(pricing.getFechorfin()));
			row.createCell(12).setCellValue("");
			row.createCell(13).setCellValue("");
		}
		for (int i = 0; i <= 12; i++) {
			sheet1.autoSizeColumn(i);
		}
	}

	private String categoriasToString(List<PricingEspecificoCategoria> pricingEspecificoCategoriaList) {
		String result = "";

		for (PricingEspecificoCategoria p : pricingEspecificoCategoriaList) {
			result += p.getCategoria().getDesccategoria() + "-";
		}
		return result.isEmpty() ? "" : result.substring(0, result.length() - 1);
	}
}
