package com.rjconsultores.ventaboletos.entidad;

import java.io.Serializable;
import java.math.BigDecimal;
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.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.hibernate.annotations.Where;

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

@Getter
@Setter
@NoArgsConstructor
@Entity
@Table(name = "CONTRATO_CORPORATIVO")
public class ContratoCorporativo implements Serializable {

	private static final long serialVersionUID = 7463047540139255373L;

	@Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CONTRATO_CORPORATIVO_SEQ")
    @SequenceGenerator(name = "CONTRATO_CORPORATIVO_SEQ", sequenceName = "CONTRATO_CORPORATIVO_SEQ", allocationSize = 1)
    @Column(name = "CONTRATO_ID")
    private Long contratoId;

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

    @Column(name = "DATA_INICIAL")
    private Date dataInicial;

    @Column(name = "DATA_FINAL")
    private Date dataFinal;

    @Column(name = "VALOR_CONTRATO")
    private BigDecimal valorContrato;

    @Column(name = "PERCENTUAL_BONUS")
    private BigDecimal percentualBonus;

    @Column(name = "USUARIOREP_ID")
    private Integer usuarioRepId;
    
    @Column(name = "VALIDADE_VOUCHER")
    private Integer validadeVoucher;
    
    @Column(name = "VALIDADE_ABERTO")
    private Integer validadeAberto;
    
    @Column(name = "VALIDADE_EXPRESSO")
    private Integer validadeExpresso;

    @Column(name = "TIPO_CALCULO")
    private Integer tipoCalculo;

    @Column(name = "TIPO_TARIFA")
    private Integer tipoTarifa;

    @Column(name = "TIPO_CONTRATO")
    private Integer tipoContrato;

    @Column(name = "PUNTOVENTA_ID")
    private Long puntoVentaId;
    
    @Column(name = "EMPRESA_ID")
	private Integer empresaId;

    @Column(name = "OBSERVACAO")
    private String observacao;

    @Column(name = "DIVISAO")
    private String divisao;

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

    @Column(name = "DESCONTO_FATURA")
    private BigDecimal descontoFatura;

    @Column(name = "IND_BILHETES_ABERTOS")
    private boolean indBilhetesAbertos;
    
    @Column(name = "IND_BILHETES_CONFIRMADOS")
    private boolean indBilhetesConfirmados;

    @Column(name = "IND_RESERVA_BILHETE")
    private boolean indReservaBilhete;

    @Column(name = "IND_MANIPULA_BONUS")
    private boolean indManipulaBonus;

    @Column(name = "IND_EXIGE_EXCEDENTE")
    private boolean indExigeExcedente;

    @Column(name = "USUARIO_ID")
    private Integer usuarioId;

    @Column(name = "ACTIVO")
    private boolean activo;

    @Basic(optional = false)
    @Column(name = "FECMODIF")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fecModif;
    
    @OneToMany(mappedBy = "contratoId", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
	@Where(clause = "ACTIVO=1")
    private List<DescontoContrato> descontosContrato;
    
    private transient String nomeClienteCorp;    
    private transient String nomeGrupoContrato;    
    private transient String nomeEmpresa;
    
    
	public ContratoCorporativo(Long clienteCorporativoId) {
		this();
		this.clienteCorporativoId = clienteCorporativoId;
	}

	public ContratoCorporativo(Long clienteCorporativoId, String nomeClienteCorp) {
		this();
		this.clienteCorporativoId = clienteCorporativoId;
		this.nomeClienteCorp = nomeClienteCorp;
	}

	public ContratoCorporativo(Long clienteCorporativoId, Date fecModif) {
		this();
		this.clienteCorporativoId = clienteCorporativoId;
		this.fecModif = fecModif;
	}
	
	@Override
	public boolean equals(Object obj) {
		if (obj == null ) {
			return false;
		}
		
		if (getClass() != obj.getClass()) {
			return false;
		}
		
		final ContratoCorporativo other = (ContratoCorporativo) obj;
		
		if (other.getContratoId() == null ) {
			return false;
		}
		
		return this.getContratoId().equals(other.getContratoId());
	}

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

}