package networkconnection

import (
	"context"
	"time"

	"k8s.io/apimachinery/pkg/types"
	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/api/v1alpha1"
	"github.com/tidbcloud/eks-provider/controllers/networkconnection/task"
	"github.com/tidbcloud/infra-provider/pkg/deploy"
)

func updateCreatePLEndpoint(ctx context.Context, t *task.Context, results []deploy.Result) (res ctrl.Result, err error) {
	res, err, retriableErrs := deploy.MinRequeue(results)
	switch phase := t.PLEndpoint.Status.Phase; phase {
	case v1alpha1.PrivateLinkEndpointPhaseCreating:
		if err == nil && retriableErrs == nil {
			log.FromContext(ctx).Info("mark become running when creating private link endpoint", "sinceCreate", time.Since(t.PLEndpoint.CreationTimestamp.Time))
			t.PLEndpoint.Status.Phase = v1alpha1.PrivateLinkEndpointPhaseRunning
		}
	default:
	}
	if err := updatePLEndpoint(ctx, t.Local, t.PLEndpoint); err != nil {
		return res, err
	}
	return
}

func updateDeletePLEndpoint(ctx context.Context, t *task.Context, results []deploy.Result) (res ctrl.Result, err error) {
	// If the network is pending delete, then the deletion tasks are not actually performed
	res, err, retriableErrs := deploy.MinRequeue(results)
	if err == nil && retriableErrs == nil {
		controllerutil.RemoveFinalizer(t.PLEndpoint, task.Finalizer)
	}
	if err := updatePLEndpoint(ctx, t.Local, t.PLEndpoint); err != nil {
		return res, err
	}
	return
}

func updatePLEndpoint(ctx context.Context, cli client.Client, plEndpoint *v1alpha1.PrivateLinkEndpoint) error {
	plEndpointStatus := plEndpoint.Status.DeepCopy()
	if err := cli.Update(ctx, plEndpoint); err != nil {
		return err
	}
	if err := cli.Get(ctx, types.NamespacedName{Name: plEndpoint.Name, Namespace: plEndpoint.Namespace}, plEndpoint); err != nil {
		return err
	}
	plEndpoint.Status = *plEndpointStatus
	return cli.Status().Update(ctx, plEndpoint)
}
