package k8s

import (
	"context"

	"sigs.k8s.io/controller-runtime/pkg/client"
	"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
)

// MutClient is a client that can mutate the owner of the object when Create/Update.
type MutClient struct {
	client.Client
	owner client.Object
}

func NewMutClientWithOwner(c client.Client, owner client.Object) *MutClient {
	owner.SetNamespace("")
	return &MutClient{
		Client: c,
		owner:  owner,
	}
}

func (c *MutClient) Create(ctx context.Context, obj client.Object, opts ...client.CreateOption) error {
	if err := controllerutil.SetOwnerReference(c.owner, obj, c.Scheme()); err != nil {
		return err
	}
	return c.Client.Create(ctx, obj, opts...)
}

func (c *MutClient) Update(ctx context.Context, obj client.Object, opts ...client.UpdateOption) error {
	if err := controllerutil.SetOwnerReference(c.owner, obj, c.Scheme()); err != nil {
		return err
	}
	return c.Client.Update(ctx, obj, opts...)
}
