package replay

import (
	"errors"
	"strings"

	replayprovider "github.com/tidbcloud/eks-provider/controllers/replay/provider"
	"github.com/tidbcloud/eks-provider/controllers/replay/task"
	"github.com/tidbcloud/infra-provider/pkg/consts"
)

func DefaultReplayContext(c *task.Context) (*task.Context, error) {
	if c == nil || c.Replay == nil {
		return c, nil
	}
	provider, err := buildReplayProvider(c)
	if err != nil {
		return nil, err
	}
	c.Provider = provider
	c.Zones = provider.ReplayZones()
	c.Subnets = provider.ReplaySubnets()
	return c, nil
}

func buildReplayProvider(c *task.Context) (task.ReplayDeploymentProvider, error) {
	if c == nil {
		return nil, errors.New("context is not initialized")
	}
	if c.Replay == nil {
		return nil, errors.New("context replay is not initialized")
	}
	servicePlan := strings.ToLower(c.RootConfig.ServicePlan)
	switch servicePlan {
	case consts.ServiceTypeDedicated:
		return buildDedicatedReplayProvider(c)
	case consts.ServiceTypePremium:
		return buildPremiumReplayProvider(c)
	default:
		return buildDedicatedReplayProvider(c)
	}
}

func buildDedicatedReplayProvider(c *task.Context) (task.ReplayDeploymentProvider, error) {
	provider := strings.ToLower(c.RootConfig.Provider)
	switch provider {
	case consts.ProviderTypeEKS:
		return replayprovider.NewDedicatedEKSReplayProvider(c), nil
	default:
		return nil, errors.New("unknown replay provider: " + provider)
	}
}

func buildPremiumReplayProvider(c *task.Context) (task.ReplayDeploymentProvider, error) {
	provider := strings.ToLower(c.RootConfig.Provider)
	switch provider {
	case consts.ProviderTypeEKS:
		return replayprovider.NewPremiumEKSReplayProvider(c), nil
	case consts.ProviderTypeACK:
		return replayprovider.NewPremiumAliyunReplayProvider(c), nil
	default:
		return nil, errors.New("unknown replay provider: " + provider)
	}
}
