package network

import (
	"context"
	"fmt"

	"sigs.k8s.io/controller-runtime/pkg/client"

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

func (r *Reconciler) initStatus(ctx context.Context, net *cloudv1.Network) error {
	isChanged := false
	if net.Status.Phase == "" {
		net.Status.Phase = cloudv1.NetworkPhaseCreating
		isChanged = true
	}

	if net.DeletionTimestamp != nil && net.Status.Phase != cloudv1.NetworkPhaseDeleting {
		cleaned, err := r.isResourceCleaned(ctx, net)
		if err != nil {
			return err
		}
		if cleaned {
			net.Status.Phase = cloudv1.NetworkPhaseDeleting
			isChanged = true
		} else if net.Status.Phase != cloudv1.NetworkPhasePendingDelete {
			net.Status.Phase = cloudv1.NetworkPhasePendingDelete
			isChanged = true
		}
	}

	if isChanged {
		if err := r.InfraClient.Status().Update(ctx, net); err != nil {
			return fmt.Errorf(
				"update network %s phase to %s failed: %w",
				client.ObjectKeyFromObject(net),
				net.Status.Phase,
				err,
			)
		}
	}

	return nil
}

func (r *Reconciler) finalizeStatus(ctx context.Context, net *cloudv1.Network) error {
	net.Status.Phase = cloudv1.NetworkPhaseNormal
	if err := r.InfraClient.Status().Update(ctx, net); err != nil {
		return fmt.Errorf("sync network %s status failed: %w", client.ObjectKeyFromObject(net), err)
	}

	return nil
}
