package networkpeer

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"

	cloudv1 "github.com/tidbcloud/infra-api/api/v1"

	"github.com/tidbcloud/eks-provider/controllers/networkpeer/task"
	"github.com/tidbcloud/infra-provider/pkg/deploy"
)

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 err := update(ctx, t.Local, t.NetworkPeer); err != nil {
		return res, err
	}
	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.NetworkPeer, task.Finalizer)
	}

	if err := update(ctx, t.Local, t.NetworkPeer); err != nil {
		return res, err
	}
	return
}

func update(ctx context.Context, cli client.Client, peer *cloudv1.NetworkPeer) error {
	status := peer.Status.DeepCopy()
	if err := cli.Update(ctx, peer); err != nil {
		return err
	}
	peer.Status = *status
	return cli.Status().Update(ctx, peer)
}
