package elastic

import (
	"context"
	"encoding/json"
	"errors"
	"fmt"
	"github.com/olivere/elastic/v7"
	"hongze/hongze_yb/global"
	"hongze/hongze_yb/utils"
)

// 首页搜索
func SearchReport(keyWord string, classifyIdList []int, pageIndex, pageSize int) (searchResp *elastic.SearchResult, total int64, err error) {
	indexName := global.CONFIG.EsClient.Prefix + utils.ES_INDEX_RDDP_REPORT
	var must []map[string]interface{}

	shouldSub := []map[string]interface{}{
		/*map[string]interface{}{
			"match": map[string]interface{}{
				"Title": map[string]interface{}{
					"query": keyWord,
				//"minimum_should_match": "60%",
					"boost": 3,
				},
			},
		},
		map[string]interface{}{
			"match": map[string]interface{}{
				"Categories": map[string]interface{}{
					"query": keyWord,
					//"minimum_should_match": "60%",
					"boost": 2,
				},
			},
		},
		map[string]interface{}{
			"match": map[string]interface{}{
				"BodyContent": map[string]interface{}{
					"query": keyWord,
					//"minimum_should_match": "60%",
					"boost": 1,
				},
			},
		},*/
		map[string]interface{}{
			"match_phrase": map[string]interface{}{
				"Title": map[string]interface{}{
					"query": keyWord,
					//"slop": "50",
					"boost": 5,
				},
			},
		},
		map[string]interface{}{
			"match_phrase": map[string]interface{}{
				"Categories": map[string]interface{}{
					"query": keyWord,
					"boost": 4,
				},
			},
		},
		map[string]interface{}{
			"match_phrase": map[string]interface{}{
				"BodyContent": map[string]interface{}{
					"query": keyWord,
					"boost": 3,
				},
			},
		},
	}
	mustMap := map[string]interface{}{
		"bool": map[string]interface{}{
			"should": shouldSub,
		},
	}
	must = append(must, mustMap)
	filterMust := []map[string]interface{}{
		map[string]interface{}{
			"term": map[string]interface{}{
				"PublishState": 2, //必须是已发布的报告
			},
		},
		map[string]interface{}{
			"terms": map[string]interface{}{
				"ClassifyId": classifyIdList, //分类必须是正常显示状态
			},
		},
	}
	filterMustNot := []map[string]interface{}{
		map[string]interface{}{
			"term": map[string]interface{}{
				"BodyContent.keyword": map[string]interface{}{
					"value": "", //过滤没有内容的报告（晨报和周报）bodyContent 不能为空
				},
			},
		},
		map[string]interface{}{
			"term": map[string]interface{}{
				"IsPublicPublish": 2, //过滤非公开发布的报告
			},
		},
	}

	//某章节的报告，若是继承上一期的报告内容且未作修改，搜索匹配项仅展示最新一期该章节的报告。 需求池p2_838
	filteCollapse := map[string]interface{}{
		"field": "BodyMd5",
	}
	filterMap := map[string]interface{}{
		"bool": map[string]interface{}{
			"must":     filterMust,
			"must_not": filterMustNot,
		},
	}
	source := map[string]interface{}{
		"query": map[string]interface{}{
			"bool": map[string]interface{}{
				"must":   must,
				"filter": filterMap,
			},
		},
	}

	source["from"] = (pageIndex - 1) * pageSize
	source["size"] = pageSize
	source["collapse"] = filteCollapse
	source["highlight"] = map[string]interface{}{
		"fields": map[string]interface{}{
			"Title":       map[string]interface{}{},
			"Categories":  map[string]interface{}{},
			"BodyContent": map[string]interface{}{
				//	"pre_tags" : "{{highlight}}",
				//	"post_tags": "{{/highlight}}",
			},
		},
		"pre_tags":  "<span style=\"color:#E3B377\">",
		"post_tags": "</span>",
	}

	source["sort"] = []map[string]interface{}{
		map[string]interface{}{
			"PublishTime.keyword": map[string]interface{}{
				"order": "desc",
			},
		},
		map[string]interface{}{
			"_score": map[string]interface{}{
				"order": "desc",
			},
		},
	}
	jsonstr, err := json.Marshal(source)
	fmt.Printf("%s", jsonstr)
	request := global.EsClient.Search(indexName).Source(source) // sets the JSON request

	searchResp, err = request.Do(context.Background())
	if err != nil {
		fmt.Print("结果err：")
		fmt.Println(err.Error())
		return
	}

	fmt.Print("结果正常：")
	fmt.Println(searchResp.Status)
	if searchResp.Status != 0 {
		err = errors.New("查询失败")
	}
	total = searchResp.TotalHits()
	return
}

// ReportListSearch 报告列表页的搜索
func ReportListSearch(keyWord string, classifyIdFirst int, classifyIdSeconds []int, pageIndex, pageSize int) (searchResp *elastic.SearchResult, total int64, err error) {
	indexName := global.CONFIG.EsClient.Prefix + utils.ES_INDEX_RDDP_REPORT
	var must []map[string]interface{}
	shouldSub := []map[string]interface{}{
		map[string]interface{}{
			"match": map[string]interface{}{
				"Title": map[string]interface{}{
					"query": keyWord,
					"boost": 3,
				},
			},
		},
		map[string]interface{}{
			"match": map[string]interface{}{
				"StageStr": map[string]interface{}{
					"query": keyWord,
					"boost": 2,
				},
			},
		},
		map[string]interface{}{
			"match": map[string]interface{}{
				"Abstract": map[string]interface{}{
					"query": keyWord,
					"boost": 2,
				},
			},
		},
		map[string]interface{}{
			"match": map[string]interface{}{
				"ClassifyNameSecond": map[string]interface{}{
					"query": keyWord,
					"boost": 2,
				},
			},
		},
		map[string]interface{}{
			"match_phrase": map[string]interface{}{
				"Title": map[string]interface{}{
					"query": keyWord,
					//"slop": "50",
					"boost": 5,
				},
			},
		},
		map[string]interface{}{
			"match_phrase": map[string]interface{}{
				"Abstract": map[string]interface{}{
					"query": keyWord,
					//"slop": "50",
					"boost": 5,
				},
			},
		},
	}
	mustMap := map[string]interface{}{
		"bool": map[string]interface{}{
			"should": shouldSub,
		},
	}
	must = append(must, mustMap)

	filter := []map[string]interface{}{
		map[string]interface{}{
			"term": map[string]interface{}{
				"PublishState": 2,
			},
		},
		map[string]interface{}{
			"term": map[string]interface{}{
				"ReportChapterId": 0, //排除章节内容
			},
		},
		map[string]interface{}{
			"term": map[string]interface{}{
				"ClassifyIdFirst": classifyIdFirst,
			},
		},
		map[string]interface{}{
			"terms": map[string]interface{}{
				"ClassifyIdSecond": classifyIdSeconds,
			},
		},
	}

	filterMustNot := []map[string]interface{}{
		map[string]interface{}{
			"term": map[string]interface{}{
				"IsPublicPublish": 2, //过滤非公开发布的报告
			},
		},
	}

	filterMap := map[string]interface{}{
		"bool": map[string]interface{}{
			"must":     filter,
			"must_not": filterMustNot,
		},
	}
	source := map[string]interface{}{
		"query": map[string]interface{}{
			"bool": map[string]interface{}{
				"must":   must,
				"filter": filterMap,
			},
		},
	}

	source["from"] = (pageIndex - 1) * pageSize
	source["size"] = pageSize
	source["highlight"] = map[string]interface{}{
		"fields": map[string]interface{}{
			"Title":              map[string]interface{}{},
			"Abstract":           map[string]interface{}{},
			"StageStr":           map[string]interface{}{},
			"ClassifyNameSecond": map[string]interface{}{},
		},
		"pre_tags":  "<span style=\"color:#E3B377\">",
		"post_tags": "</span>",
	}

	source["sort"] = []map[string]interface{}{
		map[string]interface{}{
			"PublishTime.keyword": map[string]interface{}{
				"order": "desc",
			},
		},
		map[string]interface{}{
			"_score": map[string]interface{}{
				"order": "desc",
			},
		},
	}
	jsonstr, err := json.Marshal(source)
	fmt.Printf("%s", jsonstr)
	request := global.EsClient.Search(indexName).Source(source) // sets the JSON request
	searchResp, err = request.Do(context.Background())
	if err != nil {
		fmt.Print("结果err：")
		fmt.Println(err.Error())
		return
	}

	fmt.Print("结果正常：")
	fmt.Println(searchResp.Status)
	if searchResp.Status != 0 {
		err = errors.New("查询失败")
	}
	total = searchResp.TotalHits()
	return
}
