package slowlog

import (
	"github.com/elastic/go-elasticsearch/v6"
	"github.com/pingcap/log"
	"github.com/pingcap/tep/pkg/utils/es"
	"github.com/pingcap/tep/pkg/utils/es/query"
	"github.com/pingcap/tep/pkg/utils/es/query/slowlog_agg"
	"go.uber.org/zap"
	"k8s.io/apimachinery/pkg/api/errors"
)

func (s *SlowInstancesStorage) ListSlowAgg(ctx Context) (map[string]int, error) {
	c, err := es.GetClient(s.store.Conf)
	if err != nil {
		log.Error("get es client failed", zap.Error(err))
		return nil, errors.NewInternalError(err)
	}

	if ctx.Items == nil || len(ctx.Items) == 0 {
		return make(map[string]int), nil
	}

	r, err := searchSlowQueryAgg(c, ctx, s.store.Conf.SlowLogIndexPrefix)
	if err != nil {
		log.Error("query slow log failed", zap.Error(err))
		return nil, errors.NewInternalError(err)
	}

	return r.Agg(ctx.From)
}

func searchSlowQueryAgg(c *elasticsearch.Client, ctx Context, indexPrefix string) (*query.QueryResponse, error) {
	agg := slowlogagg.NewSlowAggQuery(
		slowlogagg.StartTimeInSec(ctx.StartTimeInSec),
		slowlogagg.EndTimeInSec(ctx.EndTimeInSec),
		slowlogagg.From(ctx.From),
		slowlogagg.Items(ctx.Items),
	)

	return agg.Do(c, indexPrefix)
}
