package pwc.taxtech.drop;

import org.hibernate.annotations.ColumnDefault;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.sql.Date;
import java.util.Objects;

import static pwc.taxtech.Const.*;

@Entity
@Table(name = "KEY_VALUE_DATA", schema = PROJECT_ADMIN, catalog = "")
public class KeyValueData {
    private String id;
    private String keyValueConfigId;
    private String projectId;
    private String keyCode;
    private Integer calculateStatus;
    private Integer period;
    private Integer year;
    private Integer resultType;
    private String value;
    private String formulaExp;
    private String internalExp;
    private Date createTime;
    private Date updateTime;

    @Id
    @Column(name = "ID", nullable = false, length = 128)
    public String getId() {
        return id;
    }

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

    @Basic
    @Column(name = "KEY_VALUE_CONFIG_ID", nullable = false, length = 128)
    @ColumnDefault(DEF_DEFAULT_STRING)
    public String getKeyValueConfigId() {
        return keyValueConfigId;
    }

    public void setKeyValueConfigId(String keyValueConfigId) {
        this.keyValueConfigId = keyValueConfigId;
    }

    @Basic
    @Column(name = "PROJECT_ID", nullable = false, length = 128)
    @ColumnDefault(DEF_DEFAULT_STRING)
    public String getProjectId() {
        return projectId;
    }

    public void setProjectId(String projectId) {
        this.projectId = projectId;
    }

    @Basic
    @Column(name = "KEY_CODE", nullable = false, columnDefinition = DEF_BIG_STRING)
    public String getKeyCode() {
        return keyCode;
    }

    public void setKeyCode(String keyCode) {
        this.keyCode = keyCode;
    }

    @Basic
    @Column(name = "CALCULATE_STATUS", nullable = false)
    @ColumnDefault(DEF_DEFAULT_NUMBER)
    public Integer getCalculateStatus() {
        return calculateStatus;
    }

    public void setCalculateStatus(Integer calculateStatus) {
        this.calculateStatus = calculateStatus;
    }

    @Basic
    @Column(name = "PERIOD", nullable = true)
    @ColumnDefault(DEF_DEFAULT_NUMBER)
    public Integer getPeriod() {
        return period;
    }

    public void setPeriod(Integer period) {
        this.period = period;
    }

    @Basic
    @Column(name = "YEAR", nullable = false)
    @ColumnDefault(DEF_DEFAULT_NUMBER)
    public Integer getYear() {
        return year;
    }

    public void setYear(Integer year) {
        this.year = year;
    }

    @Basic
    @Column(name = "RESULT_TYPE", nullable = false)
    @ColumnDefault(DEF_DEFAULT_NUMBER)
    public Integer getResultType() {
        return resultType;
    }

    public void setResultType(Integer resultType) {
        this.resultType = resultType;
    }

    @Basic
    @Column(name = "VALUE", nullable = true, length = 200)
    @ColumnDefault(DEF_DEFAULT_STRING)
    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    @Basic
    @Column(name = "FORMULA_EXP", nullable = true, columnDefinition = DEF_BIG_STRING)
    public String getFormulaExp() {
        return formulaExp;
    }

    public void setFormulaExp(String formulaExp) {
        this.formulaExp = formulaExp;
    }

    @Basic
    @Column(name = "INTERNAL_EXP", nullable = true, columnDefinition = DEF_BIG_STRING)
    public String getInternalExp() {
        return internalExp;
    }

    public void setInternalExp(String internalExp) {
        this.internalExp = internalExp;
    }

    @Basic
    @Column(name = "CREATE_TIME", nullable = false, columnDefinition = DEF_DEFAULT_DATE)
    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    @Basic
    @Column(name = "UPDATE_TIME", nullable = false, columnDefinition = DEF_DEFAULT_DATE)
    public Date getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        KeyValueData that = (KeyValueData) o;
        return calculateStatus == that.calculateStatus &&
                year == that.year &&
                resultType == that.resultType &&
                Objects.equals(id, that.id) &&
                Objects.equals(keyValueConfigId, that.keyValueConfigId) &&
                Objects.equals(projectId, that.projectId) &&
                Objects.equals(keyCode, that.keyCode) &&
                Objects.equals(period, that.period) &&
                Objects.equals(value, that.value) &&
                Objects.equals(formulaExp, that.formulaExp) &&
                Objects.equals(internalExp, that.internalExp) &&
                Objects.equals(createTime, that.createTime) &&
                Objects.equals(updateTime, that.updateTime);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, keyValueConfigId, projectId, keyCode, calculateStatus, period, year, resultType, value, formulaExp, internalExp, createTime, updateTime);
    }
}