package com.rjconsultores.ventaboletos.entidad;

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

import javax.persistence.Basic;
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.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import com.rjconsultores.ventaboletos.anotacao.Renderizado;
import com.rjconsultores.ventaboletos.enums.SituacaoVoucher;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@SequenceGenerator(name = "VOUCHER_SEQ", sequenceName = "VOUCHER_SEQ", allocationSize = 1)
@Table(name = "VOUCHER")
public class Voucher implements Serializable {

	private static final long serialVersionUID = -3684489881654368314L;

	@Id
	@Basic(optional = false)
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "VOUCHER_SEQ")
	@Renderizado( posicao = 1)
	@Column(name = "VOUCHER_ID")
	private Long voucherId;
	
	@OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "CONTRATO_ID")    
    @Renderizado( posicao = 2)
    private ContratoCorporativo contrato;

	@Column(name = "NOME_PASSAGEIRO", length = 150)
    private String nomePassageiro;
	
	@Column(name = "NUM_FATURA", length = 30)
    private String numFatura;

    @Column(name = "VALOR_LICITADO")
    @Renderizado( posicao = 5 )
    private BigDecimal valorLicitado;

    @Renderizado( posicao = 6)
    @Column(name = "VALOR_LEGALIZADO")
    private BigDecimal valorLegalizado;

    @Renderizado( posicao = 4)
    @Column(name = "DATA_VALIDADE")
    private Date dataValidade;

    @Column(name = "DATA_INCLUSAO")
    @Temporal(TemporalType.TIMESTAMP)
    private Date dataInclusao;

    @Column(name = "ORIGEN_ID")
    private Integer origenId;

    @Column(name = "DESTINO_ID")
    private Integer destinoId;
    
    @Column(name = "CLASESERVICIO_ID")
    private Long claseServicioId;
    
    @Column(name = "STATUS")
    @Renderizado( conversor = SituacaoVoucher.class, posicao = 3)
    private Integer status;

    @Column(name = "CLIENTECORPORATIVO_ID")
    private Long clienteCorporativoId;

    @Column(name = "MOTIVOCANCELACION_ID")
    private Long motivoCancelacionId;

    @Column(name = "GRUPOCONTRATO_ID")
    private Long grupoContratoId;

    @OneToOne
    @JoinColumn(name = "TRANSPORTADORA_ID")
    private Transportadora transportadora;
    
    @Column(name = "DATA_FATURA")
	@Temporal(TemporalType.TIMESTAMP)
	private Date dataFatura;
    
    @Column(name = "DATA_LEGALIZA")
	@Temporal(TemporalType.TIMESTAMP)
	private Date dataLegaliza;
    
    @Column(name = "DATA_CORTE")
	@Temporal(TemporalType.TIMESTAMP)
	private Date dataCorte;
	
	@Column(name = "ACTIVO")
	private boolean activo;
	
	@Column(name = "FECMODIF")
	@Temporal(TemporalType.TIMESTAMP)
	private Date fecModif;
	
	@Column(name = "USUARIO_ID")
	private Integer usuarioId;
	
	@Transient
	@Renderizado( posicao = 7 )
	private transient String descOrigem;
	
	@Transient
	@Renderizado( posicao = 8 )
	private String descDestino;
	
	public SituacaoVoucher getSituacaoVoucher() {
		return SituacaoVoucher.buscarPeloValor(status);
	}
	
	@Override
	public boolean equals(Object obj) {
		if (obj == null) {
			return false;
		}
		
		if (getClass() != obj.getClass()) {
			return false;
		}
		
		final Voucher other = (Voucher) obj;
		return this.getVoucherId().equals(other.getVoucherId());
	}

	@Override
	public int hashCode() {
		int hash = 7;
		hash = 59 * hash + (this.getVoucherId() != null ? this.getVoucherId().hashCode() : 0);
		return hash;
	}
	
}
