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

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 *
 * @author Rafius
 */
@Entity
@SequenceGenerator(name = "RUTA_SECUENCIA_SEQ", sequenceName = "RUTA_SECUENCIA_SEQ", allocationSize=1)
@Table(name = "RUTA_SECUENCIA")
public class RutaSecuencia implements Serializable, Cloneable {

    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "RUTA_SECUENCIA_SEQ")
    @Column(name = "RUTASECUENCIA_ID")
    private Integer rutasecuenciaId;
    @Column(name = "NUMSECUENCIA")
    private Short numsecuencia;
    @Column(name = "ACTIVO")
    private Boolean activo;
    @Column(name = "FECMODIF")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fecmodif;
    @Column(name = "USUARIO_ID")
    private Integer usuarioId;
    @JoinColumn(name = "TRAMO_ID", referencedColumnName = "TRAMO_ID")
    @ManyToOne
    private Tramo tramo;
    @JoinColumn(name = "RUTA_ID", referencedColumnName = "RUTA_ID")
    @ManyToOne
    private Ruta ruta;
    @Column(name = "KMORIGINAL")
    private BigDecimal kmOriginal;
    
    @OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL)
	@JoinColumn(name = "RUTASECUENCIA_ID")
    private List<RutaCaseta> lsRutaCase;

    @Column(name = "CANTKMENTRADASAIDA")
    private BigDecimal cantKmEntradaSaida;
    
    public RutaSecuencia() {
    	this.kmOriginal = BigDecimal.ZERO;
    }

    public static RutaSecuencia clone(RutaSecuencia other){
    	List<RutaCaseta> rutasCaseta = new ArrayList<RutaCaseta>();
    	RutaSecuencia rsnew = new RutaSecuencia();
		rsnew.setActivo(other.activo);
		rsnew.setFecmodif(other.fecmodif);
		rsnew.setNumsecuencia(other.numsecuencia);
		rsnew.setRuta(other.ruta);
		rsnew.setRutasecuenciaId(other.rutasecuenciaId);
		rsnew.setTramo(other.tramo);
		rsnew.setUsuarioId(other.usuarioId);
		rsnew.setCantKmEntradaSaida(other.cantKmEntradaSaida);
		rsnew.setKmOriginal(other.kmOriginal);
		
		for (RutaCaseta rc : other.getLsRutaCase()){
			RutaCaseta rutaCaseta = new RutaCaseta();
			rutaCaseta.setRutaSecuencia(rsnew);
			rutaCaseta.setCasetaPeaje(rc.getCasetaPeaje());		
			rutaCaseta.setActivo(Boolean.TRUE);
			rutaCaseta.setFecmodif(new Date());
			rutaCaseta.setUsuarioId(other.usuarioId);
			rutasCaseta.add(rutaCaseta);
		}
		rsnew.setLsRutaCase(rutasCaseta);
		return rsnew;
    }
    
    public boolean tieneOrigen(Integer origenId){
		return tramo.getOrigem().getParadaId().equals(origenId);
	}
	
	public boolean tieneDestino(Integer destinoId){
		return tramo.getDestino().getParadaId().equals(destinoId);
	}

    public RutaSecuencia(Integer rutasecuenciaId) {
        this.rutasecuenciaId = rutasecuenciaId;
    }

    public Integer getRutasecuenciaId() {
        return rutasecuenciaId;
    }

    public void setRutasecuenciaId(Integer rutasecuenciaId) {
        this.rutasecuenciaId = rutasecuenciaId;
    }

    public Short getNumsecuencia() {
        return numsecuencia;
    }

    public void setNumsecuencia(Short numsecuencia) {
        this.numsecuencia = numsecuencia;
    }

    public Boolean getActivo() {
        return activo;
    }

    public void setActivo(Boolean activo) {
        this.activo = activo;
    }

    public Date getFecmodif() {
        return fecmodif;
    }

    public void setFecmodif(Date fecmodif) {
        this.fecmodif = fecmodif;
    }

    public Integer getUsuarioId() {
        return usuarioId;
    }

    public void setUsuarioId(Integer usuarioId) {
        this.usuarioId = usuarioId;
    }

    public Tramo getTramo() {
        return tramo;
    }

    public void setTramo(Tramo tramo) {
        this.tramo = tramo;
    }

    public Ruta getRuta() {
        return ruta;
    }

    public void setRuta(Ruta ruta) {
        this.ruta = ruta;
    }

	public List<RutaCaseta> getLsRutaCase() {
		return lsRutaCase;
	}

	public void setLsRutaCase(List<RutaCaseta> lsRutaCase) {
		this.lsRutaCase = lsRutaCase;
	}

	public BigDecimal getCantKmEntradaSaida() {
		return cantKmEntradaSaida;
	}

	public void setCantKmEntradaSaida(BigDecimal cantKmEntradaSaida) {
		this.cantKmEntradaSaida = cantKmEntradaSaida;
	}

	

	public BigDecimal getKmOriginal() {
		return kmOriginal;
	}

	public void setKmOriginal(BigDecimal kmOriginal) {
		this.kmOriginal = kmOriginal;
	}

	@Override
    public int hashCode() {
        int hash = 0;
        hash += (rutasecuenciaId != null ? rutasecuenciaId.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof RutaSecuencia)) {
            return false;
        }
        RutaSecuencia other = (RutaSecuencia) object;
        if ((this.rutasecuenciaId == null && other.rutasecuenciaId != null) || (this.rutasecuenciaId != null && !this.rutasecuenciaId.equals(other.rutasecuenciaId))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "com.rjconsultores.ventaboletos.entidad.RutaSecuencia[rutasecuenciaId=" + rutasecuenciaId + "]";
    }
}
