/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.rjconsultores.ventaboletos.web.utilerias.render;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.zkoss.util.resource.Labels;
import org.zkoss.zul.Listcell;
import org.zkoss.zul.Listitem;
import org.zkoss.zul.ListitemRenderer;

import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
import com.rjconsultores.ventaboletos.entidad.EsquemaCorrida;
import com.rjconsultores.ventaboletos.entidad.EsquemaTramo;
import com.rjconsultores.ventaboletos.entidad.ParadaEsquema;
import com.rjconsultores.ventaboletos.entidad.Tramo;
import com.rjconsultores.ventaboletos.entidad.TramoServicio;
import com.rjconsultores.ventaboletos.service.TramoServicioService;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.utilerias.StringHelper;

/**
 * 
 * @author Rafius
 */
public class RenderConfiguracionCorrida implements ListitemRenderer {

	private Integer[] posicoes = null;
	private SimpleDateFormat dt = new SimpleDateFormat("dd/MM/yy");
	
	private TramoServicioService tramoServicioService;
	
	public RenderConfiguracionCorrida(Integer[] posicoes, TramoServicioService tramoServicioService) {
		super();
		this.posicoes = posicoes;
		this.tramoServicioService = tramoServicioService;
	}
	
	public RenderConfiguracionCorrida() {
		super();
	}

	public void render(Listitem lstm, Object o) throws Exception {
		EsquemaCorrida corrida = (EsquemaCorrida) o;
		
		if(posicoes != null) {
			Listcell lc;
			
			for(Integer posicao : posicoes) {
				lc = buscarListCell(posicao, corrida);
				lc.setParent(lstm);
			}
			
		} else {
			Listcell lc = new Listcell(corrida.getEsquemacorridaId().toString());
			lc.setParent(lstm);
			
			lc = new Listcell(corrida.getNumCorrida().toString());
			lc.setParent(lstm);
			
			lc = new Listcell(dt.format(corrida.getEsquemaOperacional().getFecniciovigencia()));
			lc.setParent(lstm);
			
			lc = new Listcell(dt.format(corrida.getEsquemaOperacional().getFecfinvigencia()));
			lc.setParent(lstm);
			
			if (corrida.getHorasalida() == null) {
				lc = new Listcell("-");
				lc.setParent(lstm);
			} else {
				SimpleDateFormat hr = new SimpleDateFormat("HH:mm");
				lc = new Listcell(hr.format(corrida.getHorasalida()));
				lc.setParent(lstm);
			}
			// Ruta
			lc = new Listcell(corrida.getRuta().getDescruta() == null ? "-" : corrida.getRuta().getDescruta());
			lc.setParent(lstm);
			
			lc = new Listcell(corrida.getRuta().getNumRuta() == null ? "-" : corrida.getRuta().getNumRuta());
			lc.setParent(lstm);
			
			lc = new Listcell(corrida.getRuta().getIndSentidoIda() == true ? Labels.getLabel("editarCatalogoDeRutaController.radIda.value") : Labels.getLabel("editarCatalogoDeRutaController.radVolta.value"));
			lc.setParent(lstm);
			
			// Marca
			lc = new Listcell(corrida.getMarca().getDescmarca() == null ? "-" : corrida.getMarca().getDescmarca());
			lc.setParent(lstm);
			
			// Semana
			String l = (corrida.getIndlunes() == Boolean.TRUE) ? "S " : "- ";
			String ma = (corrida.getIndmartes() == Boolean.TRUE) ? "T " : "- ";
			String mi = (corrida.getIndmiercoles() == Boolean.TRUE) ? "Q " : "- ";
			String j = (corrida.getIndjueves() == Boolean.TRUE) ? "Q " : "- ";
			String v = (corrida.getIndviernes() == Boolean.TRUE) ? "S " : "- ";
			String s = (corrida.getIndsabado() == Boolean.TRUE) ? "S " : "- ";
			String d = (corrida.getInddomingo() == Boolean.TRUE) ? "D " : "- ";
			
			lc = new Listcell(l + ma + mi + j + v + s + d);
			lc.setParent(lstm);
			
			// Clase
			try {
				lc = new Listcell(corrida.getClaseServicio().getDescclase() == null ? "-" : corrida.getClaseServicio().getDescclase());
				lc.setParent(lstm);
			} catch (Exception e) {
				lc = new Listcell("-");
				lc.setParent(lstm);
			}
			
			// EmpC
			try {
				lc = new Listcell(corrida.getEmpresa().getNombempresa() == null ? "-" : corrida.getEmpresa().getNombempresa());
				lc.setParent(lstm);
			} catch (Exception e) {
				lc = new Listcell("-");
				lc.setParent(lstm);
			}
			
			// EmpI
			try {
				lc = new Listcell(corrida.getEmpresa1().getNombempresa() == null ? "-" : corrida.getEmpresa1().getNombempresa());
				lc.setParent(lstm);
			} catch (Exception e) {
				lc = new Listcell("-");
				lc.setParent(lstm);
			}
			
			// RolOperativo
			try {
				lc = new Listcell(corrida.getRolOperativo().getDescroloperativo() == null ? "-" : corrida.getRolOperativo().getDescroloperativo());
				lc.setParent(lstm);
			} catch (Exception e) {
				lc = new Listcell("-");
				lc.setParent(lstm);
			}
			
			// Status
			if (corrida.getStatusCorrida() == null) {
				lc = new Listcell("-");
				lc.setParent(lstm);
			} else if (corrida.getStatusCorrida().equals("L")) {
				lc = new Listcell("LATENTE");
				lc.setParent(lstm);
			} else if (corrida.getStatusCorrida().equals("A")) {
				lc = new Listcell("AUTORIZADA");
				lc.setParent(lstm);
			} else {
				lc = new Listcell("CANCELADA");
				lc.setParent(lstm);
			}
		}
		
		lstm.setAttribute("data", corrida);

	}

	private Listcell buscarListCell(Integer posicao, EsquemaCorrida corrida) {
		Listcell lc = null;
		
		switch (posicao) {
		case 1:
			lc = new Listcell(corrida.getEsquemacorridaId().toString());
			break;
		
		case 2:
			lc = new Listcell(corrida.getNumCorrida().toString());
			break;
		
		case 3:
			lc = new Listcell(dt.format(corrida.getEsquemaOperacional().getFecniciovigencia()));
			break;
		
		case 4:
			lc = new Listcell(dt.format(corrida.getEsquemaOperacional().getFecfinvigencia()));
			break;
		
		case 5:
			if (corrida.getHorasalida() == null) {
				lc = new Listcell("-");
			} else {
				SimpleDateFormat hr = new SimpleDateFormat("HH:mm");
				lc = new Listcell(hr.format(corrida.getHorasalida()));
			}
			break;
			
		case 6:
			// Ruta
			lc = new Listcell(corrida.getRuta().getDescruta() == null ? "-" : corrida.getRuta().getDescruta());
			break;
			
		case 7:
			lc = new Listcell(corrida.getRuta().getNumRuta() == null ? "-" : corrida.getRuta().getNumRuta());
			break;
		
		case 8:
			lc = new Listcell(corrida.getRuta().getIndSentidoIda() == true ? Labels.getLabel("editarCatalogoDeRutaController.radIda.value") : Labels.getLabel("editarCatalogoDeRutaController.radVolta.value"));
			break;
			
		case 9:
			// Marca
			lc = new Listcell(corrida.getMarca().getDescmarca() == null ? "-" : corrida.getMarca().getDescmarca());
			break;
		
		case 10:
			// Semana
			String l = (corrida.getIndlunes() == Boolean.TRUE) ? "S " : "- ";
			String ma = (corrida.getIndmartes() == Boolean.TRUE) ? "T " : "- ";
			String mi = (corrida.getIndmiercoles() == Boolean.TRUE) ? "Q " : "- ";
			String j = (corrida.getIndjueves() == Boolean.TRUE) ? "Q " : "- ";
			String v = (corrida.getIndviernes() == Boolean.TRUE) ? "S " : "- ";
			String s = (corrida.getIndsabado() == Boolean.TRUE) ? "S " : "- ";
			String d = (corrida.getInddomingo() == Boolean.TRUE) ? "D " : "- ";
			
			lc = new Listcell(l + ma + mi + j + v + s + d);
			break;
			
		case 11:
			// Clase
			try {
				lc = new Listcell(corrida.getClaseServicio().getDescclase() == null ? "-" : corrida.getClaseServicio().getDescclase());
			} catch (Exception e) {
				lc = new Listcell("-");
			}
			break;
			
		case 12:
			// EmpC
			try {
				lc = new Listcell(corrida.getEmpresa().getNombempresa() == null ? "-" : corrida.getEmpresa().getNombempresa());
			} catch (Exception e) {
				lc = new Listcell("-");
			}
			break;
			
		case 13:
			// EmpI
			try {
				lc = new Listcell(corrida.getEmpresa1().getNombempresa() == null ? "-" : corrida.getEmpresa1().getNombempresa());
			} catch (Exception e) {
				lc = new Listcell("-");
			}
			break;
			
		case 14:
			// RolOperativo
			try {
				lc = new Listcell(corrida.getRolOperativo().getDescroloperativo() == null ? "-" : corrida.getRolOperativo().getDescroloperativo());
			} catch (Exception e) {
				lc = new Listcell("-");
			}
			break;
			
		case 15:
			// Status
			if (corrida.getStatusCorrida() == null) {
				lc = new Listcell("-");
			} else if (corrida.getStatusCorrida().equals("L")) {
				lc = new Listcell("LATENTE");
			} else if (corrida.getStatusCorrida().equals("A")) {
				lc = new Listcell("AUTORIZADA");
			} else {
				lc = new Listcell("CANCELADA");
			}
			break;
		
		case 16:
			// hora de chegada
			Date horaSaida = corrida.getHorasalida();

			if(horaSaida == null) {
				lc = new Listcell("");
			} else {
				List<EsquemaTramo> lsEsquemaTramo = corrida.getEsquemaTramoList();
				
				//Colocar em ordem de sequencia
				Collections.sort(lsEsquemaTramo);
				ClaseServicio clase = corrida.getClaseServicio();
				
				Calendar c = Calendar.getInstance();
				c.setTime(horaSaida);

				long minutosPartida = c.get(Calendar.MINUTE);
				int horaPartida = c.get(Calendar.HOUR_OF_DAY);
				
				Long tempoLocalidade = 0l;
				for (int i = 0; i < lsEsquemaTramo.size(); i++) {
					EsquemaTramo rs = lsEsquemaTramo.get(i);
					
					if(!rs.getActivo()) {
						continue;
					}
					
					Tramo tramo = rs.getTramo();
					Date tiempoEstancia = null;
					if ((i != 0) && (i != (lsEsquemaTramo.size()))) {
						tiempoEstancia = lsEsquemaTramo.get(i).getTiempoEstancia();
					}

					Date excepcionRecorrido = null;
					if (i != (lsEsquemaTramo.size())) {
						excepcionRecorrido = lsEsquemaTramo.get(i).getExcepcionRecorrido();
					}
					
					Date defautRecorrido = null;
					if (clase != null) {
						List<TramoServicio> lsTramoServicio = tramoServicioService.buscarPorTramoServico(tramo, clase);

						if (i != (lsEsquemaTramo.size())) {
							if (!lsTramoServicio.isEmpty()) {
								// soh eh permitido gravar um por classe, get(0):
								defautRecorrido = lsTramoServicio.get(0).getTiemporecorrido();
							}
						}
					}
					
					Long tempoPadrao = 0l;
					Long tempoParada = 0l;
					
					if (excepcionRecorrido != null) {
						tempoPadrao = getMinutos(excepcionRecorrido);
					} else {
						if (defautRecorrido != null) {
							tempoPadrao = getMinutos(defautRecorrido);
						}
					}
					if (tiempoEstancia != null) {
						tempoParada = getMinutos(tiempoEstancia);
					}
					tempoLocalidade += (tempoPadrao + tempoParada);
				}
				
				int horasLocalidade = (tempoLocalidade.intValue() / 60) + horaPartida;
				long minutosLocalidade = (tempoLocalidade % 60) + minutosPartida;
				
				while(minutosLocalidade >= 60){
					horasLocalidade +=1;
					minutosLocalidade -= 60;
				}
				while(horasLocalidade >= 24){
					horasLocalidade -= 24;
				}
				if(horasLocalidade == 0 && minutosLocalidade == 0l){
					lc = new Listcell("");
				}else{
					String sMinutos = String.valueOf(minutosLocalidade);
					lc = new Listcell(horasLocalidade + ":" + StringHelper.preencherZeroEsquerda(sMinutos, 2));
				}
			}
			break;

		default:
			break;
		}
		
		return lc;
	}
	
	private Long getMinutos(Date data){
		Calendar c = Calendar.getInstance();
		c.setTime(data);
		return DateUtil.getElapsedMinutos(DateUtil.getFecInicio().getTime(), c.getTime());
	}
}
