package metrics

import (
	"context"
	"github.com/pingcap/tep/pkg/apis/apiserver"
	"github.com/pingcap/tep/pkg/metrics/provider"
	store "github.com/pingcap/tep/pkg/registry/apiserver"
	metainternalversion "k8s.io/apimachinery/pkg/apis/meta/internalversion"
	"k8s.io/apimachinery/pkg/runtime"
)

type SeriesStorage struct {
	store *store.Store
}

func NewSeriesStorage(store *store.Store) *SeriesStorage {
	return &SeriesStorage{
		store: store,
	}
}

func (s *SeriesStorage) Kind() string {
	return "Series"
}

func (s *SeriesStorage) New() runtime.Object {
	return &apiserver.MetricValue{}
}

func (s *SeriesStorage) NewList() runtime.Object {
	return &apiserver.MetricValueList{}
}

func (s *SeriesStorage) NamespaceScoped() bool {
	return false
}

func (s *SeriesStorage) NewExtraListOptions() runtime.Object {
	return &apiserver.MetricValueListOptions{}
}

func (s *SeriesStorage) List(ctx context.Context, options *metainternalversion.ListOptions, extraOptions runtime.Object) (runtime.Object, error) {
	o := extraOptions.(*apiserver.MetricValueListOptions)

	promProvider, err := s.getProvider(o)
	if err != nil {
		return nil, err
	}

	r, err := promProvider.Series(o.Query, o.StartTimeInSec, o.EndTimeInSec, provider.MetricInfo{Metric: "series"})
	if err != nil {
		return nil, err
	}

	return r, nil
}

func (s *SeriesStorage) getProvider(o *apiserver.MetricValueListOptions) (*provider.PrometheusProvider, error) {
	if o.Namespace == "" {
		return s.store.K8SMetricsProvider, nil
	}

	if len(o.Name) == 0 {
		o.Name = o.Namespace
	}

	return store.NewMetricsProvider(provider.GetTiDBPrometheusDNSName(o.Namespace, o.Name))
}
