/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
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.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.List;

import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
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.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Comboitem;
import org.zkoss.zul.Filedownload;
import org.zkoss.zul.Label;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Radio;

import com.rjconsultores.ventaboletos.entidad.Ciudad;
import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
import com.rjconsultores.ventaboletos.entidad.Moneda;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.Plaza;
import com.rjconsultores.ventaboletos.entidad.Tarifa;
import com.rjconsultores.ventaboletos.entidad.Tramo;
import com.rjconsultores.ventaboletos.entidad.VigenciaTarifa;
import com.rjconsultores.ventaboletos.service.MercadoCompetidoService;
import com.rjconsultores.ventaboletos.service.TarifaService;
import com.rjconsultores.ventaboletos.service.VigenciaTarifaService;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;

/**
 * 
 * @author Rafius
 */
@Controller("modificacionMasivaTarifasUploadController")
@Scope("prototype")
public class ModificacionMasivaTarifasUploadController extends MyGenericForwardComposer {

	private static final long serialVersionUID = 1L;

	private final Integer CELL_ID_TARIFA = 0;
	private final Integer CELL_NOVO_PRECIO = 11;
	// private final Integer CELL_PEAJE = 12;
	private final Integer CELL_NOVO_PEAJE = 13;
	private final Integer CELL_NOVO_TX_EMBARQUE = 15;
	private final Integer CELL_NOVO_SEGURO = 17;

	@Autowired
	private TarifaService tarifaService;
	@Autowired
	private VigenciaTarifaService vigenciaTarifaService;
	@Autowired
	private MercadoCompetidoService mercadoCompetidoService;

	private List<VigenciaTarifa> lsVigenciaTarifa;
	private VigenciaTarifa vigenciaTarifa;
	private Media mExcel;

	private Radio rdSalvarNuevos;
	private Radio rdNoSalvarNuevos;

	private Radio rdVigenciaAtual;
	private Radio rdVigenciaNueva;

	private Combobox cmbVigenciaTarifa;
	private Label lbVigencia;
	private String componentePreco;
	private Combobox cmbComponentePreco;
	private List<String> lsComponentePreco;
	private static Logger log = Logger.getLogger(ModificacionMasivaTarifasUploadController.class);

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

		super.doAfterCompose(comp);

		mExcel = (Media) Executions.getCurrent().getArg().get("mExcel");

		lsVigenciaTarifa = vigenciaTarifaService.obtenerTodos();
		lbVigencia.setVisible(Boolean.FALSE);
		cmbVigenciaTarifa.setVisible(Boolean.FALSE);
		setLsComponentePreco(EnumTarifaPedagio.obterBundleValues());

		vigenciaTarifa();

	}

	public void onClick$rdVigenciaNueva(Event ev) {
		lbVigencia.setVisible(Boolean.TRUE);
		cmbVigenciaTarifa.setVisible(Boolean.TRUE);
		cmbVigenciaTarifa.setConstraint("no empty");
	}

	public void onClick$rdVigenciaAtual(Event ev) {
		lbVigencia.setVisible(Boolean.FALSE);
		cmbVigenciaTarifa.setVisible(Boolean.FALSE);
		cmbVigenciaTarifa.setConstraint("");
	}

	public void onClick$btnSalvar(Event ev) throws IOException, InterruptedException {
		componentePreco = cmbComponentePreco.getValue();

		if (rdSalvarNuevos.isChecked()) {
			salvarNuevos(false);
		} else if (rdNoSalvarNuevos.isChecked()) {
			salvarNuevos(true);
		}

	}

	public void salvarNuevos(Boolean salvarNuevos) throws IOException, InterruptedException {

		log.debug("MotificacionMasica:Salvar nuevos");

		String strErrorTarifa = "";
		String strMercadoCompetido = "";
		String strTarifaMinima = "";
		String strDuplicidade = "";

		Integer contador = 0;

		Integer opcao = Messagebox.show(
				Labels.getLabel("modificacionMasivaTarifasController.MSGAplicar"),
				Labels.getLabel("modificacionMasivaTarifasController.window.title"),
				Messagebox.YES | Messagebox.NO, Messagebox.QUESTION);

		if (opcao.equals(Messagebox.YES)) {

			InputStream isMExcel = mExcel.getStreamData();
			HSSFWorkbook wb = new HSSFWorkbook(isMExcel);

			for (int k = 0; k < wb.getNumberOfSheets(); k++) {

				Sheet sheet = wb.getSheetAt(k);
				int rows = sheet.getPhysicalNumberOfRows();

				for (int r = 0; r < rows; r++) {

					Row row = sheet.getRow(r);

					if (row == null || (row.getCell(0).getCellType() == Cell.CELL_TYPE_STRING && (row.getCell(0).getStringCellValue().startsWith("Linha") || row.getCell(0).getStringCellValue().isEmpty()))) {
						continue;
					}

					if (row.getCell(0).getCellType() == Cell.CELL_TYPE_STRING && row.getCell(0).getStringCellValue().equalsIgnoreCase("id")) {
						continue;
					}

					if (row.getCell(0).getCellType() == Cell.CELL_TYPE_BLANK) {
						continue;
					}

					if (componentePreco.equals(EnumTarifaPedagio.TARIFA.getDescricao())) {
						if (null == row.getCell(CELL_NOVO_PRECIO)) {
							continue;
						}
					} else if (componentePreco.equals(EnumTarifaPedagio.PEDAGIO.getDescricao())) {
						if (null == row.getCell(CELL_NOVO_PEAJE)) {
							continue;
						}
					} else if (componentePreco.equals(EnumTarifaPedagio.TX_EMBARQUE.getDescricao())) {
						if (null == row.getCell(CELL_NOVO_TX_EMBARQUE)) {
							continue;
						}
					} else if (componentePreco.equals(EnumTarifaPedagio.SEGURO.getDescricao())) {
						if (null == row.getCell(CELL_NOVO_SEGURO)) {
							continue;
						}
					}

					Cell cellIdTarifa = row.getCell(CELL_ID_TARIFA);
					BigDecimal bdId = new BigDecimal(cellIdTarifa.getNumericCellValue());
					Integer idTarifa = bdId.intValue();

					Tarifa tarifa = tarifaService.obtenerID(idTarifa);

					if (tarifa != null) {
						
						Tramo tramo = tarifa.getTramo();
						
						if (tramo != null) {
							
							Parada origem = tarifa.getTramo().getOrigem();
							Ciudad ciudad = origem.getCiudad();
							Plaza plaza = null;
							
							if (ciudad != null) {
								plaza = ciudad.getPlaza();
							}
							
							Parada destino = tarifa.getTramo().getDestino();
							ClaseServicio claseServicio = tarifa.getClaseServicio();
							Moneda moneda = tarifa.getMoneda();

							// verificando se a tarifa eh de um mercado competido:
							boolean existeMercadoCompetido = mercadoCompetidoService.existe(claseServicio, origem, destino);
							if (!existeMercadoCompetido) {
								try {
									Cell cellNovoPrecio = null;

									if (componentePreco.equals(EnumTarifaPedagio.TARIFA.getDescricao())) {
										cellNovoPrecio = row.getCell(CELL_NOVO_PRECIO);
									} else if (componentePreco.equals(EnumTarifaPedagio.PEDAGIO.getDescricao())) {
										cellNovoPrecio = row.getCell(CELL_NOVO_PEAJE);
									} else if (componentePreco.equals(EnumTarifaPedagio.TX_EMBARQUE.getDescricao())) {
										cellNovoPrecio = row.getCell(CELL_NOVO_TX_EMBARQUE);
									} else if (componentePreco.equals(EnumTarifaPedagio.SEGURO.getDescricao())) {
										cellNovoPrecio = row.getCell(CELL_NOVO_SEGURO);
									}

									BigDecimal novoPrecio = new BigDecimal(cellNovoPrecio.getNumericCellValue());
									novoPrecio = novoPrecio.setScale(2, RoundingMode.HALF_UP);

									Boolean podeSalvarTarifaMinima = tarifaService.podeAlterarTarifaMinima(tarifa, tarifa.getMarca(),
											origem, destino, claseServicio, plaza, moneda);

									if (podeSalvarTarifaMinima) {
										
										if (salvarNuevos) {
											
											Tarifa tarifaNueva = new Tarifa();

											tarifaNueva.setClaseServicio(tarifa.getClaseServicio());
											tarifaNueva.setMarca(tarifa.getMarca());
											tarifaNueva.setMoneda(tarifa.getMoneda());

											if (componentePreco.equals(EnumTarifaPedagio.TARIFA.getDescricao())) {
												tarifa.setPrecio(novoPrecio);
											} else if (componentePreco.equals(EnumTarifaPedagio.PEDAGIO.getDescricao())) {
												tarifa.setImportepedagio(novoPrecio);
											} else if (componentePreco.equals(EnumTarifaPedagio.TX_EMBARQUE.getDescricao())) {
												tarifa.setImportetaxaembarque(novoPrecio);
											} else if (componentePreco.equals(EnumTarifaPedagio.SEGURO.getDescricao())) {
												tarifa.setImporteseguro(novoPrecio);
											}

											tarifaNueva.setPreciooriginal(tarifa.getPreciooriginal());
											tarifaNueva.setPrecioredabierto(tarifa.getPrecioredabierto());
											tarifaNueva.setStatustarifa("A");
											tarifaNueva.setTramo(tarifa.getTramo());
											tarifaNueva.setRuta(tarifa.getRuta());
											tarifaNueva.setOrgaoConcedente(tarifa.getOrgaoConcedente());

											Comboitem cbiVt = cmbVigenciaTarifa.getSelectedItem();
											VigenciaTarifa nuevaVigencia;

											if(getRdVigenciaAtual().isChecked()) {
												tarifaNueva.setVigenciaTarifa(vigenciaTarifa);
												nuevaVigencia = vigenciaTarifa;
											} else {
												nuevaVigencia = (VigenciaTarifa) cbiVt.getValue();
												tarifaNueva.setVigenciaTarifa(nuevaVigencia);
											}
											
											boolean existeTarifa = tarifaService.existe(tarifaNueva.getMarca(), tarifaNueva.getTramo(), tarifaNueva.getMoneda(),
													tarifaNueva.getClaseServicio(), nuevaVigencia, tarifaNueva.getRuta(), tarifaNueva.getOrgaoConcedente());

											if (existeTarifa) {
												strDuplicidade = strDuplicidade + Labels.getLabel("modificacionMasivaTarifasController.MSG.tarifaExiste") + " (" + tarifa.getTarifaId() + "). \n";
											} else {
												tarifa = tarifaService.suscribir(tarifaNueva);
											}

										} else {
											
											if (componentePreco.equals(EnumTarifaPedagio.TARIFA.getDescricao())) {
												tarifa.setPrecio(novoPrecio);
											} else if (componentePreco.equals(EnumTarifaPedagio.PEDAGIO.getDescricao())) {
												tarifa.setImportepedagio(novoPrecio);
											} else if (componentePreco.equals(EnumTarifaPedagio.TX_EMBARQUE.getDescricao())) {
												tarifa.setImportetaxaembarque(novoPrecio);
											} else if (componentePreco.equals(EnumTarifaPedagio.SEGURO.getDescricao())) {
												tarifa.setImporteseguro(novoPrecio);
											}

											tarifa.setStatustarifa("A");

											tarifa = tarifaService.actualizacion(tarifa);
										}

										contador = contador + 1;
									} else {
										String strTmpTarifaMinima = "TARIFA MINIMA: \n"
												+ "Tarifa: " + tarifa.getTarifaId() + "; \n"
												+ "Tramo: " + tramo.getDesctramo() + "; \n"
												+ "Via: " + tramo.getVia() + "; \n"
												+ "Clase Servicio: " + claseServicio + "; \n"
												+ "Precio: " + tarifa.getPrecio().setScale(2).toString() + "\n";

										log.info(strTmpTarifaMinima);

										strTarifaMinima = strTarifaMinima + strTmpTarifaMinima;
									}
								} catch (IllegalStateException ex) {
									String strTmpErrorTarifa = "ERROR: formato nuevo precio." + ex + "\n"
											+ "Tarifa: " + tarifa.getTarifaId() + "; \n"
											+ "Tramo: " + tramo.getDesctramo() + "; \n"
											+ "Via: " + tramo.getVia() + "; \n"
											+ "Clase Servicio: " + claseServicio + "; \n"
											+ "Precio: " + tarifa.getPrecio().setScale(2).toString() + "\n";

									log.error(strTmpErrorTarifa);

									strErrorTarifa = strErrorTarifa + strTmpErrorTarifa;
								}
							} else {
								String strTmpMercadoCompetido = "MERCADO COMPETIDO: \n"
										+ "Tarifa: " + tarifa.getTarifaId() + "; \n"
										+ "Tramo: " + tramo.getDesctramo() + "; \n"
										+ "Via: " + tramo.getVia() + "; \n"
										+ "Clase Servicio: " + claseServicio + "; \n"
										+ "Precio: " + tarifa.getPrecio().setScale(2).toString() + "\n";

								log.info(strTmpMercadoCompetido);

								strMercadoCompetido = strMercadoCompetido + strTmpMercadoCompetido;
							}
						}
					}
				}
			}
		}

		if (opcao.equals(Messagebox.YES)) {
			Messagebox.show(
					Labels.getLabel("modificacionMasivaTarifasController.MSGAplicadoSucesso"),
					Labels.getLabel("modificacionMasivaTarifasController.window.title"),
					Messagebox.OK, Messagebox.INFORMATION);

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

			// Gravando no arquivo de retorno
			File fNomeArquivo = File.createTempFile(nomeArquivo, ".tmp");
			FileOutputStream fos = new FileOutputStream(fNomeArquivo);

			String texto = "" + contador + " "
					+ Labels.getLabel("modificacionMasivaTarifasController.MSG.RegistroSalvos") + "\n";

			if (!strTarifaMinima.isEmpty()) {
				texto = texto
						+ "---------- TARIFAS MINIMAS ----------\n"
						+ strTarifaMinima
						+ "\n-------------------------------------\n";
			}

			if (!strMercadoCompetido.isEmpty()) {
				texto = texto
						+ "--------- MERCADO COMPETIDO -----------\n"
						+ strMercadoCompetido
						+ "\n---------------------------------------\n";
			}

			if (!strErrorTarifa.isEmpty()) {
				texto = texto
						+ "--------------- ERRORS ----------------\n"
						+ strErrorTarifa
						+ "\n---------------------------------------";
			}
			if (!strDuplicidade.toString().isEmpty()) {
				log.debug(strDuplicidade);
				texto = texto
						+ "--------------- DUPLICADO ----------------\n"
						+ strDuplicidade
						+ "\n---------------------------------------";
			}

			fos.write(texto.getBytes());
			fos.close();

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

			fNomeArquivo.delete();

			closeWindow();
		}

	}

	public void vigenciaTarifa() throws IOException, InterruptedException {
		try {
			InputStream isMExcel = mExcel.getStreamData();
			HSSFWorkbook wb = new HSSFWorkbook(isMExcel);

			for (int k = 0; k < wb.getNumberOfSheets(); k++) {
				Sheet sheet = wb.getSheetAt(k);
				int rows = sheet.getPhysicalNumberOfRows();

				for (int r = 0; r < rows; r++) {
					Row row = sheet.getRow(r);

					if (row == null || (row.getCell(0).getCellType() == Cell.CELL_TYPE_STRING && (row.getCell(0).getStringCellValue().startsWith("Linha") || row.getCell(0).getStringCellValue().isEmpty()))) {
						continue;
					}

					if (row.getCell(0).getCellType() == Cell.CELL_TYPE_STRING && row.getCell(0).getStringCellValue().equalsIgnoreCase("id")) {
						continue;
					}

					if (row.getCell(0).getCellType() == Cell.CELL_TYPE_BLANK) {
						continue;
					}

					Cell cellIdTarifa = row.getCell(CELL_ID_TARIFA);

					BigDecimal bdId = new BigDecimal(cellIdTarifa.getNumericCellValue());
					Integer idTarifa = bdId.intValue();

					Tarifa tarifa = tarifaService.obtenerID(idTarifa);

					if (tarifa != null) {

						VigenciaTarifa v = tarifa.getVigenciaTarifa();
						vigenciaTarifa = tarifa.getVigenciaTarifa();
						lsVigenciaTarifa.remove(vigenciaTarifa);

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

						log.debug("Vigencia De: " + sf.format(v.getFeciniciovigencia()) + " até: " + sf.format(v.getFecfinvigencia()));

						rdVigenciaAtual.setLabel(Labels.getLabel("modificacionMasivaTarifasUploadController.MSG.radioUno",
								new Object[] { sf.format(v.getFeciniciovigencia()).concat(" ").concat(sf.format(v.getFecfinvigencia())) }));
					}
					break;
				}
			}
		} catch (Exception e) {
			log.error("Error ao inportar tarifas Excell", e);
			Messagebox.show(
					Labels.getLabel("modificacionMasivaTarifasUploadController.MSG.excel"),
					Labels.getLabel("modificacionMasivaTarifasController.window.title"),
					Messagebox.OK, Messagebox.ERROR);
			closeWindow();
		}
	}

	public List<VigenciaTarifa> getLsVigenciaTarifa() {
		return lsVigenciaTarifa;
	}

	public void setLsVigenciaTarifa(List<VigenciaTarifa> lsVigenciaTarifa) {
		this.lsVigenciaTarifa = lsVigenciaTarifa;
	}

	public Media getmExcel() {
		return mExcel;
	}

	public void setmExcel(Media mExcel) {
		this.mExcel = mExcel;
	}

	public Radio getRdVigenciaAtual() {
		return rdVigenciaAtual;
	}

	public void setRdVigenciaAtual(Radio rdVigenciaAtual) {
		this.rdVigenciaAtual = rdVigenciaAtual;
	}

	public Radio getRdVigenciaNueva() {
		return rdVigenciaNueva;
	}

	public void setRdVigenciaNueva(Radio rdVigenciaNueva) {
		this.rdVigenciaNueva = rdVigenciaNueva;
	}

	public Combobox getCmbVigenciaTarifa() {
		return cmbVigenciaTarifa;
	}

	public void setCmbVigenciaTarifa(Combobox cmbVigenciaTarifa) {
		this.cmbVigenciaTarifa = cmbVigenciaTarifa;
	}

	public Label getLbVigencia() {
		return lbVigencia;
	}

	public void setLbVigencia(Label lbVigencia) {
		this.lbVigencia = lbVigencia;
	}

	public Combobox getCmbComponentePreco() {
		return cmbComponentePreco;
	}

	public void setCmbComponentePreco(Combobox cmbComponentePreco) {
		this.cmbComponentePreco = cmbComponentePreco;
	}

	public List<String> getLsComponentePreco() {
		return lsComponentePreco;
	}

	public void setLsComponentePreco(List<String> lsComponentePreco) {
		this.lsComponentePreco = lsComponentePreco;
	}
}
