package appbox

import (
	"context"

	"github.com/tidbcloud/infra-provider/regional-server/api/v1alpha1"
	"sigs.k8s.io/controller-runtime/pkg/client"
)

type APPBoxReaderWriter interface {
	APPBoxReader
	APPBoxWriter
}

type APPBoxWriter interface {
	Create(ctx context.Context, appBox *v1alpha1.APPBox) error
	Update(ctx context.Context, appBox *v1alpha1.APPBox) error
	Delete(ctx context.Context, appBox *v1alpha1.APPBox) error
	UpdateStatus(ctx context.Context, appBox *v1alpha1.APPBox) error
}

type APPBoxReader interface {
	Get(ctx context.Context, key client.ObjectKey, appBox *v1alpha1.APPBox) error
	List(ctx context.Context, list *v1alpha1.APPBoxList, opts ...client.ListOption) error
}

func NewAPPBoxReaderWriter(cli client.Client) APPBoxReaderWriter {
	return &appBoxReaderWriter{
		appBoxReader: appBoxReader{cli},
		appBoxWriter: appBoxWriter{cli},
	}
}

func NewAPPBoxReader(cli client.Client) APPBoxReader {
	return &appBoxReader{
		readCli: cli,
	}
}

func NewAPPBoxWriter(cli client.Client) APPBoxWriter {
	return &appBoxWriter{
		cli: cli,
	}
}

type appBoxReaderWriter struct {
	appBoxReader
	appBoxWriter
}

type appBoxWriter struct {
	cli client.Client
}

func (a *appBoxWriter) Create(ctx context.Context, appBox *v1alpha1.APPBox) error {
	return a.cli.Create(ctx, appBox)
}
func (a *appBoxWriter) Update(ctx context.Context, appBox *v1alpha1.APPBox) error {
	return a.cli.Update(ctx, appBox)
}
func (a *appBoxWriter) Delete(ctx context.Context, appBox *v1alpha1.APPBox) error {
	return a.cli.Delete(ctx, appBox)
}
func (a *appBoxWriter) UpdateStatus(ctx context.Context, appBox *v1alpha1.APPBox) error {
	return a.cli.Status().Update(ctx, appBox)
}

type appBoxReader struct {
	readCli client.Reader
}

func (a *appBoxReader) Get(ctx context.Context, key client.ObjectKey, appBox *v1alpha1.APPBox) error {
	return a.readCli.Get(ctx, key, appBox)
}
func (a *appBoxReader) List(ctx context.Context, list *v1alpha1.APPBoxList, opts ...client.ListOption) error {
	return a.readCli.List(ctx, list, opts...)
}
