package com.shentu.dht.client;

import com.shentu.dht.config.Config;
import com.shentu.dht.process.dto.MetaData;
import org.apache.http.HttpHost;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.*;
import java.util.concurrent.TimeUnit;

/**
 * Created by styb on 2019/4/12.
 */
@Component
public class ESClient implements InitializingBean{

    @Autowired
    private Config config;
    private  RestHighLevelClient client=null;

    public  void createIndex() throws Exception{
        XContentBuilder builder = XContentFactory.jsonBuilder();
        builder.startObject();
        {
            builder.startObject("properties");
            {
                builder.startObject("name");
                {
                    builder.field("type", "text");
                    builder.field("analyzer", "ik_max_word");
                    builder.field("search_analyzer", "ik_max_word");

                }
                builder.endObject();

                builder.startObject("infoHash");
                {
                    builder.field("type", "keyword");

                }
                builder.endObject();

                builder.startObject("length");
                {
                    builder.field("type", "long");

                }
                builder.endObject();

                builder.startObject("nameInfo");
                {
                    builder.field("type", "text");

                }
                builder.endObject();
            }
            builder.endObject();
        }
        builder.endObject();
        CreateIndexRequest request = new CreateIndexRequest("torrent");
        request.mapping(builder);
        client.indices().create(request, RequestOptions.DEFAULT);

    }

    public  void index(MetaData metaData) throws Exception{
        Map<String, Object> jsonMap = new HashMap<>();
        jsonMap.put("name", metaData.getName());
        jsonMap.put("infoHash", metaData.getInfoHash());
        jsonMap.put("length", metaData.getLength());
        jsonMap.put("nameInfo",metaData.getNameInfo());
        IndexRequest indexRequest = new IndexRequest("torrent", "_doc",String.valueOf(System.currentTimeMillis())+new Random().nextInt(1000000)).opType("create")
                .source(jsonMap);
        client.index(indexRequest, RequestOptions.DEFAULT);
    }

    public List<MetaData> search(String searchValue) throws Exception{
        List<MetaData> list=new ArrayList<>();
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.from(0);
        searchSourceBuilder.size(100);
        searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
        searchSourceBuilder.query(QueryBuilders.matchQuery("name", searchValue));
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("torrent");
        searchRequest.source(searchSourceBuilder);
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits hits = searchResponse.getHits();
        SearchHit[] searchHits = hits.getHits();
        for (SearchHit hit : searchHits) {
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            list.add(new MetaData((String)sourceAsMap.get("infoHash"),
                    Long.parseLong(String.valueOf(sourceAsMap.get("length"))),
                    (String)sourceAsMap.get("name"),(String)sourceAsMap.get("nameInfo")));
        }
        return list;
    }

    public static void main(String[] args) throws Exception{
//        ESClient.esClient.createIndex();
//        List<MetaData> ss = ESClient.esClient.search("SIS001影视联盟");
//        System.out.println(JSONObject.toJSONString(ss));
//        JSONArray ja=(JSONArray) JSONArray.parse(ss.get(0).getNameInfo());
//        ja.stream().forEach(v->{
//            System.out.println(v);
//        });
//

    }


    @Override
    public void afterPropertiesSet() throws Exception {
        client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost(config.getEsHost(), config.getEsPort(), "http")));
    }


}