package resourcemanager

import (
	"context"

	apierrors "k8s.io/apimachinery/pkg/api/errors"

	v1 "github.com/tidbcloud/observability/api/regionalserver/resourceworker/v1"
	"github.com/tidbcloud/observability/pkg/common/constants"
	"github.com/tidbcloud/observability/pkg/common/errors"
	"sigs.k8s.io/controller-runtime/pkg/client"
)

type objectStorageReaderWriter struct {
	cli client.Client
}

func (p objectStorageReaderWriter) CreateObjectStorage(ctx context.Context, data *v1.S3) error {
	err := p.cli.Create(ctx, data)
	if err != nil && apierrors.IsAlreadyExists(err) {
		return errors.New(errors.DuplicatedBucketName, err.Error())
	}
	return WrapClientError(err)
}

func (p objectStorageReaderWriter) IsObjectStorageExisted(ctx context.Context, bucketName string) (bool, error) {
	err := p.cli.Get(ctx, client.ObjectKey{
		Name:      bucketName,
		Namespace: constants.ObservabilityNamespace,
	}, new(v1.S3))

	if err == nil {
		return true, nil
	} else if client.IgnoreNotFound(err) == nil {
		return false, nil
	} else {
		return false, WrapClientError(err)
	}
}

func (p objectStorageReaderWriter) GetObjectStorage(ctx context.Context, bucketName string) (data *v1.S3, err error) {
	data = new(v1.S3)
	err = p.cli.Get(ctx, client.ObjectKey{
		Name:      bucketName,
		Namespace: constants.ObservabilityNamespace,
	}, data)

	if err != nil && client.IgnoreNotFound(err) == nil {
		err = errors.NewErrorf(errors.BucketNotFound, "storage bucket %s is not found", bucketName)
		return data, err
	}
	return data, WrapClientError(err)
}
