package handler

import (
	"context"

	"github.com/tidbcloud/observability/o11ymetering/pkg/common/constants"
	"github.com/tidbcloud/observability/o11ymetering/pkg/common/models"
	"github.com/tidbcloud/observability/o11ymetering/pkg/facade"
	"github.com/tidbcloud/observability/pkg/common/configs"
)

type ServerlessMetricCollection struct {
	Env constants.BizEnv
}

func (s ServerlessMetricCollection) Build(ctx context.Context, period string) (models.StatisticTask, error) {
	return models.StatisticTask{
		Region:         configs.GetServiceInfo().Region,
		StatisticClass: constants.MetricsCollection,
		MeteringGroup:  constants.Serverless,
		Env:            s.Env,
		Period:         period,
		State:          constants.StatePending,
	}, nil
}

var serverlessMetricQuery = `sum(scrape_samples_scraped{})` + queryByLabels

func (s ServerlessMetricCollection) Execute(ctx context.Context, task models.StatisticTask) ([]*models.StatisticRecord, error) {
	o11yCluster, err := facade.GetO11yMetaQuery().GetServerlessInfraCluster(ctx, s.Env)

	if err != nil {
		return []*models.StatisticRecord{}, err
	}

	resp, err := facade.GetO11yMetricsQuery().QueryO11yMetricsInstant(ctx, configs.GetServiceInfo().Vendor, configs.GetServiceInfo().Region, o11yCluster.ID, convertPeriodToTimestamp(task.Period), serverlessMetricQuery, task.Env)

	if err != nil {
		return nil, err
	}

	records := convertMetricCollectionRespToRecords(constants.MetricsTimeseriesCount, constants.Metrics, resp, task)
	return records, nil
}
