package service

import (
	"encoding/json"
	"fmt"
	"github.com/tidwall/gjson"
	"github.com/uniplaces/carbon"
	"search_server/model"
	"search_server/pkg/es"
	"search_server/requests"
	"search_server/service/query"
	"strconv"
)

type SearchLogService struct {
}

//获取index方法的数据
func (sls *SearchLogService) GetIndexData(request map[string]string) (result map[string]interface{}, err error) {
	//索引/类型
	index := "keyword_search_log_1/log"
	var esResult string
	_, exist := request["scroll_id"]
	if exist || request["scroll_id"] == "" {
		queryString := query.GetSearchLogIndexQuery(request)
		esResult, err = es.CurlES(index, queryString)
		if err != nil {
			return
		}
	} else {
		params := make(map[string]string)
		scroll, _ := strconv.Atoi(request["scroll"])
		if scroll > 0 {
			params["scroll"] = params["scroll"] + "m"
		} else {
			params["scroll"] = "5m"
		}
		params["scroll_id"] = request["scroll_id"]
		paramsStr, _ := json.Marshal(params)
		esResult, err = es.ScrollES(string(paramsStr))
		if err != nil {
			return
		}
	}
	fmt.Println(esResult)
	result = make(map[string]interface{})
	//循环遍历出数据
	result["total"] = gjson.Get(esResult, "hits.total").Int()
	result["scroll_id"] = gjson.Get(esResult, "_scroll_id").String()
	sources := gjson.Get(esResult, "hits.hits.#_source").Array()
	var list []map[string]interface{}
	for _, source := range sources {
		listItem := make(map[string]interface{})
		var hits model.SearchLogHits
		var platform string
		_ = json.Unmarshal([]byte(source.String()), &hits)
		if hits.Source.Platform == 1 {
			platform = "PC"
		} else if hits.Source.Platform == 2 {
			platform = "H5"
		} else {
			platform = ""
		}
		listItem["create_time"] = hits.Source.CreateTime
		listItem["user_id"] = hits.Source.UserID
		listItem["flag"] = hits.Source.Flag
		listItem["ip"] = hits.Source.IP
		listItem["keyword"] = hits.Source.Keyword
		listItem["browser_info"] = hits.Source.BrowserInfo
		listItem["platform"] = platform
		listItem["adtag"] = hits.Source.Adtag
		listItem["ptag"] = hits.Source.Ptag
		listItem["user_sign"] = hits.Source.UserSign
		list = append(list, listItem)
	}
	result["list"] = list
	return
}

func (sls *SearchLogService) GetSumIp(r requests.SumIpRequest) (res []map[string]interface{}, err error) {
	//默认24小时
	if r.StartTime == 0 {
		r.StartTime = carbon.Now().SubDays(1).Timestamp()
	}
	if r.EndTime == 0 {
		r.EndTime = carbon.Now().Timestamp()
	}
	if r.Size == 0 {
		r.Size = 100
	}
	if r.Size > 20000 {
		r.Size = 20000
	}

	queryString := query.GetSumIpQuery(r)
	fmt.Println(queryString)
	index := "keyword_search_log_1"
	esResult, err := es.CurlES(index, queryString)
	if err != nil {
		return
	}
	buckets := gjson.Get(esResult, "aggregations.tatol.buckets").Array()
	for _, bucket := range buckets {
		item := map[string]interface{}{
			"ip":  bucket.Map()["key"].String(),
			"num": bucket.Map()["doc_count"].Int(),
		}
		res = append(res, item)
	}
	return
}