package jumper

import (
	"fmt"
	"strings"

	"github.com/tidbcloud/devops/pkg/infra/config"
	k8sutil "github.com/tidbcloud/devops/pkg/infra/utils/k8s"

	comv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/common/v1"
	ngv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/nextgen/v1"
	"k8s.io/client-go/tools/clientcmd/api"
)

type premiumDataplaneConfigInput struct {
	ProviderID        comv1.CloudProvider_Name
	Region            string
	K8sName           string
	Endpoint          string
	RawConfig         *api.Config
	AKSAuth           *k8sutil.AKSAuth
	ACKAuth           *config.JumpServiceDestinationAliCloudAuth
	NewArchAccessRole string
}

func buildPremiumDataplaneConfig(in premiumDataplaneConfigInput) (*api.Config, error) {
	switch in.ProviderID {
	case comv1.CloudProvider_AWS:
		eksAuth := k8sutil.EKSAuth{
			Region:  in.Region,
			EKSName: in.K8sName,
			RoleARN: in.NewArchAccessRole,
		}
		return k8sutil.NewConfigBuilder().
			AddEKSAuth(in.K8sName, eksAuth).
			AddInsecureCluster(in.K8sName, in.Endpoint).
			AddContext(in.K8sName, api.Context{Cluster: in.K8sName, AuthInfo: in.K8sName}).
			CurrentContext(in.K8sName).
			Build(), nil
	case comv1.CloudProvider_AZURE:
		if in.AKSAuth == nil {
			return nil, fmt.Errorf("premium aks auth is not configured")
		}
		return k8sutil.NewConfigBuilder().
			AddAKSAuth(in.K8sName, in.AKSAuth).
			AddInsecureCluster(in.K8sName, in.Endpoint).
			AddContext(in.K8sName, api.Context{Cluster: in.K8sName, AuthInfo: in.K8sName}).
			CurrentContext(in.K8sName).
			Build(), nil
	case comv1.CloudProvider_ALICLOUD:
		if in.ACKAuth == nil {
			return nil, fmt.Errorf("premium ack auth is not configured")
		}
		ackAuth := &k8sutil.ACKAuth{
			ProfileName: in.ACKAuth.ProfileName,
			ProfileFile: in.ACKAuth.ProfileFile,
		}
		var err error
		ackAuth.ClusterID, err = ExtractACKClusterIDFromKubeconfig(in.RawConfig)
		if err != nil {
			return nil, err
		}
		return k8sutil.NewConfigBuilder().
			AddACKAuth(in.K8sName, ackAuth).
			AddInsecureCluster(in.K8sName, in.Endpoint).
			AddContext(in.K8sName, api.Context{Cluster: in.K8sName, AuthInfo: in.K8sName}).
			CurrentContext(in.K8sName).
			Build(), nil
	default:
		return nil, fmt.Errorf("unsupported cloud provider %s", in.ProviderID.String())
	}
}

func premiumAWSRegionFromResourcePool(pool *ngv1.ResourcePoolProfile) string {
	return strings.TrimPrefix(
		strings.ReplaceAll(
			strings.ToLower(pool.ResourcePool.RegionId.String()),
			"_", "-",
		),
		"aws-",
	)
}
