package privatelinkservice

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

func GetPrivateLinkServiceTasks(r *PrivateLinkServiceReconciler, c *task.Context) []deploy.Task {
	switch c.PrivateLinkService.Spec.Provider {
	case consts.ProviderTypeEKS:
		return GetEKSPrivateLinkServiceTasks(r, c)
	case consts.ProviderTypeACK:
		return GetACKPrivateLinkServiceTasks(r, c)
	case consts.ProviderTypeAKS:
		return GetAKSPrivateLinkServiceTasks(r, c)
	}
	return nil
}

func GetEKSPrivateLinkServiceTasks(r *PrivateLinkServiceReconciler, c *task.Context) []deploy.Task {
	tasks := []deploy.Task{
		common.NewGuardian(c),
		common.NewLoadBalancer(c),
		eks.NewEndpointService(c, r.awsCli),
		eks.NewDNSRecord(c, r.awsCli),
		common.NewEndpoint(c, eks.NewEndpoint(c, r.awsCli)),
	}
	return tasks
}

func GetACKPrivateLinkServiceTasks(r *PrivateLinkServiceReconciler, c *task.Context) []deploy.Task {
	tasks := []deploy.Task{
		common.NewGuardian(c),
		common.NewLoadBalancer(c),
		ack.NewEndpointService(c),
		ack.NewEndpointServiceWhitelist(c, r.aliyunCli),
		common.NewEndpoint(c, ack.NewEndpoint(c, r.aliyunCli)),
		ack.NewDNSRecord(c),
	}
	return tasks
}

func GetAKSPrivateLinkServiceTasks(r *PrivateLinkServiceReconciler, c *task.Context) []deploy.Task {
	tasks := []deploy.Task{
		common.NewGuardian(c),
		common.NewLoadBalancer(c),
		aks.NewEndpointService(c),
		common.NewEndpoint(c, aks.NewEndpoint(c, r.azureCli)),
		aks.NewDNSRecord(c),
	}
	return tasks
}
