package resourcepool

import (
	clusterngv1beta "github.com/tidbcloud/cluster-service-ng/api/cluster-service-ng/v1beta"

	globalngv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/nextgen/v1"
	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
)

func pdDeploymentModeToRegional(
	mode globalngv1.PdDeploymentMode,
) (clusterngv1beta.PDDeploymentMode, bizerr.BizError) {
	switch mode {
	case globalngv1.PdDeploymentMode_PD_DEPLOYMENT_MODE_UNSPECIFIED:
		return clusterngv1beta.PDDeploymentMode_PD_DEPLOYMENT_MODE_UNSPECIFIED, nil
	case globalngv1.PdDeploymentMode_PD_DEPLOYMENT_MODE_MICROSERVICE:
		return clusterngv1beta.PDDeploymentMode_PD_DEPLOYMENT_MODE_MICROSERVICE, nil
	case globalngv1.PdDeploymentMode_PD_DEPLOYMENT_MODE_MONOLITHIC:
		return clusterngv1beta.PDDeploymentMode_PD_DEPLOYMENT_MODE_MONOLITHIC, nil
	default:
		return clusterngv1beta.PDDeploymentMode_PD_DEPLOYMENT_MODE_UNSPECIFIED,
			bizerr.New(bizerr.ErrCodeParams, "unsupported pd_deployment_mode: %d", mode)
	}
}

func resolveCreateSharedPoolPdDeploymentMode(
	mode globalngv1.PdDeploymentMode,
	topologyDriven bool,
) (clusterngv1beta.PDDeploymentMode, bizerr.BizError) {
	switch mode {
	case globalngv1.PdDeploymentMode_PD_DEPLOYMENT_MODE_UNSPECIFIED:
		if topologyDriven {
			return clusterngv1beta.PDDeploymentMode_PD_DEPLOYMENT_MODE_UNSPECIFIED, nil
		}
		return clusterngv1beta.PDDeploymentMode_PD_DEPLOYMENT_MODE_MONOLITHIC, nil
	case globalngv1.PdDeploymentMode_PD_DEPLOYMENT_MODE_MONOLITHIC:
		if topologyDriven {
			return clusterngv1beta.PDDeploymentMode_PD_DEPLOYMENT_MODE_UNSPECIFIED,
				bizerr.New(bizerr.ErrCodeParams, "pd_deployment_mode monolithic is not supported for topology-driven resource pools")
		}
	}
	return pdDeploymentModeToRegional(mode)
}

func pdDeploymentModeFromRegional(
	mode clusterngv1beta.PDDeploymentMode,
) (globalngv1.PdDeploymentMode, bizerr.BizError) {
	switch mode {
	case clusterngv1beta.PDDeploymentMode_PD_DEPLOYMENT_MODE_UNSPECIFIED,
		clusterngv1beta.PDDeploymentMode_PD_DEPLOYMENT_MODE_MICROSERVICE:
		return globalngv1.PdDeploymentMode_PD_DEPLOYMENT_MODE_MICROSERVICE, nil
	case clusterngv1beta.PDDeploymentMode_PD_DEPLOYMENT_MODE_MONOLITHIC:
		return globalngv1.PdDeploymentMode_PD_DEPLOYMENT_MODE_MONOLITHIC, nil
	default:
		return globalngv1.PdDeploymentMode_PD_DEPLOYMENT_MODE_UNSPECIFIED,
			bizerr.New(bizerr.ErrCodeParams, "unsupported regional pd_deployment_mode: %d", mode)
	}
}
