/*GetData gets V1 data
Return entry
curl -XGET 'http://HOST:PORT/v1/data/NAME,
equivalent to curl -XGET 'http://HOST:PORT/v1/data?name=NAME'

curl -XGET 'http://HOST:PORT/v1/data/NAME,
*/
func GetData(w http.ResponseWriter, req *http.Request) {
	w.Header().Set("Content-Type", "application/json")
	//uses gorillatoolkit lib
	vars := mux.Vars(req)
	name := string(vars["name"])

	var err error
	var searchResult *elastic.SearchResult
	query := elastic.NewTermQuery("name", name)
	fmt.Println(fmt.Sprintf("[DEBUG] Querying metric %s", name))
	searchResult, err = Elastic.Search().Index("ammonitrix").Query(query).Do()
	if searchResult.Hits != nil && err == nil {
		fmt.Printf("Found a total of %d results\n", searchResult.Hits.TotalHits)
		var dataResponse []config.ElasticData
		for _, hit := range searchResult.Hits.Hits {
			// hit.Index contains the name of the index
			var d config.ElasticData
			d.UnmarshalBytes(*hit.Source)
			fmt.Printf(fmt.Sprintf("[DEBUG] %s", d.Print()))
			dataResponse = append(dataResponse, d)
		}
		response := map[string]interface{}{"Result": "Success", "Data": dataResponse}
		fullResponse, _ := json.Marshal(response)
		fmt.Fprintln(w, string(fullResponse))
	} else {
		response := map[string]interface{}{"Result": "Fail"}
		fullResponse, _ := json.Marshal(response)
		fmt.Println(w, string(fullResponse))
	}
}
/*GetDataIndex lists all data and or queries them
Return all entries
curl -XGET 'http://HOST:PORT/v1/data

Can search for specific fields
curl -XGET 'http://HOST:PORT/v1/data?key=val&key2=val2'
*/
func GetDataIndex(w http.ResponseWriter, req *http.Request) {
	w.Header().Set("Content-Type", "application/json")
	var err error
	var searchResult *elastic.SearchResult
	query := elastic.NewBoolQuery()
	if len(req.URL.Query()) > 0 {
		for k, v := range req.URL.Query() {
			query = query.Must(elastic.NewTermQuery(k, v[0]))
		}
		searchResult, err = Elastic.Search().Index("ammonitrix").Query(query).Do()
	} else {
		searchResult, err = Elastic.Search().Index("ammonitrix").Query(elastic.NewMatchAllQuery()).Do()
	}
	if searchResult.Hits != nil && err == nil {
		fmt.Printf("Found a total of %d results\n", searchResult.Hits.TotalHits)
		var dataResponse []config.ElasticData
		for _, hit := range searchResult.Hits.Hits {
			// hit.Index contains the name of the index
			var d config.ElasticData
			d.UnmarshalBytes(*hit.Source)
			fmt.Printf(fmt.Sprintf("[DEBUG] %s", d.Print()))
			dataResponse = append(dataResponse, d)
		}
		response := map[string]interface{}{"Result": "Success", "Data": dataResponse}
		fullResponse, _ := json.Marshal(response)
		fmt.Fprintln(w, string(fullResponse))
	} else if searchResult.Hits == nil {
		response := map[string]interface{}{"Result": "No results"}
		fullResponse, _ := json.Marshal(response)
		fmt.Println(w, string(fullResponse))
	} else if err != nil {
		response := map[string]interface{}{"Result": "Fail"}
		fullResponse, _ := json.Marshal(response)
		fmt.Println(w, string(fullResponse))
	}
}