package storage

import (
	"net/url"
	"strings"
	"testing"

	"github.com/tidbcloud/service-proxy/pkg/checker/core"
)

func TestAZBlobContainerURL(t *testing.T) {
	u, err := url.Parse("https://audittest123456.blob.core.windows.net/tennix-test/10732721910750715725")
	if err != nil {
		t.Fatalf("failed to parse url: %v", err)
	}

	containerURL, containerName, err := azBlobContainerURL(u, "sp=acw&sig=foo")
	if err != nil {
		t.Fatalf("unexpected error: %v", err)
	}

	if containerName != "tennix-test" {
		t.Fatalf("expected containerName tennix-test, got %s", containerName)
	}

	expectedURL := "https://audittest123456.blob.core.windows.net/tennix-test?sp=acw&sig=foo"
	if containerURL != expectedURL {
		t.Fatalf("expected %s, got %s", expectedURL, containerURL)
	}
}

func TestAZBlobContainerURL_ManagedIdentity(t *testing.T) {
	u, err := url.Parse("https://audittest123456.blob.core.windows.net/tennix-test/10732721910750715725")
	if err != nil {
		t.Fatalf("failed to parse url: %v", err)
	}

	containerURL, containerName, err := azBlobContainerURL(u, "")
	if err != nil {
		t.Fatalf("unexpected error: %v", err)
	}

	if containerName != "tennix-test" {
		t.Fatalf("expected containerName tennix-test, got %s", containerName)
	}

	expectedURL := "https://audittest123456.blob.core.windows.net/tennix-test"
	if containerURL != expectedURL {
		t.Fatalf("expected %s, got %s", expectedURL, containerURL)
	}
}

func TestAZBlobNameFromTargetKey(t *testing.T) {
	u, err := url.Parse("https://audittest123456.blob.core.windows.net/tennix-test/10732721910750715725")
	if err != nil {
		t.Fatalf("failed to parse url: %v", err)
	}

	target := targetKey(u)
	blobName := strings.TrimPrefix(target, "tennix-test/")

	expected := "10732721910750715725/_test-permission"
	if blobName != expected {
		t.Fatalf("expected %s, got %s", expected, blobName)
	}
}

func TestAuditChecker_CheckAzureRequiresClientIDForManagedIdentity(t *testing.T) {
	u, err := url.Parse("https://audittest123456.blob.core.windows.net/tennix-test/10732721910750715725")
	if err != nil {
		t.Fatalf("failed to parse url: %v", err)
	}

	checker := &AuditChecker{
		params: &core.AuditParams{
			BucketURL: u.String(),
			Azure: &core.AzureAuth{
				SASToken: "",
				ClientID: "",
			},
		},
	}

	err = checker.Check(t.Context())
	if err == nil {
		t.Fatal("expected error when Azure managed identity client ID is empty")
	}
	if err.Error() != "azure client ID is required when using managed identity auth" {
		t.Fatalf("unexpected error: %v", err)
	}
}
