package namespace

import (
	"context"

	corev1 "k8s.io/api/core/v1"
	"sigs.k8s.io/controller-runtime/pkg/client"
)

type NamespaceReaderWriter interface {
	NamespaceReader
	NamespaceWriter
}

type NamespaceWriter interface {
	Create(ctx context.Context, ns *corev1.Namespace) error
	Update(ctx context.Context, ns *corev1.Namespace) error
	Delete(ctx context.Context, ns *corev1.Namespace) error
	UpdateStatus(ctx context.Context, ns *corev1.Namespace) error
}

type NamespaceReader interface {
	Get(ctx context.Context, key client.ObjectKey, ns *corev1.Namespace) error
	List(ctx context.Context, list *corev1.NamespaceList, opts ...client.ListOption) error
}

func NewNamespaceReaderWriter(cli client.Client) NamespaceReaderWriter {
	return &namespaceReaderWriter{
		namespaceReader: namespaceReader{cli},
		namespaceWriter: namespaceWriter{cli},
	}
}

func NewNamespaceReader(cli client.Client) NamespaceReader {
	return &namespaceReader{
		readCli: cli,
	}
}

func NewNamespaceWriter(cli client.Client) NamespaceWriter {
	return &namespaceWriter{
		cli: cli,
	}
}

type namespaceReaderWriter struct {
	namespaceReader
	namespaceWriter
}

type namespaceReader struct {
	readCli client.Client
}

func (r *namespaceReader) Get(ctx context.Context, key client.ObjectKey, ns *corev1.Namespace) error {
	return r.readCli.Get(ctx, key, ns)
}

func (r *namespaceReader) List(ctx context.Context, list *corev1.NamespaceList, opts ...client.ListOption) error {
	return r.readCli.List(ctx, list, opts...)
}

type namespaceWriter struct {
	cli client.Client
}

func (w *namespaceWriter) Create(ctx context.Context, ns *corev1.Namespace) error {
	return w.cli.Create(ctx, ns)
}

func (w *namespaceWriter) Update(ctx context.Context, ns *corev1.Namespace) error {
	return w.cli.Update(ctx, ns)
}

func (w *namespaceWriter) Delete(ctx context.Context, ns *corev1.Namespace) error {
	return w.cli.Delete(ctx, ns)
}

func (w *namespaceWriter) UpdateStatus(ctx context.Context, ns *corev1.Namespace) error {
	return w.cli.Status().Update(ctx, ns)
}
