package backupusage

import (
	"context"
	"fmt"

	"github.com/pingcap/tep/pkg/apis/apiserver"
	store "github.com/pingcap/tep/pkg/registry/apiserver"
	"github.com/pingcap/tidb-operator/pkg/apis/pingcap/v1alpha1"
	"k8s.io/apimachinery/pkg/api/errors"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/runtime"
)

type Storage struct {
	store *store.Store
}

func NewStorage(store *store.Store) *Storage {
	return &Storage{
		store: store,
	}
}

func (s *Storage) Kind() string {
	return "TiDBClusterBackupUsage"
}

func (s *Storage) New() runtime.Object {
	return &apiserver.TiDBClusterBackupUsage{}
}

func (s *Storage) Get(ctx context.Context, name string, options *metav1.GetOptions) (runtime.Object, error) {
	var backupList *v1alpha1.BackupList
	var err error
	var total int64
	if backupList, err = s.store.Controller().ListBackups(name, metav1.ListOptions{}); err != nil {
		msg := fmt.Errorf("failed to list backups namespace [%s]. err: %v", name, err)
		return nil, errors.NewInternalError(msg)
	}
	for _, backup := range backupList.Items {
		total += backup.Status.BackupSize
	}
	return &apiserver.TiDBClusterBackupUsage{Usage: total}, nil
}

func (s *Storage) NewGetOptions() (runtime.Object, bool, string) {
	return &apiserver.TiDBClusterBackupUsage{}, true, ""
}

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