package xtools.boot.elasticsearch.utils;

import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import xtools.base.config.BaseParams;
import xtools.core.ArrUtils;
import xtools.core.StringUtils;

import java.time.Instant;
import java.util.Objects;

/**
 * <p>Title : EsQueryUtils</p>
 * <p>Description : EsQueryUtils</p>
 * <p>DevelopTools : Idea_x64_v2026.1</p>
 * <p>DevelopSystem : macOS Sequoia 15.7.5</p>
 * <p>Company : org.xujun</p>
 *
 * @author : XuJun
 * @version : 5.0.0
 * @date : 2026/2/14 08:58
 */
public class EsQueryUtils implements BaseParams {

    /**
     * 设置精确查询
     *
     * @param query     查询条件
     * @param filedName 字段名称
     * @param params    参数
     */
    public static void setMatchPhrase(JSONArray query, String filedName, Object params) {
        if (params instanceof String txt && StringUtils.isNotBlank(txt)) {
            query.add(JSONObject.of("match_phrase", JSONObject.of(filedName, txt)));
        } else if (Objects.nonNull(params)) {
            query.add(JSONObject.of("match_phrase", JSONObject.of(filedName, params)));
        }
    }

    /**
     * 模糊查询
     *
     * @param query     模糊查询
     * @param filedName 字段名称
     * @param params    参数
     */
    public static void setWildcard(JSONArray query, String filedName, String params) {
        if (StringUtils.isBlank(params)) {
            return;
        }
        query.add(JSONObject.of("wildcard", JSONObject.of(filedName, "*" + params + "*")));
    }

    /**
     * 时间范围查询
     *
     * @param query     时间范围查询
     * @param filedName 字段名称
     * @param params    参数
     */
    public static void setTimeRange(JSONArray query, String filedName, Instant[] params) {
        if (ArrUtils.isEmpty(params)) {
            return;
        }
        long start = Long.MIN_VALUE;
        long end = Long.MAX_VALUE;
        Instant startTime = params[CP_NUM0];
        if (Objects.nonNull(startTime)) {
            start = startTime.toEpochMilli();
        }
        Instant endTime = params[CP_NUM1];
        if (Objects.nonNull(endTime)) {
            end = endTime.toEpochMilli();
        }
        query.add(JSONObject.of("range", JSONObject.of(filedName, JSONObject.of("gte", start, "lte", end))));
    }

}
