package notif

import (
	"encoding/json"
	"testing"

	"github.com/yusing/go-proxy/internal/utils"
	. "github.com/yusing/go-proxy/internal/utils/testing"
)

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

	newWebhook := Providers[ProviderWebhook]

	t.Run("valid", func(t *testing.T) {
		t.Parallel()
		_, err := newWebhook(map[string]any{
			"name":    "test",
			"url":     "https://example.com",
			"payload": "{}",
		})
		ExpectNoError(t, err)
	})
	t.Run("valid template", func(t *testing.T) {
		t.Parallel()
		_, err := newWebhook(map[string]any{
			"name":     "test",
			"url":      "https://example.com",
			"template": "discord",
		})
		ExpectNoError(t, err)
	})

	t.Run("missing url", func(t *testing.T) {
		t.Parallel()
		_, err := newWebhook(map[string]any{
			"name":    "test",
			"payload": "{}",
		})
		ExpectError(t, utils.ErrValidationError, err)
	})

	t.Run("missing payload", func(t *testing.T) {
		t.Parallel()
		_, err := newWebhook(map[string]any{
			"name": "test",
			"url":  "https://example.com",
		})
		ExpectError(t, utils.ErrValidationError, err)
	})
	t.Run("invalid url", func(t *testing.T) {
		t.Parallel()
		_, err := newWebhook(map[string]any{
			"name":    "test",
			"url":     "example.com",
			"payload": "{}",
		})
		ExpectError(t, utils.ErrValidationError, err)
	})
	t.Run("invalid payload", func(t *testing.T) {
		t.Parallel()
		_, err := newWebhook(map[string]any{
			"name":    "test",
			"url":     "https://example.com",
			"payload": "abcd",
		})
		ExpectError(t, utils.ErrValidationError, err)
	})
	t.Run("invalid method", func(t *testing.T) {
		t.Parallel()
		_, err := newWebhook(map[string]any{
			"name":    "test",
			"url":     "https://example.com",
			"payload": "{}",
			"method":  "abcd",
		})
		ExpectError(t, utils.ErrValidationError, err)
	})
	t.Run("invalid template", func(t *testing.T) {
		t.Parallel()
		_, err := newWebhook(map[string]any{
			"name":     "test",
			"url":      "https://example.com",
			"template": "abcd",
		})
		ExpectError(t, utils.ErrValidationError, err)
	})
}

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

	var webhook Webhook
	webhook.Payload = discordPayload
	bodyReader, err := webhook.MakeBody(&LogMessage{
		Title: "abc",
		Extras: map[string]any{
			"foo": "bar",
		},
	})
	ExpectNoError(t, err)

	var body struct {
		Embeds []struct {
			Title  string `json:"title"`
			Fields []struct {
				Name  string `json:"name"`
				Value string `json:"value"`
			} `json:"fields"`
		} `json:"embeds"`
	}

	err = json.NewDecoder(bodyReader).Decode(&body)
	ExpectNoError(t, err)

	ExpectEqual(t, body.Embeds[0].Title, "abc")
	fields := body.Embeds[0].Fields
	ExpectEqual(t, fields[0].Name, "foo")
	ExpectEqual(t, fields[0].Value, "bar")
}