package privatelinkservicemigration

import (
	"context"

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

type PrivateLinkServiceMigrationReaderWriter interface {
	PrivateLinkServiceMigrationReader
	PrivateLinkServiceMigrationWriter
}

type PrivateLinkServiceMigrationReader interface {
	Get(ctx context.Context, key client.ObjectKey, plsm *v1alpha1.PrivateLinkServiceMigration) error
	List(ctx context.Context, list *v1alpha1.PrivateLinkServiceMigrationList, opts ...client.ListOption) error
}

type PrivateLinkServiceMigrationWriter interface {
	Create(ctx context.Context, plsm *v1alpha1.PrivateLinkServiceMigration) error
	Update(ctx context.Context, plsm *v1alpha1.PrivateLinkServiceMigration) error
	Delete(ctx context.Context, plsm *v1alpha1.PrivateLinkServiceMigration) error
	UpdateStatus(ctx context.Context, plsm *v1alpha1.PrivateLinkServiceMigration) error
}

func NewPrivateLinkServiceMigrationReaderWriter(cli client.Client) PrivateLinkServiceMigrationReaderWriter {
	return &privateLinkServiceMigrationReaderWriter{
		privateLinkServiceMigrationReader: privateLinkServiceMigrationReader{cli},
		privateLinkServiceMigrationWriter: privateLinkServiceMigrationWriter{cli},
	}
}

func NewPrivateLinkServiceMigrationReader(cli client.Client) PrivateLinkServiceMigrationReader {
	return &privateLinkServiceMigrationReader{
		readCli: cli,
	}
}

func NewPrivateLinkServiceMigrationWriter(cli client.Client) PrivateLinkServiceMigrationWriter {
	return &privateLinkServiceMigrationWriter{
		cli: cli,
	}
}

type privateLinkServiceMigrationReaderWriter struct {
	privateLinkServiceMigrationReader
	privateLinkServiceMigrationWriter
}

type privateLinkServiceMigrationWriter struct {
	cli client.Client
}

func (w *privateLinkServiceMigrationWriter) Create(ctx context.Context, plsm *v1alpha1.PrivateLinkServiceMigration) error {
	return w.cli.Create(ctx, plsm)
}

func (w *privateLinkServiceMigrationWriter) Update(ctx context.Context, plsm *v1alpha1.PrivateLinkServiceMigration) error {
	return w.cli.Update(ctx, plsm)
}

func (w *privateLinkServiceMigrationWriter) Delete(ctx context.Context, plsm *v1alpha1.PrivateLinkServiceMigration) error {
	return w.cli.Delete(ctx, plsm)
}

func (w *privateLinkServiceMigrationWriter) UpdateStatus(ctx context.Context, plsm *v1alpha1.PrivateLinkServiceMigration) error {
	return w.cli.Status().Update(ctx, plsm)
}

type privateLinkServiceMigrationReader struct {
	readCli client.Client
}

func (r *privateLinkServiceMigrationReader) Get(ctx context.Context, key client.ObjectKey, plsm *v1alpha1.PrivateLinkServiceMigration) error {
	return r.readCli.Get(ctx, key, plsm)
}

func (r *privateLinkServiceMigrationReader) List(ctx context.Context, list *v1alpha1.PrivateLinkServiceMigrationList, opts ...client.ListOption) error {
	return r.readCli.List(ctx, list, opts...)
}
