package cluster

import (
	"context"
	"testing"
	"time"

	"github.com/stretchr/testify/assert"
	ctrl "sigs.k8s.io/controller-runtime"

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

func TestForceRequeueIfClusterIsUnsynced(t *testing.T) {
	tests := []struct {
		name            string
		cluster         *cloudv1.Cluster
		res             ctrl.Result
		expectedRes     ctrl.Result
		expectedRequeue bool
	}{
		{
			name: "should return current Result if result is not zero",
			cluster: &cloudv1.Cluster{
				Status: cloudv1.ClusterStatus{},
			},
			res:             ctrl.Result{RequeueAfter: 12345678},
			expectedRes:     ctrl.Result{RequeueAfter: 12345678},
			expectedRequeue: false,
		},
		{
			name: "should return empty Result if cluster is fully synced and current Result is empty",
			cluster: &cloudv1.Cluster{
				Status: cloudv1.ClusterStatus{
					Phase: cloudv1.ClusterPhaseRunning,
					DB:    &cloudv1.DBStatus{},
				},
			},
			res:             ctrl.Result{},
			expectedRes:     ctrl.Result{},
			expectedRequeue: false,
		},
		{
			name: "should requeue if the Result is empty but the cluster is unsynced",
			cluster: &cloudv1.Cluster{
				Status: cloudv1.ClusterStatus{
					Phase: cloudv1.ClusterPhaseScaling,
					DB:    &cloudv1.DBStatus{},
				},
			},
			res:             ctrl.Result{},
			expectedRes:     ctrl.Result{RequeueAfter: requeueAfterOnClusterUnsynced},
			expectedRequeue: true,
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			res := forceRequeueIfClusterIsUnsynced(context.TODO(), tt.cluster, tt.res)
			assert.Equal(t, tt.expectedRes, res)
			if tt.expectedRequeue {
				assert.Equal(t, tt.expectedRes.RequeueAfter, time.Second*10)
			}
		})
	}
}
