package com.persagy.proxy.adm.request;

import cn.hutool.core.util.StrUtil;
import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import com.fasterxml.jackson.databind.node.ObjectNode;
import lombok.Data;

import java.util.List;

/**
 * ADM通用查询条件
 * @author Charlie Yu
 * @date 2021-08-16
 */
@Data
public class AdmQueryCriteria {

    /** 可取得的最大记录数 */
    private Integer maxRow = 100000;
    /** 第几页(从1开始) */
    private Integer pageNumber;
    /** 每页记录数(0 < 记录数 < 1000) */
    private Integer pageSize;
    /** 查询条件 */
    @JsonAlias(value = {"filters", "Filters"})
    private String filters;
    /** 排序条件 */
    private String orders;
    /** 去除重复记录 */
    private Boolean distinct;
    /** 级联对象属性名 - 为级联对象时有值 */
    @JsonAlias(value = {"name", "Name"})
    private String name;
    /** 字段影射，空为查询所有字段 */
    private List<String> projection;
    /** 级联对象列表 */
    @JsonAlias(value = {"cascade", "Cascade"})
    private List<AdmQueryCriteria> cascade;
    /** 分组统计 */
    private AdmQueryGroup group;
    /** 是否只统计总数 */
    private boolean onlyCount = false;
    /** 关系查询条件 */
    private ObjectNode relationFrom;
    /** 关系查询条件 */
    private ObjectNode relationTo;

    /**
     * 拼接条件
     * @param addFilter
     */
    public void addFilters(String addFilter) {
        if(StrUtil.isBlank(addFilter)) {
            return;
        }
        if(StrUtil.isBlank(filters)) {
            filters = addFilter;
            return;
        }
        filters = filters + " and " + addFilter;
    }

    /**
     * 设置关系条件
     * @param isFrom 是否查询from结果
     * @param graphCode
     * @param relCode
     * @param objId
     */
    public void resetRelationCond(boolean isFrom, String graphCode, String relCode, String objId) {
        resetRelationCond(isFrom, graphCode, relCode, objId, true);
    }

    /**
     * 设置关系条件
     * @param isFrom 是否查询from结果
     * @param graphCode
     * @param relCode
     * @param objId
     * @param bindFlag
     */
    public void resetRelationCond(boolean isFrom, String graphCode, String relCode, String objId, boolean bindFlag) {
        resetRelationCond(isFrom, graphCode, relCode, null, objId, bindFlag);
    }

    /**
     * 设置关系条件
     * @param isFrom 是否查询from结果
     * @param graphCode
     * @param relCode
     * @param relValue
     * @param objId
     * @param bindFlag
     */
    public void resetRelationCond(boolean isFrom, String graphCode, String relCode, String relValue, String objId, boolean bindFlag) {
        ObjectNode relationCond = JsonNodeFactory.instance.objectNode();
        relationCond.put("graphCode", graphCode);
        relationCond.put("relCode", relCode);
        relationCond.put("relValue", relValue);
        relationCond.put("$bindFlag", bindFlag);
        if(isFrom) {
            relationCond.put("objTo", objId);
            setRelationFrom(relationCond);
        } else {
            relationCond.put("objFrom", objId);
            setRelationTo(relationCond);
        }
    }
}
