// Package nodescorer
//
//nolint:dupl // ignore duplicate code
package nodescorer

import (
	"strconv"
	"time"
)

func (ns *NodeScorer) getMemIdle(tidbPoolNodes map[string]bool) (idleMetric map[string]float32, err error) {
	base10 := 10
	v := map[string]string{
		"query": `avg_over_time(node_memory_MemAvailable_bytes[1m])/node_memory_MemTotal_bytes`,
		"start": strconv.FormatInt(time.Now().Unix(), base10),
		"step":  "1m",
	}
	resp, err := ns.o11yQuerier.QueryRangeMetrics(ns.ctx, "/api/v1/query_range", v)
	if err != nil {
		return
	}

	idleMetric = make(map[string]float32, len(tidbPoolNodes))
	for _, r := range resp.Data.Result {
		nodeName := r.Metric["instance"]
		if len(r.Values) > 0 && tidbPoolNodes[nodeName] {
			idleStr := r.Values[len(r.Values)-1][1].(string)
			idle, err := strconv.ParseFloat(idleStr, 64)
			if err != nil {
				ns.Error(err, "ParseFloat mem err, skip", "node name", nodeName, "idleStr", idleStr)
				continue
			}
			idleMetric[nodeName] = float32(idle)
		}
	}
	return
}
