package aws

import (
	"testing"

	"github.com/tidbcloud/observability/pkg/common/errors"

	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/aws/aws-sdk-go-v2/service/sns"
	"github.com/aws/smithy-go/document"
	"github.com/google/go-cmp/cmp"
	"github.com/google/go-cmp/cmp/cmpopts"
	o11yv1 "github.com/tidbcloud/observability/api/regionalserver/resourceworker/v1"
)

var (
	subEmailEndpoint = "xyz@abc.com"
	subEmailProtocol = string(o11yv1.ProtocolTypeEmail)
	topicArn         = "arn:aws:sns:us-east-1:123456789012:MyTopic"
)

func TestGenerateSubscribeInput(t *testing.T) {
	cases := map[string]struct {
		in     o11yv1.Subscription
		expect sns.SubscribeInput
	}{
		"FilledInput": {
			in: o11yv1.Subscription{
				Spec: o11yv1.SubscriptionSpec{
					Endpoint: subEmailEndpoint,
					Protocol: o11yv1.ProtocolTypeEmail,
				},
			},
			expect: sns.SubscribeInput{
				TopicArn:              aws.String(topicArn),
				Endpoint:              &subEmailEndpoint,
				Protocol:              &subEmailProtocol,
				ReturnSubscriptionArn: true,
			},
		},
	}

	for name, c := range cases {
		t.Run(name, func(t *testing.T) {
			input := GenerateSubscribeInput(&c.in, topicArn)
			if diff := cmp.Diff(input, &c.expect, cmpopts.IgnoreTypes(document.NoSerde{})); diff != "" {
				t.Errorf("GenerateSubscribeInput(...): -want, +got\n:%s", diff)
			}
		})
	}
}

func TestNewSnsClient(t *testing.T) {
	cfg := aws.Config{
		Region: defaultRegion,
	}
	NewSnsClient(cfg)
}

func TestIsSubscriptionNotFound(t *testing.T) {
	err := errors.New(errors.UnrecognizedError, "")
	IsSubscriptionNotFound(err)
}
