package route53

import (
	"context"
	"time"

	route53v1alpha1 "github.com/crossplane-contrib/provider-aws/apis/route53/v1alpha1"
	"github.com/crossplane/crossplane-runtime/pkg/meta"
	"github.com/pingcap/errors"
	apierrors "k8s.io/apimachinery/pkg/api/errors"
	"sigs.k8s.io/controller-runtime/pkg/client"

	"github.com/tidbcloud/infra-provider/pkg/k8s"
	crossplaneutil "github.com/tidbcloud/infra-provider/pkg/util/crossplane"
)

const RequeueAfter = 10 * time.Second

// ReconcilePause pauses a record after it becomes ready and synced.
// It returns true when the caller should requeue and try again later.
func ReconcilePause(ctx context.Context, cli client.Client, name string) (needsRequeue bool, err error) {
	rrs := &route53v1alpha1.ResourceRecordSet{}
	if err := cli.Get(ctx, client.ObjectKey{Name: name}, rrs); err != nil {
		if apierrors.IsNotFound(err) {
			return true, nil
		}
		return false, errors.Wrapf(err, "get Route53 record %s", name)
	}
	if meta.IsPaused(rrs) {
		return false, nil
	}
	if !crossplaneutil.IsReadyAndSynced(rrs.Status.Conditions) {
		return true, nil
	}
	if err := k8s.PauseCrossplaneCR(ctx, cli, rrs); err != nil {
		return false, errors.Wrapf(err, "pause Route53 record %s", rrs.GetName())
	}
	return false, nil
}

// IsPaused reads the current pause annotation without changing the record.
func IsPaused(ctx context.Context, cli client.Client, name string) (bool, error) {
	rrs := &route53v1alpha1.ResourceRecordSet{}
	if err := cli.Get(ctx, client.ObjectKey{Name: name}, rrs); err != nil {
		if apierrors.IsNotFound(err) {
			return false, nil
		}
		return false, errors.Wrapf(err, "get Route53 record %s", name)
	}
	return meta.IsPaused(rrs), nil
}
