package eureka

import (
	"reflect"
	"testing"

	"github.com/VictoriaMetrics/VictoriaMetrics/lib/prompbmarshal"
	"github.com/VictoriaMetrics/VictoriaMetrics/lib/promscrape/discoveryutils"
)

func Test_addInstanceLabels(t *testing.T) {
	type args struct {
		applications *applications
	}
	tests := []struct {
		name string
		args args
		want [][]prompbmarshal.Label
	}{
		{
			name: "1 application",
			args: args{
				applications: &applications{
					Applications: []Application{
						{
							Name: "test-app",
							Instances: []Instance{
								{
									Status:         "Ok",
									HealthCheckURL: "some-url",
									HomePageURL:    "some-home-url",
									StatusPageURL:  "some-status-url",
									HostName:       "host-1",
									IPAddr:         "10.15.11.11",
									CountryID:      5,
									VipAddress:     "10.15.11.11",
									InstanceID:     "some-id",
									Metadata: MetaData{Items: []Tag{
										{
											Content: "value-1",
											XMLName: struct{ Space, Local string }{Local: "key-1"},
										},
									}},
									Port: Port{
										Port: 9100,
									},
								},
							},
						},
					},
				},
			},
			want: [][]prompbmarshal.Label{
				discoveryutils.GetSortedLabels(map[string]string{
					"__address__":                                   "host-1:9100",
					"instance":                                      "some-id",
					"__meta_eureka_app_instance_hostname":           "host-1",
					"__meta_eureka_app_name":                        "test-app",
					"__meta_eureka_app_instance_healthcheck_url":    "some-url",
					"__meta_eureka_app_instance_ip_addr":            "10.15.11.11",
					"__meta_eureka_app_instance_vip_address":        "10.15.11.11",
					"__meta_eureka_app_instance_secure_vip_address": "",
					"__meta_eureka_app_instance_country_id":         "5",
					"__meta_eureka_app_instance_homepage_url":       "some-home-url",
					"__meta_eureka_app_instance_statuspage_url":     "some-status-url",
					"__meta_eureka_app_instance_id":                 "some-id",
					"__meta_eureka_app_instance_metadata_key_1":     "value-1",
					"__meta_eureka_app_instance_port":               "9100",
					"__meta_eureka_app_instance_port_enabled":       "false",
					"__meta_eureka_app_instance_status":             "Ok",
				}),
			},
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			got := addInstanceLabels(tt.args.applications)
			var sortedLabelss [][]prompbmarshal.Label
			for _, labels := range got {
				sortedLabelss = append(sortedLabelss, discoveryutils.GetSortedLabels(labels))
			}
			if !reflect.DeepEqual(sortedLabelss, tt.want) {
				t.Fatalf("unexpected labels \ngot : %v, \nwant: %v", got, tt.want)
			}
		})
	}
}
