package common

import (
	"context"
	"time"

	"github.com/tidbcloud/infra-provider/regional-server/api/v1alpha1"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/controllers/privatelinkendpoint/task"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/deploy"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/util"
	"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
)

// Guardian adds and removes the finalizer of the PrivateLinkEndpoint.
type Guardian struct {
	*task.BaseTask
}

func NewGuardian(ctx *task.Context) *Guardian {
	return &Guardian{BaseTask: &task.BaseTask{Context: ctx}}
}

func (t *Guardian) Name() string {
	return "Guardian"
}

func (t *Guardian) Create(ctx context.Context) deploy.Result {
	t.BeginAt = util.Pointer(time.Now())
	// TODO: check region
	// Add finalizer
	if !controllerutil.ContainsFinalizer(t.PrivateLinkEndpoint, v1alpha1.Finalizer) {
		controllerutil.AddFinalizer(t.PrivateLinkEndpoint, v1alpha1.Finalizer)
		// Require immediate requeue without running other tasks
		return deploy.Panic(nil).WithRequeuAfter(0)
	}

	defer func() {
		if err := t.PrivateLinkEndpointRW.UpdateStatus(ctx, t.PrivateLinkEndpoint); err != nil {
			t.Logger.Error(err, "failed to update internet status")
		}
	}()

	return deploy.Done()
}

func (t *Guardian) Delete(ctx context.Context) deploy.Result {
	return deploy.Done()
}
