package privatelinkendpoint

import (
	"github.com/tidbcloud/infra-provider/regional-server/api/v1alpha1"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/consts"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/controllers/privatelinkendpoint/task"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/controllers/privatelinkendpoint/task/ack"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/controllers/privatelinkendpoint/task/aks"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/controllers/privatelinkendpoint/task/common"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/controllers/privatelinkendpoint/task/eks"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/deploy"
)

func GetPrivateLinkEndpointTasks(r *PrivateLinkEndpointReconciler, c *task.Context) []deploy.Task {
	// Amazon MSK multi-VPC connectivity has its own reconcile path that does not
	// involve a customer VPC endpoint service. It is AWS(EKS) only.
	if c.PrivateLinkEndpoint.Spec.Type == v1alpha1.PrivateLinkEndpointTypeAmazonMSK {
		return []deploy.Task{
			common.NewGuardian(c),
			eks.NewMSKVpcConnection(c, r.awsCli),
		}
	}

	switch c.PrivateLinkEndpoint.Spec.Provider {
	case consts.ProviderTypeEKS:
		return GetEKSPrivateLinkEndpointTasks(r, c)
	case consts.ProviderTypeACK:
		return GetACKPrivateLinkEndpointTasks(r, c)
	case consts.ProviderTypeAKS:
		return GetAKSPrivateLinkEndpointTasks(r, c)
	}
	return nil
}

func GetEKSPrivateLinkEndpointTasks(r *PrivateLinkEndpointReconciler, c *task.Context) []deploy.Task {
	tasks := []deploy.Task{
		common.NewGuardian(c),
		eks.NewEndpoint(c, r.awsCli),
	}
	if c.PrivateLinkEndpoint.Spec.RootDomainName != "" {
		tasks = append(tasks, eks.NewDNS(c))
	}
	return tasks
}

func GetACKPrivateLinkEndpointTasks(r *PrivateLinkEndpointReconciler, c *task.Context) []deploy.Task {
	tasks := []deploy.Task{
		common.NewGuardian(c),
		ack.NewEndpoint(c, r.aliyunCli),
	}
	if c.PrivateLinkEndpoint.Spec.RootDomainName != "" {
		tasks = append(tasks, ack.NewDNS(c))
	}
	return tasks
}

func GetAKSPrivateLinkEndpointTasks(r *PrivateLinkEndpointReconciler, c *task.Context) []deploy.Task {
	tasks := []deploy.Task{
		common.NewGuardian(c),
		aks.NewEndpoint(c, r.azureCli),
	}
	if c.PrivateLinkEndpoint.Spec.RootDomainName != "" {
		tasks = append(tasks, aks.NewDNS(c))
	}
	return tasks
}
