package vpcpeering

import (
	"context"

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

type VPCPeeringReaderWriter interface {
	VPCPeeringReader
	VPCPeeringWriter
}

type VPCPeeringWriter interface {
	Create(ctx context.Context, vpcPeering *v1alpha1.VPCPeering) error
	UpdateStatus(ctx context.Context, vpcPeering *v1alpha1.VPCPeering) error
}

type VPCPeeringReader interface {
	Get(ctx context.Context, key client.ObjectKey, vpc *v1alpha1.VPCPeering) error
	List(ctx context.Context, vpcPeering *v1alpha1.VPCPeeringList, opts ...client.ListOption) error
}

func NewVPCPeeringReaderWriter(cli client.Client) VPCPeeringReaderWriter {
	return &vpcPeeringReaderWriter{
		vpcPeeringReader: vpcPeeringReader{cli},
		vpcPeeringWriter: vpcPeeringWriter{cli},
	}
}

func NewVPCPeeringReader(cli client.Client) VPCPeeringReader {
	return &vpcPeeringReader{
		readCli: cli,
	}
}

func NewVPCPeeringWriter(cli client.Client) VPCPeeringWriter {
	return &vpcPeeringWriter{
		cli: cli,
	}
}

type vpcPeeringReaderWriter struct {
	vpcPeeringReader
	vpcPeeringWriter
}

type vpcPeeringWriter struct {
	cli client.Client
}

func (v *vpcPeeringWriter) Create(ctx context.Context, cr *v1alpha1.VPCPeering) error {
	return v.cli.Create(ctx, cr)
}

func (v *vpcPeeringWriter) UpdateStatus(ctx context.Context, cr *v1alpha1.VPCPeering) error {
	return v.cli.Status().Update(ctx, cr)
}

type vpcPeeringReader struct {
	readCli client.Reader
}

func (c *vpcPeeringReader) Get(ctx context.Context, key client.ObjectKey, cr *v1alpha1.VPCPeering) error {
	return c.readCli.Get(ctx, key, cr)
}

func (c *vpcPeeringReader) List(ctx context.Context, cr *v1alpha1.VPCPeeringList, opts ...client.ListOption) error {
	return c.readCli.List(ctx, cr, opts...)
}
