// Package imports add by blacknc <blacknc@163.com> at 2024/08/28 00:53:45
package imports

import (
	"context"

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

	"github.com/tidbcloud/eks-provider/controllers/imports/task"
	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
	"github.com/tidbcloud/infra-provider/pkg/deploy"
	"github.com/tidbcloud/infra-provider/pkg/o11y/tracing"
)

func updateCreate(ctx context.Context, t *task.Context, results []deploy.Result) (res ctrl.Result, err error) {
	var retriableErr error
	res, err, retriableErr = deploy.MinRequeue(results)
	if retriableErr != nil {
		log.FromContext(ctx).Info("retriable error", "error", retriableErr)
	}
	if e := update(ctx, t.Local, t.Import, true); e != nil {
		return res, e
	}
	return res, err
}

func updateDelete(ctx context.Context, t *task.Context, results []deploy.Result) (res ctrl.Result, err error) {
	var deleted bool
	var retriableErr error
	res, err, retriableErr = deploy.MinRequeue(results)
	if err == nil && retriableErr == nil {
		deleted = true
	}
	if deleted {
		controllerutil.RemoveFinalizer(t.Import, task.Finalizer)
	}
	if e := update(ctx, t.Local, t.Import, !deleted); e != nil {
		return res, e
	}
	return res, err
}

func update(ctx context.Context, cli client.Client, importCR *cloudv1.Import, updateStatus bool) error {
	tracing.InjectTraceContext(ctx, importCR)

	importStatus := importCR.Status.DeepCopy()
	if err := cli.Update(ctx, importCR); err != nil {
		return err
	}
	if updateStatus {
		importCR.Status = *importStatus
		return cli.Status().Update(ctx, importCR)
	}

	return nil
}
