package k8s

import (
	"context"
	"time"

	apierrors "k8s.io/apimachinery/pkg/api/errors"
	"sigs.k8s.io/controller-runtime/pkg/client"
	"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"

	reconcileerr "github.com/tidbcloud/infra-provider/pkg/controllers/common/error"
)

// CreateIgnoreExists create the obj and ignore the already exists error.
func CreateIgnoreExists(ctx context.Context, cli client.Client, obj client.Object, opts ...client.CreateOption) (controllerutil.OperationResult, error) {
	err := cli.Create(ctx, obj, opts...)

	if err != nil {
		if !apierrors.IsAlreadyExists(err) {
			return controllerutil.OperationResultNone, err
		} else {
			return controllerutil.OperationResultNone, nil
		}
	}

	return controllerutil.OperationResultCreated, err
}

func RequeueIf(err error, predicate func(error) bool, duration time.Duration) error {
	if err == nil {
		return nil
	}
	if predicate(err) {
		return reconcileerr.New(duration, err)
	}
	return err
}
