package audit

import (
	"context"
	"testing"

	"github.com/stretchr/testify/require"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

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

func Test_buildSidecar(t *testing.T) {
	tests := []struct {
		name       string
		cfg        config.RootConfig
		cluster    *cloudv1.Cluster
		extraGroup *cloudv1.ExtraGroupCluster
		wantImage  string
		wantEnvLen int
	}{
		{
			name: "Test with default nodegroup",
			cfg: config.RootConfig{
				ClusterController: config.ClusterControllerConfig{
					Audit: config.AuditConfig{
						SidecarImage:   "2352342342345.dkr.ecr.us-west-2.amazonaws.com/tidbcloud/audit:23450987sdrt23495y234ty23t",
						SidecarCommand: []string{"/audit", "server", "--config", "/etc/audit/audit.yaml"},
					},
				},
			},
			cluster: &cloudv1.Cluster{
				ObjectMeta: metav1.ObjectMeta{
					Annotations: map[string]string{
						"tidbcloud.com/auditlog-sidecar-image-tag": "v1.0.0",
					},
				},
			},
			extraGroup: &cloudv1.ExtraGroupCluster{
				Name: "default",
				Spec: &cloudv1.ExtraGroupSpec{
					TiDB: cloudv1.TiDB{
						Audit: &cloudv1.Audit{
							BucketURL: "s3://test-bucket/{DATE}/{GROUP_NAME}/{POD_NAME}",
						},
					},
				},
			},
			wantImage:  "2352342342345.dkr.ecr.us-west-2.amazonaws.com/tidbcloud/audit:v1.0.0",
			wantEnvLen: 2,
		},
		{
			name: "Test with base image override when sidecar tag annotation exists",
			cfg: config.RootConfig{
				ClusterController: config.ClusterControllerConfig{
					Audit: config.AuditConfig{
						SidecarImage: "2352342342345.dkr.ecr.us-west-2.amazonaws.com/tidbcloud/audit:old-tag",
						BaseImage:    "registry.example.com/custom/audit-sidecar",
					},
				},
			},
			cluster: &cloudv1.Cluster{
				ObjectMeta: metav1.ObjectMeta{
					Annotations: map[string]string{
						"tidbcloud.com/auditlog-sidecar-image-tag": "v2.1.0",
					},
				},
			},
			wantImage:  "registry.example.com/custom/audit-sidecar:v2.1.0",
			wantEnvLen: 2,
		},
		{
			name: "Test with base image configured but no sidecar tag annotation",
			cfg: config.RootConfig{
				ClusterController: config.ClusterControllerConfig{
					Audit: config.AuditConfig{
						SidecarImage: "2352342342345.dkr.ecr.us-west-2.amazonaws.com/tidbcloud/audit:old-tag",
						BaseImage:    "registry.example.com/custom/audit-sidecar",
					},
				},
			},
			cluster: &cloudv1.Cluster{
				ObjectMeta: metav1.ObjectMeta{},
			},
			wantImage:  "2352342342345.dkr.ecr.us-west-2.amazonaws.com/tidbcloud/audit:old-tag",
			wantEnvLen: 1,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			got := buildSidecar(context.Background(), tt.cfg, tt.cluster, tt.extraGroup)
			require.Equal(t, tt.wantImage, got.Image)
			require.Equal(t, tt.wantEnvLen, len(got.Env))
		})
	}
}

func Test_OverrideSidecarImageTag(t *testing.T) {
	tests := []struct {
		name string // description of this test case
		// Named input parameters for target function.
		sidecarImage string
		sidecarTag   string
		want         string
	}{
		{
			name:         "Test with tag override",
			sidecarImage: "2352342342345.dkr.ecr.us-west-2.amazonaws.com/tidbcloud/audit:23450987sdrt23495y234ty23t",
			sidecarTag:   "v1.0.0",
			want:         "2352342342345.dkr.ecr.us-west-2.amazonaws.com/tidbcloud/audit:v1.0.0",
		},
		{
			name:         "Test without tag override",
			sidecarImage: "2352342342345.dkr.ecr.us-west-2.amazonaws.com/tidbcloud/audit:23450987sdrt23495y234ty23t",
			sidecarTag:   "",
			want:         "2352342342345.dkr.ecr.us-west-2.amazonaws.com/tidbcloud/audit:23450987sdrt23495y234ty23t",
		},
		{
			name:         "Test without tag in image and tag override",
			sidecarImage: "2352342342345.dkr.ecr.us-west-2.amazonaws.com/tidbcloud/audit",
			sidecarTag:   "v1.0.0",
			want:         "2352342342345.dkr.ecr.us-west-2.amazonaws.com/tidbcloud/audit:v1.0.0",
		},
		{
			name:         "Test without tag in image and without tag override",
			sidecarImage: "2352342342345.dkr.ecr.us-west-2.amazonaws.com/tidbcloud/audit",
			sidecarTag:   "",
			want:         "2352342342345.dkr.ecr.us-west-2.amazonaws.com/tidbcloud/audit",
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			got := OverrideSidecarImageTag(tt.sidecarImage, tt.sidecarTag)
			if got != tt.want {
				t.Errorf("OverrideSidecarImageTag() = %v, want %v", got, tt.want)
			}
		})
	}
}
