package billing

import (
	"context"
	"net/http"
	"net/http/httptest"
	"testing"

	"github.com/stretchr/testify/require"

	"github.com/tidbcloud/aisupport/services/jsm-syncer/config"
)

func TestGetActiveSupportPlan(t *testing.T) {
	t.Parallel()

	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		require.Equal(t, "/api/v1/billing/tenants/123/binded_support_plan", r.URL.Path)
		w.Header().Set("Content-Type", "application/json")
		_, _ = w.Write([]byte(`{"level":"Premium"}`))
	}))
	defer server.Close()

	client := NewClient(config.BillingConfig{BaseURL: server.URL})
	level, err := client.GetActiveSupportPlan(context.Background(), "123")
	require.NoError(t, err)
	require.Equal(t, "Premium", level)
}

func TestGetActiveSupportPlanDefaultsEmptyLevelToBasic(t *testing.T) {
	t.Parallel()

	testCases := []struct {
		name string
		body string
	}{
		{
			name: "empty level",
			body: `{"level":""}`,
		},
		{
			name: "blank level",
			body: `{"level":"   "}`,
		},
		{
			name: "missing level",
			body: `{}`,
		},
	}

	for _, tc := range testCases {
		tc := tc
		t.Run(tc.name, func(t *testing.T) {
			t.Parallel()

			server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
				w.Header().Set("Content-Type", "application/json")
				_, _ = w.Write([]byte(tc.body))
			}))
			defer server.Close()

			client := NewClient(config.BillingConfig{BaseURL: server.URL})
			level, err := client.GetActiveSupportPlan(context.Background(), "123")
			require.NoError(t, err)
			require.Equal(t, "Basic", level)
		})
	}
}

func TestGetActiveSupportPlanReturnsStatusError(t *testing.T) {
	t.Parallel()

	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		w.WriteHeader(http.StatusInternalServerError)
	}))
	defer server.Close()

	client := NewClient(config.BillingConfig{BaseURL: server.URL})
	_, err := client.GetActiveSupportPlan(context.Background(), "123")
	require.Error(t, err)
}
