package devops

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

	"github.com/stretchr/testify/require"

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

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

	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		require.Equal(t, "/api/v1/devops-internal/tenants", r.URL.Path)
		require.Equal(t, "2", r.URL.Query().Get("page"))
		require.Equal(t, "50", r.URL.Query().Get("per_page"))
		require.Equal(t, "token", r.Header.Get("X-API-TOKEN"))
		require.Equal(t, "token", r.Header.Get("X-API-KEY"))

		w.Header().Set("Content-Type", "application/json")
		_, _ = w.Write([]byte(`{
			"items": [
				{
					"id": "1372813089209282513",
					"name": "Acme",
					"status": "active",
					"time_zone": "America/Los_Angeles",
					"plan": "on_demand",
					"region": "NA"
				}
			],
			"total": 1
		}`))
	}))
	defer server.Close()

	client := NewClient(config.DevOpsConfig{
		BaseURL:  server.URL,
		APIToken: "token",
	})

	page, err := client.ListTenants(context.Background(), ListTenantsOptions{
		Page:     2,
		PageSize: 50,
	})
	require.NoError(t, err)
	require.Equal(t, 1, page.Total)
	require.Len(t, page.Tenants, 1)
	require.Equal(t, Tenant{
		ID:        "1372813089209282513",
		Name:      "Acme",
		Status:    "active",
		TimeZone:  "America/Los_Angeles",
		Plan:      "on_demand",
		BizRegion: "NA",
	}, page.Tenants[0])
}

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

	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		require.Equal(t, "/api/v1/devops-internal/tenants/tenant-1", r.URL.Path)
		w.Header().Set("Content-Type", "application/json")
		_, _ = w.Write([]byte(`{
			"id": "tenant-1",
			"name": "Tenant One",
			"status": "active",
			"time_zone": "UTC",
			"plan": "poc",
			"sales_force_region": "APAC"
		}`))
	}))
	defer server.Close()

	client := NewClient(config.DevOpsConfig{BaseURL: server.URL})

	tenant, err := client.GetTenant(context.Background(), "tenant-1")
	require.NoError(t, err)
	require.NotNil(t, tenant)
	require.Equal(t, "APAC", tenant.BizRegion)
}

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

	client := NewClient(config.DevOpsConfig{})
	require.False(t, client.Configured())

	page, err := client.ListTenants(context.Background(), ListTenantsOptions{})
	require.NoError(t, err)
	require.Empty(t, page.Tenants)

	tenant, err := client.GetTenant(context.Background(), "tenant-1")
	require.NoError(t, err)
	require.Nil(t, tenant)
}
