package privatelinkservice

import (
	"context"

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

type PrivateLinkServiceReaderWriter interface {
	PrivateLinkServiceReader
	PrivateLinkServiceWriter
}

type PrivateLinkServiceReader interface {
	Get(ctx context.Context, key client.ObjectKey, vpc *v1alpha1.PrivateLinkService) error
	List(ctx context.Context, list *v1alpha1.PrivateLinkServiceList, opts ...client.ListOption) error
}

type PrivateLinkServiceWriter interface {
	Create(ctx context.Context, vpc *v1alpha1.PrivateLinkService) error
	Update(ctx context.Context, vpc *v1alpha1.PrivateLinkService) error
	Delete(ctx context.Context, vpc *v1alpha1.PrivateLinkService) error
	UpdateStatus(ctx context.Context, vpc *v1alpha1.PrivateLinkService) error
}

func NewPrivateLinkServiceReaderWriter(cli client.Client) PrivateLinkServiceReaderWriter {
	return &privateLinkServiceReaderWriter{
		privateLinkServiceReader: privateLinkServiceReader{cli},
		privateLinkServiceWriter: privateLinkServiceWriter{cli},
	}
}

func NewPrivateLinkServiceReader(cli client.Client) PrivateLinkServiceReader {
	return &privateLinkServiceReader{
		readCli: cli,
	}
}

func NewPrivateLinkServiceWriter(cli client.Client) PrivateLinkServiceWriter {
	return &privateLinkServiceWriter{
		cli: cli,
	}
}

type privateLinkServiceReaderWriter struct {
	privateLinkServiceReader
	privateLinkServiceWriter
}

type privateLinkServiceWriter struct {
	cli client.Client
}

func (w *privateLinkServiceWriter) Create(ctx context.Context, vpc *v1alpha1.PrivateLinkService) error {
	return w.cli.Create(ctx, vpc)
}

func (w *privateLinkServiceWriter) Update(ctx context.Context, vpc *v1alpha1.PrivateLinkService) error {
	return w.cli.Update(ctx, vpc)
}

func (w *privateLinkServiceWriter) Delete(ctx context.Context, vpc *v1alpha1.PrivateLinkService) error {
	return w.cli.Delete(ctx, vpc)
}

func (w *privateLinkServiceWriter) UpdateStatus(ctx context.Context, vpc *v1alpha1.PrivateLinkService) error {
	return w.cli.Status().Update(ctx, vpc)
}

type privateLinkServiceReader struct {
	readCli client.Client
}

func (r *privateLinkServiceReader) Get(ctx context.Context, key client.ObjectKey, vpc *v1alpha1.PrivateLinkService) error {
	return r.readCli.Get(ctx, key, vpc)
}

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