package internet

import (
	"context"

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

type InternetReaderWriter interface {
	InternetReader
	InternetWriter
}

type InternetWriter interface {
	Create(ctx context.Context, internet *v1alpha1.Internet) error
	Update(ctx context.Context, internet *v1alpha1.Internet) error
	Delete(ctx context.Context, internet *v1alpha1.Internet) error
	UpdateStatus(ctx context.Context, internet *v1alpha1.Internet) error
}

type InternetReader interface {
	Get(ctx context.Context, key client.ObjectKey, internet *v1alpha1.Internet) error
	List(ctx context.Context, list *v1alpha1.InternetList, opts ...client.ListOption) error
}

func NewInternetReaderWriter(cli client.Client) InternetReaderWriter {
	return &internetReaderWriter{
		internetReader: internetReader{cli},
		internetWriter: internetWriter{cli},
	}
}

func NewInternetReader(cli client.Client) InternetReader {
	return &internetReader{
		readCli: cli,
	}
}

func NewInternetWriter(cli client.Client) InternetWriter {
	return &internetWriter{
		cli: cli,
	}
}

type internetReaderWriter struct {
	internetReader
	internetWriter
}

type internetWriter struct {
	cli client.Client
}

func (w *internetWriter) Create(ctx context.Context, internet *v1alpha1.Internet) error {
	return w.cli.Create(ctx, internet)
}

func (v *internetWriter) Update(ctx context.Context, internet *v1alpha1.Internet) error {
	return v.cli.Update(ctx, internet)
}

func (v *internetWriter) Delete(ctx context.Context, internet *v1alpha1.Internet) error {
	return v.cli.Delete(ctx, internet)
}

func (v *internetWriter) UpdateStatus(ctx context.Context, internet *v1alpha1.Internet) error {
	return v.cli.Status().Update(ctx, internet)
}

type internetReader struct {
	readCli client.Reader
}

func (r *internetReader) Get(ctx context.Context, key client.ObjectKey, internet *v1alpha1.Internet) error {
	return r.readCli.Get(ctx, key, internet)
}

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