package com.tanpu.community.service.base;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.elasticsearch.action.ActionRequest;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.common.xcontent.XContentType;
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.rest.RestStatus;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.elasticsearch.client.*;

import javax.annotation.PostConstruct;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@Slf4j
@Service
public class ESHelper {

    @Value("${es.index}")
    private String esIndex;

    @Autowired
    private RestHighLevelClient client;


    public void insert(String type, String id, String json) {
        try {
            IndexRequest req = new IndexRequest(esIndex);
            if (StringUtils.isNotBlank(id)) {
                req.id(type + "_" + id);
            }

            req.source(json, XContentType.JSON);
            IndexResponse resp = client.index(req, RequestOptions.DEFAULT);
            validStatus(resp.status(), RestStatus.CREATED, RestStatus.OK);
        } catch (IOException e) {
            log.error("ES Helper error:{}", ExceptionUtils.getStackTrace(e));
        }
    }

    public void insert(String type, String id, Map<String, Object> data) {
        try {
            IndexRequest req = new IndexRequest(esIndex);
            if (StringUtils.isNotBlank(id)) {
                req.id(type + "_" + id);
            }

            req.source(data);
            IndexResponse resp = client.index(req, RequestOptions.DEFAULT);
            validStatus(resp.status(), RestStatus.OK);
        } catch (IOException e) {
            log.error("ES Helper error:{}", ExceptionUtils.getStackTrace(e));
        }
    }

    public SearchHit[] selectLike(SearchSourceBuilder builder) {
        try {
            SearchRequest req = new SearchRequest(esIndex);
            req.source(builder);
            SearchResponse resp = client.search(req, RequestOptions.DEFAULT);
            validStatus(resp.status(), RestStatus.OK);

            return resp.getHits().getHits();
        } catch (IOException e) {
            log.error("ES Helper error:{}", ExceptionUtils.getStackTrace(e));
        }

        return new SearchHit[]{};
    }


    private void validStatus(RestStatus status, RestStatus... expect) {
        for (RestStatus ex : expect) {
            if (ex == status) return;
        }
        log.error("ES Helper fail! status:{}", status.toString());
        throw new RuntimeException("ES fail");
    }


















    public static void main(String[] args) {
        CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("1", "2"));

        RestClientBuilder builder = RestClient.builder(new HttpHost("42.194.224.208", 9200))
                .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
                    @Override
                    public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
                        return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
                    }
                });

        RestHighLevelClient highClient = new RestHighLevelClient(builder);

        ESHelper helper = new ESHelper();
        helper.client = highClient;




        SearchSourceBuilder search = new SearchSourceBuilder();

        BoolQueryBuilder boolQb = QueryBuilders.boolQuery();

        String[] ks = new String[]{"左侧", "五粮液"};
        for (String k : ks) {
            MatchPhraseQueryBuilder contentQb = QueryBuilders.matchPhraseQuery("textContent", k);
            MatchPhraseQueryBuilder titleQb = QueryBuilders.matchPhraseQuery("title", k);
            boolQb.should(contentQb);
            boolQb.should(titleQb);
        }


//        String[] includes = new String[]{"id"};
//        String[] excludes = new String[]{};
        search.query(boolQb).from(0).size(50);



       try {
           SearchRequest req = new SearchRequest("new-community");
           req.source(search);
           SearchResponse resp = helper.client.search(req, RequestOptions.DEFAULT);

           SearchHit[] hits = resp.getHits().getHits();
           System.out.println(hits.length);
           for (SearchHit hit : hits) {
               System.out.println(hit.toString());
               System.out.println(hit.getFields());
           }
       } catch (Exception e) {
           e.printStackTrace();
       }

       System.out.println("done");
    }


}