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.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.hibernate.annotations.Where;

@Entity
@SequenceGenerator(name = "CASETA_PEAJE_SEQ", sequenceName = "CASETA_PEAJE_SEQ", allocationSize = 1)
@Table(name = "CASETA_PEAJE")
public class CasetaPeaje implements Serializable, Comparable<CasetaPeaje>, Cloneable {
	
	private static final long serialVersionUID = 1L;
	@Id
	@Basic(optional = false)
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "CASETA_PEAJE_SEQ")
	@Column(name = "CASETAPEAJE_ID")
	private Integer casetaPeajeId;
	@Column(name = "DESCCASETA")
	private String desccaseta;
	@Column(name = "IMPORTEIDA")
    private BigDecimal importeIda;
	@Column(name = "IMPORTEVUELTA")
    private BigDecimal importeVuelta;
	@Column(name = "ACTIVO")
	private Boolean activo;
	@Column(name = "FECMODIF")
	@Temporal(TemporalType.TIMESTAMP)
	private Date fecmodif;
	@Column(name = "USUARIO_ID")
	private Integer usuarioId;
	@OneToMany(mappedBy = "casetaPeaje", fetch=FetchType.EAGER, cascade=CascadeType.ALL)
    @Where(clause="ACTIVO=1")
	@Fetch(value = FetchMode.SELECT)
    private List<CasetaPeajeExcepcion> lsCasetaPeajeExcepcion = new ArrayList<CasetaPeajeExcepcion>();	
	@ManyToMany(fetch=FetchType.EAGER)
	@JoinTable(name = "RUTA_CASETA", joinColumns = { @JoinColumn(name = "CASETAPEAJE_ID") },
	inverseJoinColumns = { @JoinColumn(name = "RUTASECUENCIA_ID") })
    private List<RutaSecuencia> lsRutaSecuencia;
	
	@OneToMany(mappedBy = "pracaPedagioId", cascade=CascadeType.ALL)
	@LazyCollection(LazyCollectionOption.FALSE)
	@Where(clause="ACTIVO=1")
    private List<PrecioFixoPedagio> lsPrecoFixoPedagio;
	

    @Override
    public int hashCode() {
    	int hash = 0;
    	hash += casetaPeajeId != null ? casetaPeajeId.hashCode() : 0;
    	return hash;
    }
    
    @Override
    public boolean equals(Object object) {
        if (!(object instanceof CasetaPeaje)) {
            return false;
        }
        CasetaPeaje other = (CasetaPeaje) object;
        if ((this.casetaPeajeId == null && other.casetaPeajeId != null) || (this.casetaPeajeId != null && !this.casetaPeajeId.equals(other.casetaPeajeId))) {
            return false;
        }
        return true;
    }
    
    public CasetaPeaje(){
    	lsRutaSecuencia = new ArrayList<RutaSecuencia>();
    }
    
	public Integer getCasetaPeajeId() {
		return casetaPeajeId;
	}
	public void setCasetaPeajeId(Integer casetaPeajeId) {
		this.casetaPeajeId = casetaPeajeId;
	}
	public String getDesccaseta() {
		return desccaseta;
	}
	public void setDesccaseta(String desccaseta) {
		this.desccaseta = desccaseta;
	}
	public BigDecimal getImporteIda() {
		return importeIda;
	}
	public void setImporteIda(BigDecimal importeIda) {
		this.importeIda = importeIda;
	}
	public BigDecimal getImporteVuelta() {
		return importeVuelta;
	}
	public void setImporteVuelta(BigDecimal importeVuelta) {
		this.importeVuelta = importeVuelta;
	}
	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;
	}
	
	@Override
    public String toString() {
        return getCasetaPeajeId() + " - " +getDesccaseta();
    }
	
	@Override
	public int compareTo(CasetaPeaje caseta) {
		return this.getDesccaseta().compareTo(caseta.getDesccaseta());
	}

	public List<RutaSecuencia> getLsRutaSecuencia() {
		return lsRutaSecuencia;
	}

	public void setLsRutaSecuencia(List<RutaSecuencia> lsRutaSecuencia) {
		this.lsRutaSecuencia = lsRutaSecuencia;
	}

	public List<CasetaPeajeExcepcion> getLsCasetaPeajeExcepcion() {
		return lsCasetaPeajeExcepcion;
	}

	public void setLsCasetaPeajeExcepcion(List<CasetaPeajeExcepcion> lsCasetaPeajeExcepcion) {
		this.lsCasetaPeajeExcepcion = lsCasetaPeajeExcepcion;
	}

	public List<PrecioFixoPedagio> getLsPrecoFixoPedagio() {
		return lsPrecoFixoPedagio;
	}

	public void setLsPrecoFixoPedagio(List<PrecioFixoPedagio> lsPrecoFixoPedagio) {
		this.lsPrecoFixoPedagio = lsPrecoFixoPedagio;
	}	
	
	
}