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.apache.commons.lang3.StringUtils;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.MatchPhraseQueryBuilder;
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.beans.factory.annotation.Value;
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;

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

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

        BoolQueryBuilder boolQb = QueryBuilders.boolQuery();

        // 如果关键词带空格,则拆分
        for (String k : keywords) {
            MatchPhraseQueryBuilder contentQb = QueryBuilders.matchPhraseQuery("textContent", k);
            MatchPhraseQueryBuilder titleQb = QueryBuilders.matchPhraseQuery("title", k);
            boolQb.should(contentQb);
            boolQb.should(titleQb);
        }

        String[] includes = new String[]{"id", "themeId", "createTime", "_score"};
        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(search);
        return Arrays.stream(hits).map(h -> {
            return JsonUtil.toBean(h.getSourceAsString(), ESThemeQo.class);
        }).collect(Collectors.toList());
    }
}