package com.tanpu.community.service.base;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.tanpu.common.util.JsonUtil;
import com.tanpu.community.api.beans.qo.ESThemeQo;
import com.tanpu.community.api.beans.qo.ThemeQo;
import com.tanpu.community.dao.entity.community.ThemeEntity;
import com.tanpu.community.model.ESWrapper;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

@Slf4j
@Service
public class ESService {

    @Autowired
    private ESHelper helper;

    private static final String INDEX_THEME = "theme";

    public void insertOrUpdateThemes(List<ESThemeQo> qos) {
        for (ESThemeQo qo : qos) {
            insertOrUpdateTheme(qo);
        }
    }
    // 只要设置了_id,则直接覆盖
    public void insertOrUpdateTheme(ESThemeQo qo) {
        helper.insert(INDEX_THEME, String.valueOf(qo.themeType), qo.themeId, JSON.toJSONString(qo));
    }

    public List<ESThemeQo> queryThemeIdByContentAndTitle(String keyword, int from, int size) {
        SearchSourceBuilder search = new SearchSourceBuilder();

        BoolQueryBuilder boolQb = QueryBuilders.boolQuery();
        MatchQueryBuilder contentQb = QueryBuilders.matchQuery("textContent", keyword);
        MatchQueryBuilder titleQb = QueryBuilders.matchQuery("title", keyword);
        boolQb.should(contentQb);
        boolQb.should(titleQb);

        String[] includes = new String[]{"id", "themeId", "createTime"};
        String[] excludes = new String[]{};
        search.query(boolQb).fetchSource(includes, excludes).sort("createTime", SortOrder.DESC).from(from).size(size);
        search.query(boolQb).sort("createTime", SortOrder.DESC).from(from).size(size);

        SearchHit[] hits = helper.selectLike(INDEX_THEME, search);
        return Arrays.stream(hits).map(h -> {
            return JsonUtil.toBean(h.getSourceAsString(), ESThemeQo.class);
        }).collect(Collectors.toList());
    }
}