package upgradeoperation

import (
	"context"

	"sigs.k8s.io/controller-runtime/pkg/client"

	"github.com/tidbcloud/infra-provider/regional-server/api/v1alpha1"
)

type ReaderWriter interface {
	Reader
	Writer
}

type Writer interface {
	Create(ctx context.Context, uo *v1alpha1.UpgradeOperation) error
	Update(ctx context.Context, uo *v1alpha1.UpgradeOperation) error
	Delete(ctx context.Context, uo *v1alpha1.UpgradeOperation) error
	UpdateStatus(ctx context.Context, uo *v1alpha1.UpgradeOperation) error
}

type Reader interface {
	Get(ctx context.Context, key client.ObjectKey, uo *v1alpha1.UpgradeOperation) error
	List(ctx context.Context, list *v1alpha1.UpgradeOperationList, opts ...client.ListOption) error
}

func NewReaderWriter(cli client.Client) ReaderWriter {
	return &readerWriter{
		reader: reader{cli},
		writer: writer{cli},
	}
}

func NewReader(cli client.Client) Reader {
	return &reader{
		readCli: cli,
	}
}

func NewWriter(cli client.Client) Writer {
	return &writer{
		cli: cli,
	}
}

type readerWriter struct {
	reader
	writer
}

type writer struct {
	cli client.Client
}

func (w *writer) Create(ctx context.Context, uo *v1alpha1.UpgradeOperation) error {
	return w.cli.Create(ctx, uo)
}
func (w *writer) Update(ctx context.Context, uo *v1alpha1.UpgradeOperation) error {
	return w.cli.Update(ctx, uo)
}
func (w *writer) Delete(ctx context.Context, uo *v1alpha1.UpgradeOperation) error {
	return w.cli.Delete(ctx, uo)
}
func (w *writer) UpdateStatus(ctx context.Context, uo *v1alpha1.UpgradeOperation) error {
	return w.cli.Status().Update(ctx, uo)
}

type reader struct {
	readCli client.Reader
}

func (r *reader) Get(ctx context.Context, key client.ObjectKey, uo *v1alpha1.UpgradeOperation) error {
	return r.readCli.Get(ctx, key, uo)
}
func (r *reader) List(ctx context.Context, list *v1alpha1.UpgradeOperationList, opts ...client.ListOption) error {
	return r.readCli.List(ctx, list, opts...)
}
