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

import (
	"context"
	"fmt"
	"strconv"
	"time"
)

func (r *Reconciler) getMemDelta(ctx context.Context, nodeName, interval string) ([]podDelta, error) {
	base10 := 10
	v := map[string]string{
		//nolint:lll // ignore long line
		"query": fmt.Sprintf(`delta(avg_over_time(container_memory_working_set_bytes{node="%s",image="",pod=~"tidb-server-.*"}[%s])[%s])`, nodeName, interval, interval),
		"start": strconv.FormatInt(time.Now().Unix(), base10),
		"step":  "1m",
	}
	resp, err := r.o11yQuerier.QueryRangeMetrics(ctx, "/api/v1/query_range", v)
	if err != nil {
		return nil, err
	}

	if len(resp.Data.Result) == 0 {
		return nil, ErrNoMetric
	}

	result := make([]podDelta, 0, len(resp.Data.Result))
	for _, rlt := range resp.Data.Result {
		if len(rlt.Values) == 0 {
			return nil, ErrNoMetric
		}
		value, err := strconv.ParseFloat(rlt.Values[len(rlt.Values)-1][1].(string), 64)
		if err != nil {
			return nil, err
		}
		result = append(result, podDelta{rlt.Metric["namespace"], rlt.Metric["pod"], float32(value)})
	}

	return result, nil
}

func (r *Reconciler) getMemUsage(ctx context.Context, nodeName, interval string) (map[string]float32, error) {
	base10 := 10
	v := map[string]string{
		//nolint:lll // ignore long line
		"query": fmt.Sprintf(`avg_over_time(container_memory_working_set_bytes{node="%s",image="",pod=~"tidb-server-.*"}[%s])/scalar(node_memory_MemTotal_bytes{instance="%s"})`, nodeName, interval, nodeName),
		"start": strconv.FormatInt(time.Now().Unix(), base10),
		"step":  "1m",
	}
	resp, err := r.o11yQuerier.QueryRangeMetrics(ctx, "/api/v1/query_range", v)
	if err != nil {
		return nil, err
	}

	if len(resp.Data.Result) == 0 {
		return nil, ErrNoMetric
	}

	result := make(map[string]float32, len(resp.Data.Result))
	for _, rlt := range resp.Data.Result {
		if len(rlt.Values) == 0 {
			return nil, ErrNoMetric
		}
		usage, err := strconv.ParseFloat(rlt.Values[len(rlt.Values)-1][1].(string), 64)
		if err != nil {
			return result, err
		}
		result[rlt.Metric["namespace"]+"/"+rlt.Metric["pod"]] = float32(usage)
	}

	return result, nil
}
