package server

import (
	"context"
	"testing"

	route53v1alpha1 "github.com/crossplane-contrib/provider-aws/apis/route53/v1alpha1"
	xpv1 "github.com/crossplane/crossplane-runtime/apis/common/v1"
	"github.com/crossplane/crossplane-runtime/pkg/meta"
	"github.com/stretchr/testify/require"
	"go.uber.org/zap"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/runtime"
	"sigs.k8s.io/controller-runtime/pkg/client/fake"
)

func TestPausedRoute53RecordIsNotModifying(t *testing.T) {
	rrs := &route53v1alpha1.ResourceRecordSet{ObjectMeta: metav1.ObjectMeta{
		Name: "sql.example.com",
		Annotations: map[string]string{
			meta.AnnotationKeyReconciliationPaused: "true",
		},
	}}
	rrs.Status.SetConditions(xpv1.Available(), xpv1.ReconcilePaused())

	scheme := runtime.NewScheme()
	require.NoError(t, route53v1alpha1.SchemeBuilder.AddToScheme(scheme))
	server := &TidbGroupServer{KubeClient: fake.NewClientBuilder().WithScheme(scheme).WithObjects(rrs).Build()}

	modifying, err := server.isDNSRecordModifyingAWS(context.Background(), rrs.GetName(), zap.NewNop())
	require.NoError(t, err)
	require.False(t, modifying)
}

func TestDeletingRoute53RecordIsModifying(t *testing.T) {
	deletionTimestamp := metav1.Now()
	rrs := &route53v1alpha1.ResourceRecordSet{ObjectMeta: metav1.ObjectMeta{
		Name:              "sql.example.com",
		DeletionTimestamp: &deletionTimestamp,
		Finalizers:        []string{"test.finalizer"},
		Annotations: map[string]string{
			meta.AnnotationKeyReconciliationPaused: "true",
		},
	}}

	scheme := runtime.NewScheme()
	require.NoError(t, route53v1alpha1.SchemeBuilder.AddToScheme(scheme))
	server := &TidbGroupServer{KubeClient: fake.NewClientBuilder().WithScheme(scheme).WithObjects(rrs).Build()}

	modifying, err := server.isDNSRecordModifyingAWS(context.Background(), rrs.GetName(), zap.NewNop())
	require.NoError(t, err)
	require.True(t, modifying)
}
