package common

import (
	"context"
	"testing"

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

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

func Test_resolveAuditSidecarConfig(t *testing.T) {
	tests := []struct {
		name            string
		cfg             config.RootConfig
		cluster         *cloudv1.Cluster
		groupName       string
		wantImage       string
		wantSidecarEnvs []corev1.EnvVar
	}{
		{
			name: "prefer SidecarImageV2 when set",
			cfg: config.RootConfig{
				ClusterController: config.ClusterControllerConfig{
					Audit: config.AuditConfig{
						SidecarImage:   "registry.example.com/audit:old",
						SidecarImageV2: "registry.example.com/audit:v2",
					},
				},
			},
			cluster:         &cloudv1.Cluster{},
			groupName:       "default",
			wantImage:       "registry.example.com/audit:v2",
			wantSidecarEnvs: nil,
		},
		{
			name: "fallback to SidecarImage when SidecarImageV2 is empty",
			cfg: config.RootConfig{
				ClusterController: config.ClusterControllerConfig{
					Audit: config.AuditConfig{
						SidecarImage: "registry.example.com/audit:v1",
					},
				},
			},
			cluster:         &cloudv1.Cluster{},
			groupName:       "default",
			wantImage:       "registry.example.com/audit:v1",
			wantSidecarEnvs: nil,
		},
		{
			name: "tag annotation overrides image tag",
			cfg: config.RootConfig{
				ClusterController: config.ClusterControllerConfig{
					Audit: config.AuditConfig{
						SidecarImageV2: "registry.example.com/audit:original",
					},
				},
			},
			cluster: &cloudv1.Cluster{
				ObjectMeta: metav1.ObjectMeta{
					Annotations: map[string]string{
						consts.AuditLogSidecarImageTag: "v1.2.0",
					},
				},
			},
			groupName: "group1",
			wantImage: "registry.example.com/audit:v1.2.0",
			wantSidecarEnvs: []corev1.EnvVar{
				{Name: "GROUP_NAME", Value: "group1"},
			},
		},
		{
			name: "base image used when both base image and tag annotation are set",
			cfg: config.RootConfig{
				ClusterController: config.ClusterControllerConfig{
					Audit: config.AuditConfig{
						SidecarImageV2: "registry.example.com/audit:original",
						BaseImage:      "custom-registry.example.com/custom-audit",
					},
				},
			},
			cluster: &cloudv1.Cluster{
				ObjectMeta: metav1.ObjectMeta{
					Annotations: map[string]string{
						consts.AuditLogSidecarImageTag: "v2.0.0",
					},
				},
			},
			groupName: "group1",
			wantImage: "custom-registry.example.com/custom-audit:v2.0.0",
			wantSidecarEnvs: []corev1.EnvVar{
				{Name: "GROUP_NAME", Value: "group1"},
			},
		},
		{
			name: "base image ignored when no tag annotation",
			cfg: config.RootConfig{
				ClusterController: config.ClusterControllerConfig{
					Audit: config.AuditConfig{
						SidecarImageV2: "registry.example.com/audit:v2",
						BaseImage:      "custom-registry.example.com/custom-audit",
					},
				},
			},
			cluster:         &cloudv1.Cluster{},
			groupName:       "default",
			wantImage:       "registry.example.com/audit:v2",
			wantSidecarEnvs: nil,
		},
		{
			name: "dynamic log path not supported for old sidecar version",
			cfg: config.RootConfig{
				ClusterController: config.ClusterControllerConfig{
					Audit: config.AuditConfig{
						SidecarImageV2: "registry.example.com/audit:original",
					},
				},
			},
			cluster: &cloudv1.Cluster{
				ObjectMeta: metav1.ObjectMeta{
					Annotations: map[string]string{
						consts.AuditLogSidecarImageTag: "v0.9.0",
					},
				},
			},
			groupName:       "group1",
			wantImage:       "registry.example.com/audit:v0.9.0",
			wantSidecarEnvs: nil,
		},
		{
			name: "repo prefix override applied",
			cfg: config.RootConfig{
				ControllerConfig: config.ControllerConfig{
					Override: config.OverrideConfig{
						OverrideRepoPrefix: "custom-prefix",
					},
				},
				ClusterController: config.ClusterControllerConfig{
					Audit: config.AuditConfig{
						SidecarImageV2: "registry.example.com/tidbcloud/audit:v2",
					},
				},
			},
			cluster:         &cloudv1.Cluster{},
			groupName:       "default",
			wantImage:       "registry.example.com/custom-prefix/audit:v2",
			wantSidecarEnvs: nil,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			image, sidecarEnvs := resolveAuditSidecarConfig(context.Background(), tt.cluster, tt.cfg, tt.groupName)
			require.Equal(t, tt.wantImage, image)
			require.Equal(t, tt.wantSidecarEnvs, sidecarEnvs)
		})
	}
}
