package com.ibyte.common.core.entity;

import com.ibyte.common.core.data.IData;
import com.ibyte.common.core.data.fileld.IField;
import com.ibyte.framework.meta.annotation.MetaProperty;
import com.ibyte.framework.meta.MetaConstant.ShowType;
import org.hibernate.validator.constraints.Length;

import javax.persistence.*;
import javax.validation.constraints.Min;

/**
 * 树模型,注意:fdHierarchyId的构造不是默认生成的,请在Service里面,使用TreeEntityUtil对应的方法
 *
 * @param <E>
 * @author 李尚志
 */
@Table(indexes = @Index(columnList = "fdHierarchyId"))
public interface TreeEntity<E extends IEntity> extends IData, IField {
    String HIERARCHY_ID_SPLIT = "x";

    String HIERARCHY_INVALID_FLAG = "0";

    long MIN_TREE_LEVEL = 1L;

    /**
     * 读-上级
     *
     * @return
     */
    @SuppressWarnings("unchecked")
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "fd_parent_id")
    @MetaProperty(messageKey = "property.fdParent")
    default E getFdParent() {
        return (E) getExtendProps().get("fdParent");
    }

    /**
     * 写-上级
     *
     * @param fdParent
     */
    default void setFdParent(E fdParent) {
        getExtendProps().put("fdParent", fdParent);
    }

    /**
     * 读-层级ID
     *
     * @return
     */
    @MetaProperty(showType = ShowType.NONE, messageKey = "property.fdHierarchyId")
    @Length(max = 900)
    @Column(columnDefinition = "varchar(900)")
    default String getFdHierarchyId() {
        return (String) getExtendProps().get("fdHierarchyId");
    }

    /**
     * 写-层级ID
     *
     * @param fdHierarchyId
     */
    default void setFdHierarchyId(String fdHierarchyId) {
        getExtendProps().put("fdHierarchyId", fdHierarchyId);
    }

    /**
     * 读-层级
     *
     * @return
     */
    @MetaProperty(showType = ShowType.NONE, messageKey = "property.fdTreeLevel")
    @Min(MIN_TREE_LEVEL)
    default Integer getFdTreeLevel() {
        return (Integer) getExtendProps().get("fdTreeLevel");
    }

    /**
     * 写-层级
     *
     * @param fdTreeLevel
     */
    default void setFdTreeLevel(Integer fdTreeLevel) {
        getExtendProps().put("fdTreeLevel", fdTreeLevel);
    }
}