// Copy from cluster-controller/controllers/networkpeer/taskbuilder.go
package vpcpeering

import (
	"github.com/tidbcloud/infra-provider/pkg/consts"
	"github.com/tidbcloud/infra-provider/pkg/deploy"
	"github.com/tidbcloud/infra-provider/regional-server/api/v1alpha1"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/common/constants"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/controllers/vpcpeering/task"
	awstask "github.com/tidbcloud/infra-provider/regional-server/pkg/controllers/vpcpeering/task/aws"
	commontask "github.com/tidbcloud/infra-provider/regional-server/pkg/controllers/vpcpeering/task/common"
	gcptask "github.com/tidbcloud/infra-provider/regional-server/pkg/controllers/vpcpeering/task/gcp"
)

func BuildVPCPeeringTasks(c *task.Context) []deploy.Task {
	switch c.ProviderType {
	case string(constants.AWS), consts.ProviderTypeEKS:
		return BuildEKSVPCPeeringTasks(c)
	case string(constants.GCP), consts.ProviderTypeGKE:
		return BuildGKEVPCPeeringTasks(c)
	}
	return nil
}

func BuildEKSVPCPeeringTasks(c *task.Context) []deploy.Task {
	tasks := []deploy.Task{
		commontask.NewGuardian(c),
	}
	if c.VPCPeering.Spec.PeeringRole == v1alpha1.PeeringRoleAccepter {
		tasks = append(tasks, awstask.NewVPCPeeringAccept(c))
	} else {
		tasks = append(tasks, awstask.NewVCPPeeringConnection(c))
	}
	return tasks
}

func BuildGKEVPCPeeringTasks(c *task.Context) []deploy.Task {
	return []deploy.Task{
		commontask.NewGuardian(c),
		gcptask.NewPeering(c),
	}
}
