package approute

import (
	"context"

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

type APPRouteReaderWriter interface {
	APPRouteReader
	APPRouteWriter
}

type APPRouteWriter interface {
	Create(ctx context.Context, appRoute *v1alpha1.APPRoute) error
	Update(ctx context.Context, appRoute *v1alpha1.APPRoute) error
	Delete(ctx context.Context, appRoute *v1alpha1.APPRoute, opts ...client.DeleteOption) error
	UpdateStatus(ctx context.Context, appRoute *v1alpha1.APPRoute) error
}

type APPRouteReader interface {
	Get(ctx context.Context, key client.ObjectKey, approute *v1alpha1.APPRoute) error
	List(ctx context.Context, list *v1alpha1.APPRouteList, opts ...client.ListOption) error
}

func NewAPPRouteReaderWriter(cli client.Client) APPRouteReaderWriter {
	return &appRouteReaderWriter{
		appRouteReader: appRouteReader{cli},
		appRouteWriter: appRouteWriter{cli},
	}
}

func NewAPPRouteReader(cli client.Client) APPRouteReader {
	return &appRouteReader{
		readCli: cli,
	}
}

func NewAPPRouteWriter(cli client.Client) APPRouteWriter {
	return &appRouteWriter{
		cli: cli,
	}
}

type appRouteReaderWriter struct {
	appRouteReader
	appRouteWriter
}

type appRouteWriter struct {
	cli client.Client
}

func (w *appRouteWriter) Create(ctx context.Context, appRoute *v1alpha1.APPRoute) error {
	return w.cli.Create(ctx, appRoute)
}

func (w *appRouteWriter) Update(ctx context.Context, appRoute *v1alpha1.APPRoute) error {
	return w.cli.Update(ctx, appRoute)
}

func (w *appRouteWriter) Delete(ctx context.Context, appRoute *v1alpha1.APPRoute, opts ...client.DeleteOption) error {
	return w.cli.Delete(ctx, appRoute, opts...)
}

func (w *appRouteWriter) UpdateStatus(ctx context.Context, appRoute *v1alpha1.APPRoute) error {
	return w.cli.Status().Update(ctx, appRoute)
}

type appRouteReader struct {
	readCli client.Reader
}

func (a *appRouteReader) Get(ctx context.Context, key client.ObjectKey, approute *v1alpha1.APPRoute) error {
	return a.readCli.Get(ctx, key, approute)
}

func (a *appRouteReader) List(ctx context.Context, list *v1alpha1.APPRouteList, opts ...client.ListOption) error {
	return a.readCli.List(ctx, list, opts...)
}
