package com.rjconsultores.ventaboletos.entidad;

import java.io.Serializable;
import java.sql.Blob;
import java.util.Arrays;
import java.util.Date;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import org.hibernate.Hibernate;
import org.hibernate.type.LobType;

import br.com.rjconsultores.auditador.annotations.AuditarClasse;
import br.com.rjconsultores.auditador.annotations.NaoAuditar;
import br.com.rjconsultores.auditador.interfaces.Auditavel;
import oracle.sql.BLOB;

@Entity
@AuditarClasse(nome = "SolicitudExpreso", tela = "auditarClasse.SolicitudExpreso")
@SequenceGenerator(name = "SOLICITUD_EXPRESO_SEQ", sequenceName = "SOLICITUD_EXPRESO_SEQ", allocationSize = 1)
@Table(name = "SOLICITUD_EXPRESO")
public class SolicitudExpreso implements Serializable, Auditavel<SolicitudExpreso>{
	
	private static final long serialVersionUID = 1L;
	
	@Id
	@Basic(optional = false)
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "SOLICITUD_EXPRESO_SEQ")
	@Column(name = "SOLICITUDEXPRESO_ID")
	private Integer solicitudExpresoId;
	
	@JoinColumn(name = "CIUDADORIGEN_ID")
	@OneToOne
	private Ciudad ciudadOrigen;
	
	@JoinColumn(name = "CIUDADDESTINO_ID")
	@OneToOne
	private Ciudad ciudadDestino;
	
	@Column(name = "CANTPASAJEROS")
	private Integer cantidadPasajeros;
	
	@Column(name = "FECSOLICITUD")
	@Temporal(TemporalType.TIMESTAMP)
	private Date fechaSolicitud;
	
	@JoinColumn(name = "TIPOIDENTIFICACION_ID")
	@OneToOne
	private TipoIdentificacion tipoIdentificacion;
	
	@Column(name = "NUMIDENTIFICACION")
	private String numIdentidicacion;
	
	@Column(name = "DESCNOMBRE")
	private String descNombre;
	
	@Column(name = "DESCAPELLIDOS")
	private String descApellidos;
	
	@Column(name = "DESCDIRECCION")
	private String descDireccion;
	
	@Column(name = "DESCTELEFONO")
	private String descTelefono;
	
	@Column(name = "DESCEMAIL")
	private String descEmail;
	
	@Column(name = "INDVIAJEREDONDO")
	private Boolean indViajeRedondo;
	
	@Column(name = "FECHORIDA")
	private Date fechaHoraIda;
	
	@Column(name = "DESCOBSERVACIONIDA")
	private String descObservacionIda;
	
	@Column(name = "DESCSITIOPARTIDAIDA")
	private String descSitioPartidaIda;
	
	@Column(name = "DESCSITIOLLEGADAIDA")
	private String descSitioLlegadaIda;
	
	@Column(name = "FECHORREGRESO")
	private Date fechaHoraRegreso;
	
	@Column(name = "DESCOBSERVACIONREGRESO")
	private String descObservacionRegreso;
	
	@Column(name = "DESCSITIOPARTIDAREGRESO")
	private String descSitioPartidaRegreso;
	
	@Column(name = "DESCSITIOLLEGADAREGRESO")
	private String descSitioLlegadaRegreso;
	
	@Column(name = "INDREQUIEREDISPVEHICULO")
	private Integer indRequiereDispVehiculo;
	
	@Column(name = "INDREQUIERERECORRIDOSINTERNOS")
	private Integer indRequiereRecorridosInternos;
	
	@Column(name = "STATUSSOLICITUDEXPRESO_ID")
	private Integer statusSolicitudExpresoId;
	
	@Lob
	@Column(name = "DOCCOTIZACION", columnDefinition="BLOB")
	private byte[] docCotizacion;
	
	@Lob
	@Column(name = "DOCCONTRATO", columnDefinition="BLOB")
	private byte[] docContrato;
	
	@Column(name = "VALORCOTIZACION")
	private Integer valorCotizacion;
	
	@Column(name = "FORMAPAGO_ID")
	private Integer formaPagoId;
	
	@Column(name = "USUARIOAUTORIZACREDITO")
	private Integer usuarioAutorizaCredito;
	
	@Column(name = "FECHORAUTORIZACREDITO")
	@Temporal(TemporalType.TIMESTAMP)
	private Date fechaHoraAutorizaCredito;
	
	@Lob
	@Column(name = "DOCLISTAPASAJEROS", columnDefinition="BLOB")
	private byte[] docListaPasajeros;
	
	@Lob
	@Column(name = "DOCCUMPLIMIENTOSERVICIO", columnDefinition="BLOB")
	private byte[] docCumplimientoServicio;
	
	@Column(name = "ACTIVO")
	private Boolean activo;
	
	@Column(name = "FECMODIF")
	@Temporal(TemporalType.TIMESTAMP)
	private Date fechaHoraModif;
	
	@Column(name = "USUARIO_ID")
	private Integer usuarioId;
	
	@Transient
	@NaoAuditar
	private SolicitudExpreso solicitudExpresoClone;
	
	public SolicitudExpreso() {}

	public Integer getSolicitudExpresoId() {
		return solicitudExpresoId;
	}

	public void setSolicitudExpresoId(Integer solicitudExpresoId) {
		this.solicitudExpresoId = solicitudExpresoId;
	}

	public Ciudad getCiudadOrigen() {
		return ciudadOrigen;
	}

	public void setCiudadOrigen(Ciudad ciudadOrigen) {
		this.ciudadOrigen = ciudadOrigen;
	}

	public Ciudad getCiudadDestino() {
		return ciudadDestino;
	}

	public void setCiudadDestino(Ciudad ciudadDestino) {
		this.ciudadDestino = ciudadDestino;
	}

	public Integer getCantidadPasajeros() {
		return cantidadPasajeros;
	}

	public void setCantidadPasajeros(Integer cantidadPasajeros) {
		this.cantidadPasajeros = cantidadPasajeros;
	}

	public Date getFechaSolicitud() {
		return fechaSolicitud;
	}

	public void setFechaSolicitud(Date fechaSolicitud) {
		this.fechaSolicitud = fechaSolicitud;
	}

	public TipoIdentificacion getTipoIdentificacion() {
		return tipoIdentificacion;
	}

	public void setTipoIdentificacion(TipoIdentificacion tipoIdentificacion) {
		this.tipoIdentificacion = tipoIdentificacion;
	}

	public String getNumIdentidicacion() {
		return numIdentidicacion;
	}

	public void setNumIdentidicacion(String numIdentidicacion) {
		this.numIdentidicacion = numIdentidicacion;
	}

	public String getDescNombre() {
		return descNombre;
	}

	public void setDescNombre(String descNombre) {
		this.descNombre = descNombre;
	}

	public String getDescApellidos() {
		return descApellidos;
	}

	public void setDescApellidos(String descApellidos) {
		this.descApellidos = descApellidos;
	}

	public String getDescDireccion() {
		return descDireccion;
	}

	public void setDescDireccion(String descDireccion) {
		this.descDireccion = descDireccion;
	}

	public String getDescTelefono() {
		return descTelefono;
	}

	public void setDescTelefono(String descTelefono) {
		this.descTelefono = descTelefono;
	}

	public String getDescEmail() {
		return descEmail;
	}

	public void setDescEmail(String descEmail) {
		this.descEmail = descEmail;
	}

	public Boolean getIndViajeRedondo() {
		return indViajeRedondo;
	}

	public void setIndViajeRedondo(Boolean indViajeRedondo) {
		this.indViajeRedondo = indViajeRedondo;
	}

	public Date getFechaHoraIda() {
		return fechaHoraIda;
	}

	public void setFechaHoraIda(Date fechaHoraIda) {
		this.fechaHoraIda = fechaHoraIda;
	}

	public String getDescObservacionIda() {
		return descObservacionIda;
	}

	public void setDescObservacionIda(String descObservacionIda) {
		this.descObservacionIda = descObservacionIda;
	}

	public String getDescSitioPartidaIda() {
		return descSitioPartidaIda;
	}

	public void setDescSitioPartidaIda(String descSitioPartidaIda) {
		this.descSitioPartidaIda = descSitioPartidaIda;
	}

	public String getDescSitioLlegadaIda() {
		return descSitioLlegadaIda;
	}

	public void setDescSitioLlegadaIda(String descSitioLlegadaIda) {
		this.descSitioLlegadaIda = descSitioLlegadaIda;
	}

	public Date getFechaHoraRegreso() {
		return fechaHoraRegreso;
	}

	public void setFechaHoraRegreso(Date fechaHoraRegreso) {
		this.fechaHoraRegreso = fechaHoraRegreso;
	}

	public String getDescObservacionRegreso() {
		return descObservacionRegreso;
	}

	public void setDescObservacionRegreso(String descObservacionRegreso) {
		this.descObservacionRegreso = descObservacionRegreso;
	}

	public String getDescSitioPartidaRegreso() {
		return descSitioPartidaRegreso;
	}

	public void setDescSitioPartidaRegreso(String descSitioPartidaRegreso) {
		this.descSitioPartidaRegreso = descSitioPartidaRegreso;
	}

	public String getDescSitioLlegadaRegreso() {
		return descSitioLlegadaRegreso;
	}

	public void setDescSitioLlegadaRegreso(String descSitioLlegadaRegreso) {
		this.descSitioLlegadaRegreso = descSitioLlegadaRegreso;
	}

	public Integer getIndRequiereDispVehiculo() {
		return indRequiereDispVehiculo;
	}

	public void setIndRequiereDispVehiculo(Integer indRequiereDispVehiculo) {
		this.indRequiereDispVehiculo = indRequiereDispVehiculo;
	}

	public Integer getIndRequiereRecorridosInternos() {
		return indRequiereRecorridosInternos;
	}

	public void setIndRequiereRecorridosInternos(Integer indRequiereRecorridosInternos) {
		this.indRequiereRecorridosInternos = indRequiereRecorridosInternos;
	}

	public Integer getStatusSolicitudExpresoId() {
		return statusSolicitudExpresoId;
	}

	public void setStatusSolicitudExpresoId(Integer statusSolicitudExpresoId) {
		this.statusSolicitudExpresoId = statusSolicitudExpresoId;
	}

	public byte[] getDocCotizacion() {
		return docCotizacion;
	}

	public void setDocCotizacion(byte[] docCotizacion) {
		this.docCotizacion = docCotizacion;
	}

	public byte[] getDocContrato() {
		return docContrato;
	}

	public void setDocContrato(byte[] docContrato) {
		this.docContrato = docContrato;
	}

	public Integer getValorCotizacion() {
		return valorCotizacion;
	}

	public void setValorCotizacion(Integer valorCotizacion) {
		this.valorCotizacion = valorCotizacion;
	}

	public Integer getFormaPagoId() {
		return formaPagoId;
	}

	public void setFormaPagoId(Integer formaPagoId) {
		this.formaPagoId = formaPagoId;
	}

	public Integer getUsuarioAutorizaCredito() {
		return usuarioAutorizaCredito;
	}

	public void setUsuarioAutorizaCredito(Integer usuarioAutorizaCredito) {
		this.usuarioAutorizaCredito = usuarioAutorizaCredito;
	}

	public Date getFechaHoraAutorizaCredito() {
		return fechaHoraAutorizaCredito;
	}

	public void setFechaHoraAutorizaCredito(Date fechaHoraAutorizaCredito) {
		this.fechaHoraAutorizaCredito = fechaHoraAutorizaCredito;
	}

	public byte[] getDocListaPasajeros() {
		return docListaPasajeros;
	}

	public void setDocListaPasajeros(byte[] docListaPasajeros) {
		this.docListaPasajeros = docListaPasajeros;
	}

	public byte[] getDocCumplimientoServicio() {
		return docCumplimientoServicio;
	}

	public void setDocCumplimientoServicio(byte[] docCumplimientoServicio) {
		this.docCumplimientoServicio = docCumplimientoServicio;
	}

	public Boolean getActivo() {
		return activo;
	}

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

	public Date getFechaHoraModif() {
		return fechaHoraModif;
	}

	public void setFechaHoraModif(Date fechaHoraModif) {
		this.fechaHoraModif = fechaHoraModif;
	}

	public Integer getUsuarioId() {
		return usuarioId;
	}

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

	@Override
	public String toString() {
		return "SolicitudExpreso [solicitudExpresoId=" + solicitudExpresoId + ", ciudadOrigen=" + ciudadOrigen
				+ ", ciudadDestino=" + ciudadDestino + ", cantidadPasajeros=" + cantidadPasajeros + ", fechaSolicitud="
				+ fechaSolicitud + ", tipoIdentificacion=" + tipoIdentificacion + ", numIdentidicacion="
				+ numIdentidicacion + ", descNombre=" + descNombre + ", descApellidos=" + descApellidos
				+ ", descDireccion=" + descDireccion + ", descTelefono=" + descTelefono + ", descEmail=" + descEmail
				+ ", indViajeRedondo=" + indViajeRedondo + ", fechaHoraIda=" + fechaHoraIda + ", descObservacionIda="
				+ descObservacionIda + ", descSitioPartidaIda=" + descSitioPartidaIda + ", descSitioLlegadaIda="
				+ descSitioLlegadaIda + ", fechaHoraRegreso=" + fechaHoraRegreso + ", descObservacionRegreso="
				+ descObservacionRegreso + ", descSitioPartidaRegreso=" + descSitioPartidaRegreso
				+ ", descSitioLlegadaRegreso=" + descSitioLlegadaRegreso + ", indRequiereDispVehiculo="
				+ indRequiereDispVehiculo + ", indRequiereRecorridosInternos=" + indRequiereRecorridosInternos
				+ ", statusSolicitudExpresoId=" + statusSolicitudExpresoId + ", docCotizacion="
				+ Arrays.toString(docCotizacion) + ", docContrato=" + Arrays.toString(docContrato)
				+ ", valorCotizacion=" + valorCotizacion + ", formaPagoId=" + formaPagoId + ", usuarioAutorizaCredito="
				+ usuarioAutorizaCredito + ", fechaHoraAutorizaCredito=" + fechaHoraAutorizaCredito
				+ ", docListaPasajeros=" + Arrays.toString(docListaPasajeros) + ", docCumplimientoServicio="
				+ Arrays.toString(docCumplimientoServicio) + ", activo=" + activo + ", fechaHoraModif=" + fechaHoraModif
				+ ", usuarioId=" + usuarioId + "]";
	}

	@Override
	public void clonar() throws CloneNotSupportedException {
		solicitudExpresoClone = new SolicitudExpreso();
		solicitudExpresoClone = (SolicitudExpreso)this.clone();
		Hibernate.initialize(solicitudExpresoClone.getSolicitudExpresoId());
	}

	@Override
	public SolicitudExpreso getCloneObject() throws CloneNotSupportedException {
		return solicitudExpresoClone;
	}

	@Override
	public String getTextoInclusaoExclusao() {
		return String.format("ID [%s]", this.getStatusSolicitudExpresoId());
	}
}
