package com.rjconsultores.ventaboletos.vo.esquemaoperacional;

import java.math.BigDecimal;

import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.Via;
import com.rjconsultores.ventaboletos.utilerias.HoraSistema;

public class SecuenciaRutaTramoVO implements Comparable<SecuenciaRutaTramoVO>{

	private Parada origen;
	private Parada destino;
	private Via via;
	private Integer secuencia;
	private BigDecimal kmReal;
	private BigDecimal kmSaidaOrigen;
	private BigDecimal kmEntradaDestino;
	private HoraSistema tiempoRecorrido;
	private Integer tramoId;
	private Integer tramoServicioId;
	private Boolean indSentidoIda;
	private String numRuta;

	public SecuenciaRutaTramoVO(Parada origen, Parada destino, Via via, Integer secuencia, BigDecimal kmReal, HoraSistema tiempoRecorrido) {
		super();
		this.origen = origen;
		this.destino = destino;
		this.via = via;
		this.secuencia = secuencia;
		this.kmReal = kmReal;
		this.setTiempoRecorrido(tiempoRecorrido);
	}

	public SecuenciaRutaTramoVO(Parada origen, Parada destino, Via via, Integer secuencia, BigDecimal kmReal, HoraSistema tiempoRecorrido, String numruta, Boolean indSentidoIda) {
		this(origen, destino, via, secuencia, kmReal, tiempoRecorrido);
		this.numRuta = numruta;
		this.indSentidoIda = indSentidoIda;
	}
	
	public SecuenciaRutaTramoVO(Parada origen, Parada destino, Via via, Integer secuencia, BigDecimal kmReal, HoraSistema tiempoRecorrido, String numruta, Boolean indSentidoIda, BigDecimal kmSaidaOrigen) {
		this(origen, destino, via, secuencia, kmReal, tiempoRecorrido);
		this.numRuta = numruta;
		this.indSentidoIda = indSentidoIda;
		this.kmSaidaOrigen = kmSaidaOrigen;
	}

	public SecuenciaRutaTramoVO(Parada origen, Parada destino, Integer secuencia, Via via) {
		super();
		this.origen = origen;
		this.destino = destino;
		this.secuencia = secuencia;
		this.via = via;
		this.setTiempoRecorrido(null);
	}

	public SecuenciaRutaTramoVO(Parada origen, Parada destino, Integer secuencia, Via via, String numruta, Boolean indSentidoIda) {
		this(origen, destino, secuencia, via);
		this.numRuta = numruta;
		this.indSentidoIda = indSentidoIda;
	}

	public SecuenciaRutaTramoVO(Parada origen, Parada destino, Via via, Integer secuencia, BigDecimal kmReal,
			HoraSistema tiempoRecorrido, Integer tramoId, Integer tramoServicioId) {
		super();
		this.origen = origen;
		this.destino = destino;
		this.via = via;
		this.secuencia = secuencia;
		this.kmReal = kmReal;
		this.setTiempoRecorrido(tiempoRecorrido);
		this.tramoId = tramoId;
		this.tramoServicioId = tramoId;
	}

	public SecuenciaRutaTramoVO(Parada origen, Parada destino, Via via, Integer secuencia, BigDecimal kmReal,
			HoraSistema tiempoRecorrido, Integer tramoId, Integer tramoServicioId, String numruta, Boolean indSentidoIda) {
		this(origen, destino, via, secuencia, kmReal, tiempoRecorrido, tramoId, tramoServicioId);
		this.numRuta = numruta;
		this.indSentidoIda = indSentidoIda;
	}
	
	public SecuenciaRutaTramoVO(Parada origen, Parada destino, Via via, Integer secuencia, BigDecimal kmReal,
			HoraSistema tiempoRecorrido, Integer tramoId, Integer tramoServicioId, String numruta, Boolean indSentidoIda, BigDecimal kmSaidaOrigen) {
		this(origen, destino, via, secuencia, kmReal, tiempoRecorrido, tramoId, tramoServicioId);
		this.numRuta = numruta;
		this.indSentidoIda = indSentidoIda;
		this.kmSaidaOrigen = kmSaidaOrigen;
	}

	public Parada getOrigen() {
		return origen;
	}

	public void setOrigen(Parada origen) {
		this.origen = origen;
	}

	public Parada getDestino() {
		return destino;
	}

	public HoraSistema getTiempoRecorrido() {
		return tiempoRecorrido;
	}

	public void setTiempoRecorrido(HoraSistema tiempoRecorrido) {
		if (tiempoRecorrido == null) {
			tiempoRecorrido = new HoraSistema();
		}
		this.tiempoRecorrido = tiempoRecorrido;
	}

	public void setDestino(Parada destino) {
		this.destino = destino;
	}

	public Via getVia() {
		return via;
	}

	public void setVia(Via via) {
		this.via = via;
	}

	public Integer getSecuencia() {
		return secuencia;
	}

	public void setSecuencia(Integer secuencia) {
		this.secuencia = secuencia;
	}

	public BigDecimal getKmReal() {
		return kmReal;
	}

	public void setKmReal(BigDecimal kmReal) {
		this.kmReal = kmReal;
	}

	public Integer getTramoId() {
		return tramoId;
	}

	public void setTramoId(Integer tramoId) {
		this.tramoId = tramoId;
	}

	public Integer getTramoServicioId() {
		return tramoServicioId;
	}

	public void setTramoServicioId(Integer tramoServicioId) {
		this.tramoServicioId = tramoServicioId;
	}

	public Boolean getIndSentidoIda() {
		return indSentidoIda;
	}

	public void setIndSentidoIda(Boolean indSentidoIda) {
		this.indSentidoIda = indSentidoIda;
	}

	public String getNumRuta() {
		return numRuta;
	}

	public void setNumRuta(String numRuta) {
		this.numRuta = numRuta;
	}
	
	public BigDecimal getKmSaidaOrigen() {
		return kmSaidaOrigen;
	}

	public void setKmSaidaOrigen(BigDecimal kmSaidaOrigen) {
		this.kmSaidaOrigen = kmSaidaOrigen;
	}

	@Override
	public String toString() {
		HoraSistema hora = getTiempoRecorrido();

		return secuencia + ";" + origen + ";" + destino + ";" + via + ";" + kmReal + ";"
				+ ((hora != null) ? hora.getHora() : "-") + ";" + ((hora != null) ? hora.getMinuto() : "-");
	}

	@Override
	public int compareTo(SecuenciaRutaTramoVO o) {
		return this.getSecuencia().compareTo(o.getSecuencia());
	}

	/**
	 * @return the kmEntradaDestino
	 */
	public BigDecimal getKmEntradaDestino() {
		return kmEntradaDestino;
	}
	
	/**
	 * método retorna valor de km sem considerar a distancia de entrada e saída da localidade.
	 * 
	 * @return
	 */
	public BigDecimal getKmOriginal() {
		return kmReal.subtract(kmEntradaDestino == null ? BigDecimal.ZERO : kmEntradaDestino).subtract(kmSaidaOrigen == null ? BigDecimal.ZERO : kmSaidaOrigen);
	}
	
	/**
	 * método retorna valor de km sem considerar a distancia de entrada e saída da localidade.
	 * 
	 * @return
	 */
	public BigDecimal getKmEntradaSaida() {
		return (kmEntradaDestino == null ? BigDecimal.ZERO : kmEntradaDestino).add(kmSaidaOrigen == null ? BigDecimal.ZERO : kmSaidaOrigen);
	}

	/**
	 * @param kmEntradaDestino the kmEntradaDestino to set
	 */
	public void setKmEntradaDestino(BigDecimal kmEntradaDestino) {
		this.kmEntradaDestino = kmEntradaDestino;
	}
}
