package integration

import (
	"os"
	"testing"

	"github.com/tidbcloud/aws-shared-provider/tools/cloud-instances/internal/cli"
	"github.com/tidbcloud/aws-shared-provider/tools/cloud-instances/query"
)

func TestValidateAuthAzure(t *testing.T) {
	engine := query.NewQueryEngine(t.TempDir())
	t.Setenv("AZURE_ACCESS_TOKEN", "")
	t.Setenv("AZURE_TENANT_ID", "")
	t.Setenv("AZURE_CLIENT_ID", "")
	t.Setenv("AZURE_CLIENT_SECRET", "")
	t.Setenv("AZURE_SUBSCRIPTION_ID", "")

	err := cli.ValidateAuth(engine, query.FilterOptions{Provider: "azure"})
	if err == nil {
		t.Fatalf("expected error for missing azure auth")
	}

	t.Setenv("AZURE_ACCESS_TOKEN", "token")
	t.Setenv("AZURE_SUBSCRIPTION_ID", "sub")
	if err := cli.ValidateAuth(engine, query.FilterOptions{Provider: "azure"}); err != nil {
		t.Fatalf("unexpected error: %v", err)
	}
}

func TestValidateAuthGCP(t *testing.T) {
	engine := query.NewQueryEngine(t.TempDir())
	t.Setenv("GCP_PROJECT_ID", "")
	t.Setenv("GCP_ACCESS_TOKEN", "")
	t.Setenv("GOOGLE_APPLICATION_CREDENTIALS", "")

	err := cli.ValidateAuth(engine, query.FilterOptions{Provider: "gcp"})
	if err == nil {
		t.Fatalf("expected error for missing gcp auth")
	}

	cred := t.TempDir() + "/creds.json"
	if err := os.WriteFile(cred, []byte("{}"), 0600); err != nil {
		t.Fatalf("write creds: %v", err)
	}

	t.Setenv("GCP_PROJECT_ID", "proj")
	t.Setenv("GOOGLE_APPLICATION_CREDENTIALS", cred)
	if err := cli.ValidateAuth(engine, query.FilterOptions{Provider: "gcp"}); err != nil {
		t.Fatalf("unexpected error: %v", err)
	}
}

func TestValidateAuthAliyun(t *testing.T) {
	engine := query.NewQueryEngine(t.TempDir())
	t.Setenv("ALICLOUD_ACCESS_KEY", "")
	t.Setenv("ALICLOUD_SECRET_KEY", "")

	err := cli.ValidateAuth(engine, query.FilterOptions{Provider: "aliyun"})
	if err == nil {
		t.Fatalf("expected error for missing aliyun auth")
	}

	t.Setenv("ALICLOUD_ACCESS_KEY", "ak")
	t.Setenv("ALICLOUD_SECRET_KEY", "sk")
	if err := cli.ValidateAuth(engine, query.FilterOptions{Provider: "aliyun"}); err != nil {
		t.Fatalf("unexpected error: %v", err)
	}
}
