package o11yroute

import (
	"context"

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

type O11yRouteReaderWriter interface {
	O11yRouteReader
	O11yRouteWriter
}

type O11yRouteWriter interface {
	Create(ctx context.Context, o11yRoute *v1alpha1.O11yRoute) error
	Update(ctx context.Context, o11yRoute *v1alpha1.O11yRoute) error
	Delete(ctx context.Context, o11yRoute *v1alpha1.O11yRoute, opts ...client.DeleteOption) error
	UpdateStatus(ctx context.Context, o11yRoute *v1alpha1.O11yRoute) error
}

type O11yRouteReader interface {
	Get(ctx context.Context, key client.ObjectKey, o11yroute *v1alpha1.O11yRoute) error
	List(ctx context.Context, list *v1alpha1.O11yRouteList, opts ...client.ListOption) error
}

func NewO11yRouteReaderWriter(cli client.Client) O11yRouteReaderWriter {
	return &o11yRouteReaderWriter{
		o11yRouteReader: o11yRouteReader{cli},
		o11yRouteWriter: o11yRouteWriter{cli},
	}
}

func NewO11yRouteReader(cli client.Client) O11yRouteReader {
	return &o11yRouteReader{
		readCli: cli,
	}
}

func NewO11yRouteWriter(cli client.Client) O11yRouteWriter {
	return &o11yRouteWriter{
		cli: cli,
	}
}

type o11yRouteReaderWriter struct {
	o11yRouteReader
	o11yRouteWriter
}

type o11yRouteWriter struct {
	cli client.Client
}

func (w *o11yRouteWriter) Create(ctx context.Context, o11yRoute *v1alpha1.O11yRoute) error {
	return w.cli.Create(ctx, o11yRoute)
}
func (w *o11yRouteWriter) Update(ctx context.Context, o11yRoute *v1alpha1.O11yRoute) error {
	return w.cli.Update(ctx, o11yRoute)
}

func (w *o11yRouteWriter) Delete(ctx context.Context, o11yRoute *v1alpha1.O11yRoute, opts ...client.DeleteOption) error {
	return w.cli.Delete(ctx, o11yRoute, opts...)
}
func (w *o11yRouteWriter) UpdateStatus(ctx context.Context, o11yRoute *v1alpha1.O11yRoute) error {
	return w.cli.Status().Update(ctx, o11yRoute)
}

type o11yRouteReader struct {
	readCli client.Reader
}

func (a *o11yRouteReader) Get(ctx context.Context, key client.ObjectKey, o11yroute *v1alpha1.O11yRoute) error {
	return a.readCli.Get(ctx, key, o11yroute)
}
func (a *o11yRouteReader) List(ctx context.Context, list *v1alpha1.O11yRouteList, opts ...client.ListOption) error {
	return a.readCli.List(ctx, list, opts...)
}
