package aws

import (
	"context"

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

	"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"
)

const (
	elasticLoadBalancingClient = "elastic-load-balancing-client"
	errGetLoadBalancerFailed   = "get load balancer failed"
	errLoadBalancerNotFound    = "load balancer not found"
)

type ELBClient struct {
	cli elbClient
	cfg aws.Config
}

func NewELB(cfg aws.Config) ELBClient {
	c := elbapi.NewFromConfig(cfg)
	return ELBClient{
		cli: c,
		cfg: cfg,
	}
}

// GetLoadBalancer used to get LoadBalancer status
func (elb ELBClient) GetLoadBalancer(ctx context.Context, name string) (*types.LoadBalancer, error) {
	output, err := elb.cli.DescribeLoadBalancers(ctx, &elbapi.DescribeLoadBalancersInput{
		Names: []string{name},
	})
	if err != nil {
		metrics.HandleAWSAPIRequestMetrics(elb.cfg.Region, elasticLoadBalancingClient, "DescribeLoadBalancers", name, errGetLoadBalancerFailed)
		return nil, err
	}
	if len(output.LoadBalancers) == 0 {
		metrics.HandleAWSAPIRequestMetrics(elb.cfg.Region, elasticLoadBalancingClient, "DescribeLoadBalancers", name, errLoadBalancerNotFound)
		return nil, &types.LoadBalancerNotFoundException{}
	}
	return &output.LoadBalancers[0], nil
}
