package pod

import (
	"testing"
	"time"

	corev1 "k8s.io/api/core/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

func timeToPtr(t metav1.Time) *metav1.Time {
	return &t
}

func TestNeedUpdateSafeToEvictAnno(t *testing.T) {
	type args struct {
		pod                 *corev1.Pod
		evictDuration       time.Duration
		lastActiveTimestamp *metav1.Time
	}
	tests := []struct {
		name string
		args args
		want int
	}{
		{
			name: "lastActiveTimestamp is nil, AddSafeToEvictAnno",
			args: args{pod: &corev1.Pod{}, evictDuration: time.Second},
			want: AddSafeToEvictAnno,
		},
		{
			name: "lastActiveTimestamp is nil, NoUpdate",
			args: args{pod: &corev1.Pod{
				ObjectMeta: metav1.ObjectMeta{
					Annotations: map[string]string{
						SafeToEvictAnno: "false",
					},
				},
			}, evictDuration: time.Second},
			want: NoUpdate,
		},
		{
			name: "AddSafeToEvictAnno",
			args: args{
				pod:                 &corev1.Pod{},
				evictDuration:       time.Minute,
				lastActiveTimestamp: timeToPtr(metav1.Now())},
			want: AddSafeToEvictAnno,
		},
		{
			name: "NoUpdate_NoSafeToEvictAnno",
			args: args{
				pod:                 &corev1.Pod{},
				evictDuration:       time.Second,
				lastActiveTimestamp: timeToPtr(metav1.NewTime(time.Now().Add(-time.Minute))),
			},
			want: NoUpdate,
		},
		{
			name: "DelSafeToEvictAnno",
			args: args{
				pod: &corev1.Pod{
					ObjectMeta: metav1.ObjectMeta{
						Annotations: map[string]string{
							SafeToEvictAnno: "false",
						},
					},
				},
				evictDuration:       time.Second,
				lastActiveTimestamp: timeToPtr(metav1.NewTime(time.Now().Add(-time.Minute))),
			},
			want: DelSafeToEvictAnno,
		},
		{
			name: "NoUpdate_HaveSafeToEvictAnno",
			args: args{
				pod: &corev1.Pod{
					ObjectMeta: metav1.ObjectMeta{
						Annotations: map[string]string{
							SafeToEvictAnno: "false",
						},
					},
				},
				evictDuration:       time.Minute,
				lastActiveTimestamp: timeToPtr(metav1.Now()),
			},
			want: NoUpdate,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			got := NeedUpdateSafeToEvictAnno(tt.args.pod, tt.args.evictDuration, tt.args.lastActiveTimestamp)
			if got != tt.want {
				t.Errorf("NeedUpdateSafeToEvictAnno() = %v, want %v", got, tt.want)
			}
		})
	}
}
