package aws

import (
	"github.com/aws/aws-sdk-go-v2/aws"
)

var _ Client = &client{}

// re-export aws.Config
type Config = aws.Config

type Client interface {
	AlterConfig(func(aws.Config) aws.Config) Client
	KMS() KmsClient
	IAM() IAMClient
	Route53() Route53Client
	Elb() ElbClient
	Ec2() Ec2Client
	S3() S3Client
	ResourceGroupsTaggingAPI() ResourceGroupsTaggingAPIClient
	Sts() StsClient
}

type client struct {
	KmsClient
	IAMClient
	Route53Client
	ElbClient
	Ec2Client
	S3Client
	StsClient
	ResourceGroupsTaggingAPIClient
	Conf aws.Config
}

func (c *client) AlterConfig(alter func(Config) Config) Client {
	newConf := alter(c.Conf)
	return NewClient(newConf)
}

func (c *client) KMS() KmsClient {
	return c.KmsClient
}

func (c *client) IAM() IAMClient {
	return c.IAMClient
}

func (c *client) Route53() Route53Client {
	return c.Route53Client
}

func (c *client) Elb() ElbClient {
	return c.ElbClient
}

func (c *client) Ec2() Ec2Client {
	return c.Ec2Client
}

func (c *client) S3() S3Client {
	return c.S3Client
}

func (c *client) Sts() StsClient {
	return c.StsClient
}

func (c *client) ResourceGroupsTaggingAPI() ResourceGroupsTaggingAPIClient {
	return c.ResourceGroupsTaggingAPIClient
}

func NewClient(cfg aws.Config) *client {
	return &client{
		Conf:                           cfg,
		KmsClient:                      newKmsClient(cfg),
		IAMClient:                      NewIAMClient(cfg),
		Route53Client:                  newRoute53(cfg),
		ElbClient:                      newElb(cfg),
		Ec2Client:                      newEc2(cfg),
		S3Client:                       newS3(cfg),
		StsClient:                      newSts(cfg),
		ResourceGroupsTaggingAPIClient: newResourceGroupsTaggingAPI(cfg),
	}
}
