package com.bt.intalio.db;

import com.bt.intalio.db.consts.IntalioDBConsts;
import lombok.Getter;
import lombok.ToString;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import java.sql.Timestamp;

@Entity
@Table(name = IntalioDBConsts.BPEL_INSTANCE)
@NamedQueries({
		      @NamedQuery(name = BPELInstance.CL_FIND + "All", query = BPELInstance.SELECT_FROM),
		      @NamedQuery(name = BPELInstance.CL_FIND_BY + "Id", query = BPELInstance.SELECT_WHERE + "id = ?1"),
		      @NamedQuery(name = BPELInstance.CL_FIND_BY + "InstantiatingCorrelator",
				  query = BPELInstance.SELECT_WHERE + "instantiatingCorrelator = ?1"),
		      @NamedQuery(name = BPELInstance.CL_FIND_BY + "Fault", query = BPELInstance.SELECT_WHERE + "fault = ?1"),
		      @NamedQuery(name = BPELInstance.CL_FIND_BY + "JacobState", query = BPELInstance.SELECT_WHERE + "jacobState = ?1"),
		      @NamedQuery(name = BPELInstance.CL_FIND_BY + "PreviousState", query = BPELInstance.SELECT_WHERE + "previousState = ?1"),
		      @NamedQuery(name = BPELInstance.CL_FIND_BY + "State", query = BPELInstance.SELECT_WHERE + "state = ?1"),
		      @NamedQuery(name = BPELInstance.CL_FIND_BY + "LastActiveDt", query = BPELInstance.SELECT_WHERE + "lastActiveDt = ?1"),
		      @NamedQuery(name = BPELInstance.CL_FIND_BY + "Sequence", query = BPELInstance.SELECT_WHERE + "sequence = ?1"),
		      @NamedQuery(name = BPELInstance.CL_FIND_BY + "FailureCount", query = BPELInstance.SELECT_WHERE + "failureCount = ?1"),
		      @NamedQuery(name = BPELInstance.CL_FIND_BY + "FailureDt", query = BPELInstance.SELECT_WHERE + "failureDt = ?1"),
		      @NamedQuery(name = BPELInstance.CL_FIND_BY + "InsertTime", query = BPELInstance.SELECT_WHERE + "insertTime = ?1"),
		      @NamedQuery(name = BPELInstance.CL_FIND_BY + "Mlock", query = BPELInstance.SELECT_WHERE + "mlock = ?1")
	      })
@Getter
@ToString(exclude = "id")
public final class BPELInstance extends AbstBPELPersist
{
    public static final String CL_NAME = "BPELInstance";
    public static final String CL_FIND = CL_NAME + ".find";
    public static final String CL_FIND_BY = CL_FIND + "By";
    public static final String SELECT_FROM = "SELECT b FROM " + CL_NAME + " b";
    public static final String SELECT_WHERE = SELECT_FROM + " WHERE b.";
    public static final String findAll = CL_FIND + "All";

    @Column(name = IntalioDBConsts.INSTANTIATING_CORRELATOR, nullable = true, insertable = false, updatable = false)
    private Long instantiatingCorrelator;

    @Column(name = IntalioDBConsts.FAULT, nullable = true, insertable = false, updatable = false)
    private Long fault;

    @Column(name = IntalioDBConsts.JACOB_STATE, nullable = true, insertable = false, updatable = false)
    private Long jacobState;

    @Column(name = IntalioDBConsts.PREVIOUS_STATE, nullable = true, insertable = false, updatable = false)
    private Short previousState;

    @Column(name = IntalioDBConsts.STATE, nullable = true, insertable = false, updatable = false)
    private Short state;

    @Column(name = IntalioDBConsts.FAILURE_COUNT, nullable = true, insertable = false, updatable = false)
    private Short failureCount;

    @Column(name = IntalioDBConsts.FAILURE_DT, nullable = true, insertable = false, updatable = false)
    private Timestamp failureDt;
    @Column(name = IntalioDBConsts.INSERT_TIME, nullable = true, insertable = false, updatable = false)
    private Timestamp insertTime;

    @Column(name = IntalioDBConsts.MLOCK, nullable = false, insertable = false, updatable = false)
    private int mlock;

    @Column(name = IntalioDBConsts.LAST_ACTIVE_DT, nullable = true, insertable = false, updatable = false)
    private Timestamp lastActiveDt;

    @Column(name = IntalioDBConsts.SEQUENCE, nullable = true, insertable = false, updatable = false)
    private Long sequence;

    @ManyToOne(cascade = CascadeType.ALL, targetEntity = BPELProcess.class, fetch = FetchType.EAGER, optional = false)
    @JoinColumn(name = IntalioDBConsts.PROCESS_ID, referencedColumnName = IntalioDBConsts.ID, nullable = false)
    private BPELProcess bpelProcess;
}
