package appbox

import (
	"context"

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

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 err == nil && retriableErr == nil {
		log.FromContext(ctx).Info("mark appBox active when creating")
		if t.APPBox.Status.Phase != v1alpha1.APPBoxPhaseReadyForDelete {
			t.APPBox.Status.Phase = v1alpha1.APPBoxPhaseActive
		}
	}

	if retriableErr != nil {
		log.FromContext(ctx).Info("retriable error", "error", retriableErr)
	}
	if e := update(ctx, t.APPBoxRW, t.APPBox); e != nil {
		return res, e
	}
	return res, err
}

func updateDelete(ctx context.Context, t *task.Context, results []deploy.Result) (ctrl.Result, error) {
	var deleted bool
	res, err, retriableErr := deploy.MinRequeue(results)
	if err == nil && retriableErr == nil {
		deleted = true
	}
	t.APPBox.Status.Phase = v1alpha1.APPBoxPhaseDeleting

	if retriableErr != nil {
		log.FromContext(ctx).Info("retriable error", "error", retriableErr)
	}

	if deleted {
		controllerutil.RemoveFinalizer(t.APPBox, task.Finalizer)
	}
	if e := update(ctx, t.APPBoxRW, t.APPBox); e != nil {
		return res, e
	}
	return res, err
}

func update(ctx context.Context, rw appbox.APPBoxReaderWriter, appBox *v1alpha1.APPBox) error {
	appBoxStatus := appBox.Status.DeepCopy()
	if err := rw.Update(ctx, appBox); err != nil {
		return err
	}
	appBox.Status = *appBoxStatus
	return rw.UpdateStatus(ctx, appBox)
}
