package globalapi

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

	"github.com/gin-gonic/gin"
	"github.com/stretchr/testify/assert"
	"github.com/tidbcloud/account/idl/pbgen/proto/account"
	"github.com/tidbcloud/observability/pkg/common/message"
	"github.com/tidbcloud/observability/pkg/common/structs"
	"github.com/tidbcloud/tiinf/sdk/auditlog"
	"github.com/tidbcloud/tiinf/transport/http/tigin"
)

func TestBuildAuditEventMeta(t *testing.T) {
	event := auditlog.EventUpdateAlertRule

	t.Run("bad user", func(t *testing.T) {
		w := httptest.NewRecorder()
		c, _ := gin.CreateTestContext(w)
		_, err := buildAuditEventMeta(c, event)
		assert.Error(t, err)
	})

	t.Run("bad tenant", func(t *testing.T) {
		w := httptest.NewRecorder()
		c, _ := gin.CreateTestContext(w)
		c.Set(tigin.CURRENT_USER, &account.User{
			Email: "test",
		})
		_, err := buildAuditEventMeta(c, event)
		assert.Error(t, err)
	})

	t.Run("success", func(t *testing.T) {
		w := httptest.NewRecorder()
		c, _ := gin.CreateTestContext(w)
		c.Set(tigin.CURRENT_USER, &account.User{
			Email: "test",
		})
		c.Request = &http.Request{
			Header: map[string][]string{
				"Authorization":   {"Bearer 12312422141"},
				"X-Forwarded-For": {"8.8.8.8"},
			},
		}

		c.AddParam("tenantID", "1")
		c.AddParam("projectID", "2")
		c.AddParam("applicationID", "3")

		_, err := buildAuditEventMeta(c, event)
		assert.Nil(t, err)
	})
}

func TestEnrichUpdateAlertRulesDetail(t *testing.T) {
	details := auditlog.Details{}
	EnrichUpdateAlertRulesDetail(message.Result{
		Data: message.UpdateAlertRulesByCloudUserResp{
			Data: map[string]structs.UpdateAlertRule{
				"example:1": {
					For:          "10m0s",
					AlertName:    "test",
					OldFor:       "10m",
					Threshold:    0.3,
					OldThreshold: 0.3,
					Status:       "active",
				},
			},
		},
	}, details)
	assert.Equal(t, details["alertrule_id"], "test")
	assert.Equal(t, details[auditlog.KeyAlertRuleOldTriggerInterval], "10m")
	assert.Equal(t, details[auditlog.KeyAlertRuleNewTriggerInterval], "10m")
	assert.Equal(t, details[auditlog.KeyAlertRuleNewThreshold], "0.3000")
}
