package kuma

import (
	"testing"

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

func TestGetAPIServerPathSuccess(t *testing.T) {
	f := func(server, expectedAPIServer, expectedAPIPath string) {
		t.Helper()
		apiServer, apiPath, err := getAPIServerPath(server)
		if err != nil {
			t.Fatalf("unexpected error: %s", err)
		}
		if apiServer != expectedAPIServer {
			t.Fatalf("unexpected API server; got %q; want %q", apiServer, expectedAPIServer)
		}
		if apiPath != expectedAPIPath {
			t.Fatalf("unexpected API path; got %q; want %q", apiPath, expectedAPIPath)
		}
	}
	// url without path
	f("http://localhost:5676", "http://localhost:5676", "/v3/discovery:monitoringassignments")
	// url with path
	f("http://localhost:5676/", "http://localhost:5676", "/v3/discovery:monitoringassignments")
	f("https://foo.bar:1234/a/b", "https://foo.bar:1234", "/a/b/v3/discovery:monitoringassignments")
	// url with query args
	f("https://foo.bar:1234/a/b?c=d&arg2=value2", "https://foo.bar:1234", "/a/b/v3/discovery:monitoringassignments?c=d&arg2=value2")
	// missing scheme
	f("foo.bar", "http://foo.bar", "/v3/discovery:monitoringassignments")
	f("foo.bar:1234/a/b", "http://foo.bar:1234", "/a/b/v3/discovery:monitoringassignments")
	f("foo.bar:1234/a/b?c=d&arg2=value2", "http://foo.bar:1234", "/a/b/v3/discovery:monitoringassignments?c=d&arg2=value2")
}

func TestGetAPIConfigFailure(t *testing.T) {
	f := func(server string) {
		t.Helper()
		sdc := &SDConfig{
			Server: server,
		}
		cfg, err := getAPIConfig(sdc, ".")
		if err == nil {
			t.Fatalf("expecting non-nil error")
		}
		if cfg != nil {
			t.Fatalf("expecting nil cfg; got %v", cfg)
		}
	}
	// empty server url
	f("")
	// invalid server url
	f(":")
}

func TestParseTargetsLabels(t *testing.T) {
	data := `{
    "version_info":"5dc9a5dd-2091-4426-a886-dfdc24fc99d7",
    "resources":[
       {
          "@type":"type.googleapis.com/kuma.observability.v1.MonitoringAssignment",
          "mesh":"default",
          "service":"redis",
          "labels":{ "test":"test1" },
          "targets":[
             {
                "name":"redis",
                "scheme":"http",
                "address":"127.0.0.1:5670",
                "metrics_path":"/metrics",
                "labels":{ "kuma_io_protocol":"tcp" }
             }
          ]
       },
       {
          "@type":"type.googleapis.com/kuma.observability.v1.MonitoringAssignment",
          "mesh":"default",
          "service":"app",
          "labels":{ "test":"test2" },
          "targets":[
             {
                "name":"app",
                "scheme":"https",
                "address":"127.0.0.1:5671",
                "metrics_path":"/metrics/abc",
                "labels":{ "kuma_io_protocol":"http" }
             }
          ]
       }
    ],
    "type_url":"type.googleapis.com/kuma.observability.v1.MonitoringAssignment",
    "nonce": "foobar"
 }`
	labelss, versionInfo, nonce, err := parseTargetsLabels([]byte(data))
	if err != nil {
		t.Fatalf("unexpected error: %s", err)
	}

	expectedLabelss := []*promutils.Labels{
		promutils.NewLabelsFromMap(map[string]string{
			"__address__":                        "127.0.0.1:5670",
			"__meta_kuma_dataplane":              "redis",
			"__meta_kuma_label_kuma_io_protocol": "tcp",
			"__meta_kuma_label_test":             "test1",
			"__meta_kuma_mesh":                   "default",
			"__meta_kuma_service":                "redis",
			"__metrics_path__":                   "/metrics",
			"__scheme__":                         "http",
			"instance":                           "redis",
		}),
		promutils.NewLabelsFromMap(map[string]string{
			"__address__":                        "127.0.0.1:5671",
			"__meta_kuma_dataplane":              "app",
			"__meta_kuma_label_kuma_io_protocol": "http",
			"__meta_kuma_label_test":             "test2",
			"__meta_kuma_mesh":                   "default",
			"__meta_kuma_service":                "app",
			"__metrics_path__":                   "/metrics/abc",
			"__scheme__":                         "https",
			"instance":                           "app",
		}),
	}
	discoveryutils.TestEqualLabelss(t, labelss, expectedLabelss)

	expectedVersionInfo := "5dc9a5dd-2091-4426-a886-dfdc24fc99d7"
	if versionInfo != expectedVersionInfo {
		t.Fatalf("unexpected versionInfo; got %q; want %q", versionInfo, expectedVersionInfo)
	}

	expectedNonce := "foobar"
	if nonce != expectedNonce {
		t.Fatalf("unexpected nonce; got %q; want %q", nonce, expectedNonce)
	}
}