package aws

import (
	"context"
	"testing"

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

	"github.com/stretchr/testify/assert"

	"github.com/aws/aws-sdk-go-v2/aws"
	elbapi "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2"
	"github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2/types"
	. "github.com/onsi/gomega"
	mocks "github.com/tidbcloud/observability/test/mockresourceworker/providers/aws"
	"go.uber.org/mock/gomock"
)

func newMockELB(cfg aws.Config, mock elbClient) ELBClient {
	return ELBClient{
		cli: mock,
		cfg: cfg,
	}
}

func TestNewELB(t *testing.T) {
	cfg := aws.Config{
		Region: defaultRegion,
	}
	c := NewELB(cfg)
	assert.Equal(t, defaultRegion, c.cfg.Region)
}

func TestELBGetLoadBalancer(t *testing.T) {
	metrics.SetupMetrics()

	g := NewGomegaWithT(t)
	ctl := gomock.NewController(t)
	defer ctl.Finish()
	var cfg aws.Config
	mockclient := mocks.NewMockelbClient(ctl)
	elbclient := newMockELB(cfg, mockclient)
	mockclient.EXPECT().DescribeLoadBalancers(context.TODO(), &elbapi.DescribeLoadBalancersInput{
		Names: []string{
			"notfound",
		},
	}).Return(&elbapi.DescribeLoadBalancersOutput{}, nil)
	g.Expect(elbclient.GetLoadBalancer(context.TODO(), "notfound")).Error().Should(Equal(&types.LoadBalancerNotFoundException{}))
	mockclient.EXPECT().DescribeLoadBalancers(context.TODO(), &elbapi.DescribeLoadBalancersInput{
		Names: []string{
			"test1",
		},
	}).Return(&elbapi.DescribeLoadBalancersOutput{
		LoadBalancers: []types.LoadBalancer{
			{
				LoadBalancerName: aws.String("test1"),
			},
		},
	}, nil)
	var output = &types.LoadBalancer{
		LoadBalancerName: aws.String("test1"),
	}
	g.Expect(elbclient.GetLoadBalancer(context.TODO(), "test1")).Should(Equal(output))
	mockclient.EXPECT().DescribeLoadBalancers(context.TODO(), &elbapi.DescribeLoadBalancersInput{
		Names: []string{
			"error",
		},
	}).Return(nil, &types.TooManyLoadBalancersException{})
	g.Expect(elbclient.GetLoadBalancer(context.TODO(), "error")).Error().Should(HaveOccurred())
}
