package com.yuchen.saas.integration.feign.api.entity;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.nest.springwrap.core.secure.ContextUser;

import java.io.Serializable;

/**
 * Entity支持类
 *
 * @author
 * @version 2022-10-18
 */
@Data
public abstract class BaseEntity<T> implements Serializable {

    private static final long serialVersionUID = 1L;

    protected String id;//* 实体编号（唯一标识）

    protected int pageNo = 1;//分页查询时页码

    protected int pageSize = 10;//分页查询时页面数据量

    protected String access_token;

    /**
     * 是否是新记录（默认：false），调用setIsNewRecord()设置新记录，使用自定义ID。
     * 设置为true后强制执行插入语句，ID不会自动生成，需从手动传入。
     */
    protected boolean isNewRecord = false;

    protected String IdType = IDTYPE_UUID;//主键策略（默认：UUID）

    public BaseEntity() {

    }

    public BaseEntity(String id) {
        this();
        this.id = id;
    }


    public abstract void preInsert(ContextUser user);

    public abstract void preUpdate(ContextUser user);
    /**
     * 是否是新记录（默认：false），调用setIsNewRecord()设置新记录，使用自定义ID。
     * 设置为true后强制执行插入语句，ID不会自动生成，需从手动传入。
     *
     * @return
     */
    @JsonIgnore
    public boolean getIsNewRecord() {
        return isNewRecord || StringUtils.isBlank(this.id);
    }



    @Override
    public boolean equals(Object obj) {
        if (null == obj) {
            return false;
        }
        if (this == obj) {
            return true;
        }
        if (!getClass().equals(obj.getClass())) {
            return false;
        }
        BaseEntity<?> that = (BaseEntity<?>) obj;
        return null == this.id ? false : this.id.equals(that.id);
    }

    @Override
    public String toString() {
        return ReflectionToStringBuilder.toString(this);
    }

    /**
     * 删除标记（0：正常；1：删除；2：审核；）
     */
    public static final String DEL_FLAG_NORMAL = "0";
    public static final String DEL_FLAG_DELETE = "1";
    public static final String DEL_FLAG_AUDIT = "2";

    public static final String IDTYPE_UUID = "UUID";
    public static final String IDTYPE_AUTO = "AUTO";


}
