/*
 * 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.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.hibernate.annotations.NotFound;
import org.hibernate.annotations.NotFoundAction;

import com.rjconsultores.ventaboletos.utilerias.DateUtil;

/**
 * 
 * @author Rafius
 */
@Entity
@Table(name = "CORRIDA")
public class Corrida implements Serializable {

	private static final long serialVersionUID = 1L;

	@Embeddable
	public static class Id implements Serializable {

		private static final long serialVersionUID = 1L;
		@Column(name = "CORRIDA_ID")
		private Integer corridaId;
		@Column(name = "FECCORRIDA")
		@Temporal(TemporalType.DATE)
		private Date feccorrida;

		public Id() {
		}
		
		public Id(Integer corridaId, Date feccorrida) {
			this.corridaId = corridaId;
			this.feccorrida = feccorrida;
		}

		public Integer getCorridaId() {
			return corridaId;
		}

		public void setCorridaId(Integer corridaId) {
			this.corridaId = corridaId;
		}

		public Date getFeccorrida() {
			return feccorrida;
		}

		public void setFeccorrida(Date feccorrida) {
			this.feccorrida = feccorrida;
		}

		@Override
		public String toString() {
			SimpleDateFormat sf = new SimpleDateFormat("dd/MM HH:mm");
			return corridaId + " Hora:" + sf.format(feccorrida);
		}

		@Override
		public int hashCode() {
			final int prime = 31;
			int result = 1;
			result = prime * result + ((corridaId == null) ? 0 : corridaId.hashCode());
			result = prime * result + ((feccorrida == null) ? 0 : feccorrida.hashCode());
			return result;
		}

		@Override
		public boolean equals(Object obj) {
			if (this == obj)
				return true;
			if (obj == null)
				return false;
			if (getClass() != obj.getClass())
				return false;
			Id other = (Id) obj;
			if (corridaId == null) {
				if (other.corridaId != null)
					return false;
			} else if (!corridaId.equals(other.corridaId))
				return false;
			if (feccorrida == null) {
				if (other.feccorrida != null)
					return false;
			} else if (!feccorrida.equals(other.feccorrida))
				return false;
			return true;
		}
	}

	@EmbeddedId
	private Id id = new Id();
	@Column(name = "FECHORSALIDA")
	@Temporal(TemporalType.TIMESTAMP)
	private Date fechorsalida;
	@Column(name = "INDSTATUSCORRIDA")
	private String indstatuscorrida;
	@Column(name = "FECHORTARJETAVIAJE")
	@Temporal(TemporalType.TIMESTAMP)
	private Date fechortarjetaviaje;
	@Column(name = "ACTIVO")
	private Integer activo;
	@Column(name = "FECMODIF")
	@Temporal(TemporalType.TIMESTAMP)
	private Date fecmodif;
	@Column(name = "USUARIO_ID")
	private Integer usuarioId;
	@ManyToOne
	@JoinColumn(name = "AUTOBUS_ID", referencedColumnName = "AUTOBUS_ID")
	private Autobus autobus;
	@JoinColumn(name = "CLASESERVICIO_ID", referencedColumnName = "CLASESERVICIO_ID")
	@ManyToOne
	private ClaseServicio claseServicio;
	@JoinColumn(name = "CONDUCTOR1_ID", referencedColumnName = "CONDUCTOR_ID")
	@ManyToOne
	private Conductor conductor;
	@JoinColumn(name = "CONDUCTOR2_ID", referencedColumnName = "CONDUCTOR_ID")
	@ManyToOne
	private Conductor conductor1;
	@JoinColumn(name = "CORRIDA_ID", referencedColumnName = "CORRIDA_ID", insertable = false, updatable = false)
	@ManyToOne(optional = false)
	private CorridaCtrl corridaCtrl;
	@OneToMany(mappedBy = "corrida", cascade = CascadeType.ALL)
	private List<CorridaTramo> corridaTramoList;
	@JoinColumn(name = "EMPRESACORRIDA_ID", referencedColumnName = "EMPRESA_ID")
	@ManyToOne
	private Empresa empresa;
	@JoinColumn(name = "EMPRESAINGRESO_ID", referencedColumnName = "EMPRESA_ID")
	@ManyToOne
	private Empresa empresa1;
	@JoinColumn(name = "MARCA_ID", referencedColumnName = "MARCA_ID")
	@ManyToOne
	private Marca marca;
	@JoinColumn(name = "NODO_ID", referencedColumnName = "NODO_ID")
	@ManyToOne
	private Nodo nodo;
	@JoinColumn(name = "ORIGEN_ID", referencedColumnName = "PARADA_ID")
	@ManyToOne
	private Parada origem;
	@JoinColumn(name = "DESTINO_ID", referencedColumnName = "PARADA_ID")
	@ManyToOne
	private Parada destino;
	@JoinColumn(name = "RUTA_ID", referencedColumnName = "RUTA_ID")
	@ManyToOne
	private Ruta ruta;
	@JoinColumn(name = "ZONA_ID", referencedColumnName = "ZONA_ID")
	@ManyToOne
	private Zona zona;
	@OneToOne
	@JoinColumn(name = "ROLOPERATIVO_ID")
	private RolOperativo rolOperativo;
	@Column(name = "CANTPARADOS")
	private Short cantParados;
	@Column(name = "TIPOSERVICIO_ID")
	private Short tipoServicio;
	@Column(name = "fechorsalidaoriginal")
	@Temporal(javax.persistence.TemporalType.TIMESTAMP)
	private Date fechorSalidaOriginal;
	@OneToOne
	@NotFound(action = NotFoundAction.IGNORE)
	@JoinColumn(name = "esquemacorrida_id", referencedColumnName = "esquemacorrida_id")
	private EsquemaCorrida esquemaCorrida;
	@Column(name = "indtipoventa")
	private String indTipoVenta;
	@Column(name = "EQUIVALENCIA_ID")
	private String equivalenciaId;
	@ManyToOne
	@JoinColumns({
			@JoinColumn(name = "CORRIDAREBOTE_ID", referencedColumnName = "CORRIDA_ID"),
			@JoinColumn(name = "FECCORRIDAREBOTE", referencedColumnName = "FECCORRIDA") })
	@NotFound(action = NotFoundAction.IGNORE)
	private Corrida corridaRebote;
	@ManyToOne
	@JoinColumns({
			@JoinColumn(name = "CORRIDA2_ID", referencedColumnName = "CORRIDA_ID"),
			@JoinColumn(name = "FECCORRIDA2", referencedColumnName = "FECCORRIDA") })
	@NotFound(action = NotFoundAction.IGNORE)
	private Corrida corridaPiso;
	@JoinColumn(name = "DIVISIONINGRESO_ID", referencedColumnName = "DIVISION_ID")
	@ManyToOne
	private Division division;
	@Column(name = "NUMPISO")
	private Integer numPiso;

	@Column(name = "fechorsalidaoriginalh")
	@Temporal(javax.persistence.TemporalType.TIMESTAMP)
	private Date fechorSalidaOriginalH;
	
	@Column(name = "ESQUEMAAGRUPACION_ID")
	private Integer esquemaAgrupacionId;
	
	@Column(name = "CODPRODUTOFISCAL")
	private String codProdutoFiscal;
	
	@Column(name = "INFOCORRIDA")
	private String infoCorrida;
	
	@Column(name = "ISFLEXBUS")
	private Boolean isFlexBus;
	
	@Column(name = "STATUSFLEXBUS")
	private Integer statusFlexBus;
	
	@Column(name = "OCUPACAO_MINIMA")
	private Integer ocupacaoMinima;
	
	@Column(name = "HORAS_CONFIRMACAO")
	private Integer horasParaConfirmacao;
	
	@Column(name = "MINUTOS_CONFIRMACAO")
	private Integer minutosParaConfirmacao;
	
	@Column(name = "USUARIOFLEXBUS_ID")
	private Integer usuarioFlexBusId;

	public String getIndTipoVenta() {
		return indTipoVenta;
	}

	public void setIndTipoVenta(String indTipoVenta) {
		this.indTipoVenta = indTipoVenta;
	}

	public Date getFechorSalidaOriginal() {
		return fechorSalidaOriginal;
	}

	public void setFechorSalidaOriginal(Date fechorSalidaOriginal) {
		if (fechorSalidaOriginal != null) {
			fechorSalidaOriginal = DateUtil.normalizar(fechorSalidaOriginal);
		}
		this.fechorSalidaOriginal = fechorSalidaOriginal;
	}

	public EsquemaCorrida getEsquemaCorrida() {
		return esquemaCorrida;
	}

	public void setEsquemaCorrida(EsquemaCorrida esquemaCorrida) {
		this.esquemaCorrida = esquemaCorrida;
	}

	public Corrida() {
	}

	public Corrida(Integer corridaId, Date feccorrida) {
		this.id.setCorridaId(corridaId);
		this.id.setFeccorrida(feccorrida);
	}

	public Corrida(Marca marca, Integer corridaId, Parada origen, Parada destino, ClaseServicio claseServicio, Date horario) {
		this.id = new Id();
		this.id.setCorridaId(corridaId);
		this.setFechorsalida(horario);
		this.origem = origen;
		this.destino = destino;
		this.claseServicio = claseServicio;
		this.marca = marca;
	}

	public Corrida(Integer corridaId, Parada origen, Parada destino) {
		this.id = new Id();
		this.id.setCorridaId(corridaId);
		this.origem = origen;
		this.destino = destino;
	}

	public Id getId() {
		return id;
	}

	public void setId(Id id) {
		this.id = id;
	}

	public List<CorridaTramo> getCorridaTramoList() {
		return corridaTramoList;
	}

	public void setCorridaTramoList(List<CorridaTramo> corridaTramoList) {
		this.corridaTramoList = corridaTramoList;
	}

	public Date getFechorsalida() {
		return fechorsalida;
	}

	public void setFechorsalida(Date fechorsalida) {
		if (fechorsalida != null) {
			fechorsalida = DateUtil.normalizar(fechorsalida);
		}
		this.fechorsalida = fechorsalida;
	}

	public String getIndstatuscorrida() {
		return indstatuscorrida;
	}

	public void setIndstatuscorrida(String indstatuscorrida) {
		this.indstatuscorrida = indstatuscorrida;
	}

	public Date getFechortarjetaviaje() {
		return fechortarjetaviaje;
	}

	public void setFechortarjetaviaje(Date fechortarjetaviaje) {
		this.fechortarjetaviaje = fechortarjetaviaje;
	}

	public Date getFecmodif() {
		return fecmodif;
	}

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

	public Integer getActivo() {
		return activo;
	}

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

	public Integer getUsuarioId() {
		return usuarioId;
	}

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

	public Autobus getAutobus() {
		return autobus;
	}

	public void setAutobus(Autobus autobus) {
		this.autobus = autobus;
	}

	public ClaseServicio getClaseServicio() {
		return claseServicio;
	}

	public void setClaseServicio(ClaseServicio claseServicio) {
		this.claseServicio = claseServicio;
	}

	public Conductor getConductor() {
		return conductor;
	}

	public void setConductor(Conductor conductor) {
		this.conductor = conductor;
	}

	public Conductor getConductor1() {
		return conductor1;
	}

	public void setConductor1(Conductor conductor1) {
		this.conductor1 = conductor1;
	}

	public CorridaCtrl getCorridaCtrl() {
		return corridaCtrl;
	}

	public void setCorridaCtrl(CorridaCtrl corridaCtrl) {
		this.corridaCtrl = corridaCtrl;
	}

	public Empresa getEmpresa() {
		return empresa;
	}

	public void setEmpresa(Empresa empresa) {
		this.empresa = empresa;
	}

	public Empresa getEmpresa1() {
		return empresa1;
	}

	public void setEmpresa1(Empresa empresa1) {
		this.empresa1 = empresa1;
	}

	public Marca getMarca() {
		return marca;
	}

	public void setMarca(Marca marca) {
		this.marca = marca;
	}

	public Nodo getNodo() {
		return nodo;
	}

	public void setNodo(Nodo nodo) {
		this.nodo = nodo;
	}

	public Parada getDestino() {
		return destino;
	}

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

	public Parada getOrigem() {
		return origem;
	}

	public void setOrigem(Parada origem) {
		this.origem = origem;
	}

	public Ruta getRuta() {
		return ruta;
	}

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

	public Zona getZona() {
		return zona;
	}

	public void setZona(Zona zona) {
		this.zona = zona;
	}

	public RolOperativo getRolOperativo() {
		return rolOperativo;
	}

	public void setRolOperativo(RolOperativo rolOperativo) {
		this.rolOperativo = rolOperativo;
	}

	public Short getCantParados() {
		return cantParados;
	}

	public void setCantParados(Short cantParados) {
		this.cantParados = cantParados;
	}

	public Short getTipoServicio() {
		return tipoServicio;
	}

	public void setTipoServicio(Short tipoServicio) {
		this.tipoServicio = tipoServicio;
	}

	public String getEquivalenciaId() {
		return equivalenciaId;
	}

	public void setEquivalenciaId(String equivalenciaId) {
		this.equivalenciaId = equivalenciaId;
	}

	public Corrida getCorridaRebote() {
		return corridaRebote;
	}

	public void setCorridaRebote(Corrida corridaRebote) {
		this.corridaRebote = corridaRebote;
	}

	public Division getDivision() {
		return division;
	}

	public void setDivision(Division division) {
		this.division = division;
	}

	public Corrida getCorridaPiso() {
		return corridaPiso;
	}

	public void setCorridaPiso(Corrida corridaPiso) {
		this.corridaPiso = corridaPiso;
	}

	public Integer getNumPiso() {
		return numPiso;
	}

	public void setNumPiso(Integer numPiso) {
		this.numPiso = numPiso;
	}

	public Date getFechorSalidaOriginalH() {
		return fechorSalidaOriginalH;
	}

	public void setFechorSalidaOriginalH(Date fechorSalidaOriginalH) {
		this.fechorSalidaOriginalH = fechorSalidaOriginalH;
	}

	public Integer getEsquemaAgrupacionId() {
		return esquemaAgrupacionId;
	}

	public void setEsquemaAgrupacionId(Integer esquemaAgrupacionId) {
		this.esquemaAgrupacionId = esquemaAgrupacionId;
	}
	
	public String getCodProdutoFiscal() {
		return codProdutoFiscal;
	}

	public void setCodProdutoFiscal(String codProdutoFiscal) {
		this.codProdutoFiscal = codProdutoFiscal;
	}

	public String getInfoCorrida() {
		return infoCorrida;
	}

	public void setInfoCorrida(String infoCorrida) {
		this.infoCorrida = infoCorrida;
	}

	@Override
	public String toString() {
		return id.toString();
	}
	
	public Boolean getIsFlexBus() {
		return isFlexBus == null ? false : isFlexBus;
	}

	public void setIsFlexBus(Boolean isFlexBus) {
		this.isFlexBus = isFlexBus;
	}

	public Integer getHorasParaConfirmacao() {
		return horasParaConfirmacao == null ? 0 : horasParaConfirmacao;
	}

	public void setHorasParaConfirmacao(Integer horasParaConfirmacao) {
		this.horasParaConfirmacao = horasParaConfirmacao;
	}

	public Integer getMinutosParaConfirmacao() {
		return minutosParaConfirmacao == null ? 0 : minutosParaConfirmacao;
	}

	public void setMinutosParaConfirmacao(Integer minutosParaConfirmacao) {
		this.minutosParaConfirmacao = minutosParaConfirmacao;
	}

	public Integer getOcupacaoMinima() {
		return ocupacaoMinima == null ? 0 : ocupacaoMinima;
	}

	public void setOcupacaoMinima(Integer ocupacaoMinima) {
		this.ocupacaoMinima = ocupacaoMinima;
	}

	public Integer getStatusFlexBus() {
		return statusFlexBus;
	}

	public void setStatusFlexBus(Integer statusFlexBus) {
		this.statusFlexBus = statusFlexBus;
	}

	public Integer getUsuarioFlexBusId() {
		return usuarioFlexBusId;
	}

	public void setUsuarioFlexBusId(Integer usuarioFlexBusId) {
		this.usuarioFlexBusId = usuarioFlexBusId;
	}
}
