package cluster

import (
	"context"
	"strconv"

	globalcommonv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/common/v1"
	globalngv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/nextgen/v1"
	tidbmgmtservicev1 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_mgmt_service/v1"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/domain/entity"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/pkg/common"
	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
)

func (c *serverImpl) GetCloudIamInfo(
	ctx context.Context,
	request *tidbmgmtservicev1.GetCloudIamInfoRequest,
) (*tidbmgmtservicev1.CloudIamInfo, error) {
	if request.ClusterId == "" {
		return nil, bizerr.New(bizerr.ErrCodeParams, "cluster id is invalid")
	}

	clusterId, err := strconv.ParseUint(request.ClusterId, 10, 64)
	if err != nil {
		return nil, bizerr.New(bizerr.ErrCodeParams, "cluster id is invalid")
	}

	cluster, err := c.clusterRepo.GetCluster(ctx, clusterId, true)
	if err != nil {
		return nil, err
	}
	if cluster.DeployType != entity.DeployTypeNextGen {
		return nil, bizerr.New(bizerr.ErrCodeParams, "cluster is not nextgen")
	}

	region, err := c.nextgenCli.GetRegionByClusterId(ctx, &globalngv1.GetRegionByClusterIdRequest{
		ClusterId: clusterId,
	})
	if err != nil {
		return nil, err
	}

	iamInfo := &tidbmgmtservicev1.CloudIamInfo{
		ClusterId: request.ClusterId,
		CloudProvider: &globalcommonv1.CloudProvider{
			Id:          common.OpenApiProviderToGlobal(cluster.CloudProvider),
			DisplayName: region.DisplayName,
			IsPublic:    region.IsPublic,
		},
		Region: region,
	}

	// if cluster is deleted, return empty iam info
	// Cloud IAM info is stored in regional nextgen service, it is not available after cluster is deleted
	if cluster.DeletedAt != nil {
		return iamInfo, nil
	}

	providerRole, err := c.nextgenCli.GetProviderRole(ctx, &globalngv1.GetProviderRoleRequest{
		ClusterId: clusterId,
	})
	if err != nil {
		return nil, err
	}
	iamInfo.TidbCloudAccountId = providerRole.GetCloudIamIdentity()
	iamInfo.TidbCloudAccountExternalId = providerRole.GetExternalId()
	iamInfo.NodeRole = providerRole.GetNodeRole()

	return iamInfo, nil
}
