package client

import (
	"testing"

	"github.com/go-resty/resty/v2"
	"github.com/stretchr/testify/require"

	"github.com/tidbcloud/aisupport/packages/sdk-go/infra/auth/consts"
)

func TestSetupClientAuthUsesAccessToken(t *testing.T) {
	clearAuthEnv(t)
	t.Setenv(consts.EnvDevOpsAccessToken, "test-access-token")

	cli, err := SetupClientAuth(resty.New())
	require.NoError(t, err)
	require.Equal(t, "Bearer test-access-token", cli.Header.Get(consts.HeaderAuthorization))
	require.Empty(t, cli.Header.Get(consts.HeaderAPIToken))
	require.Empty(t, cli.Header.Get(consts.HeaderAPIKey))
}

func TestSetupClientAuthUsesAPIToken(t *testing.T) {
	clearAuthEnv(t)
	t.Setenv(consts.EnvDevOpsAPIToken, "test-api-token")

	cli, err := SetupClientAuth(resty.New())
	require.NoError(t, err)
	require.Empty(t, cli.Header.Get(consts.HeaderAuthorization))
	require.Equal(t, "test-api-token", cli.Header.Get(consts.HeaderAPIToken))
	require.Empty(t, cli.Header.Get(consts.HeaderAPIKey))
}

func TestSetupClientAuthUsesAPIKey(t *testing.T) {
	clearAuthEnv(t)
	t.Setenv(consts.EnvDevOpsAPIKey, "test-api-key")

	cli, err := SetupClientAuth(resty.New())
	require.NoError(t, err)
	require.Empty(t, cli.Header.Get(consts.HeaderAuthorization))
	require.Empty(t, cli.Header.Get(consts.HeaderAPIToken))
	require.Equal(t, "test-api-key", cli.Header.Get(consts.HeaderAPIKey))
}

func TestSetupClientAuthUsesHighestPriorityCredential(t *testing.T) {
	clearAuthEnv(t)
	t.Setenv(consts.EnvDevOpsAccessToken, "test-access-token")
	t.Setenv(consts.EnvDevOpsAPIToken, "test-api-token")
	t.Setenv(consts.EnvDevOpsAPIKey, "test-api-key")

	cli, err := SetupClientAuth(resty.New())
	require.NoError(t, err)
	require.Equal(t, "Bearer test-access-token", cli.Header.Get(consts.HeaderAuthorization))
	require.Empty(t, cli.Header.Get(consts.HeaderAPIToken))
	require.Empty(t, cli.Header.Get(consts.HeaderAPIKey))
}

func TestSetupClientAuthRequiresCredential(t *testing.T) {
	clearAuthEnv(t)

	cli, err := SetupClientAuth(resty.New())
	require.Error(t, err)
	require.Nil(t, cli)
	require.ErrorContains(t, err, consts.EnvDevOpsAccessToken)
	require.ErrorContains(t, err, consts.EnvDevOpsAPIToken)
	require.ErrorContains(t, err, consts.EnvDevOpsAPIKey)
}

func TestSetupRequestAuthUsesAPIToken(t *testing.T) {
	clearAuthEnv(t)
	t.Setenv(consts.EnvDevOpsAPIToken, "test-api-token")

	req, err := SetupRequestAuth(resty.New().R())
	require.NoError(t, err)
	require.Equal(t, "test-api-token", req.Header.Get(consts.HeaderAPIToken))
	require.Empty(t, req.Header.Get(consts.HeaderAuthorization))
	require.Empty(t, req.Header.Get(consts.HeaderAPIKey))
}

func clearAuthEnv(t *testing.T) {
	t.Helper()

	t.Setenv(consts.EnvDevOpsAccessToken, "")
	t.Setenv(consts.EnvDevOpsAPIToken, "")
	t.Setenv(consts.EnvDevOpsAPIKey, "")
}
