package model

import (
	"errors"
	"strings"

	"github.com/go-sql-driver/mysql"

	commonv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/common/v1"
	v1beta11 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_cloud_open_api/common/v1beta1"

	"github.com/pingcap-inc/clinic/pkg/o11y"
)

func DuplicateEntity(err error) bool {
	var mysqlErr *mysql.MySQLError

	return errors.As(err, &mysqlErr) && mysqlErr.Number == 1062
}

func ServicePlanToDeployType(sp commonv1.ServicePlan) string {
	if sp == commonv1.ServicePlan_SERVICE_PLAN_UNSPECIFIED {
		return ""
	}
	switch sp {
	case commonv1.ServicePlan_Premium_Reserved:
		return o11y.DeployTypeV2PremiumReserved
	case commonv1.ServicePlan_Essential_V2:
		return o11y.DeployTypeV2EssentialV2
	default:
		return strings.ToLower(sp.String())
	}
}

// NextGenClusterDeployType maps next-gen ServicePlan to cluster.deploy_type; premium-class plans use PremiumType.
func NextGenClusterDeployType(sp commonv1.ServicePlan) string {
	if sp == commonv1.ServicePlan_SERVICE_PLAN_UNSPECIFIED {
		return ""
	}
	switch sp {
	case commonv1.ServicePlan_Premium, commonv1.ServicePlan_Premium_Reserved, commonv1.ServicePlan_Essential_V2:
		return o11y.PremiumType
	case commonv1.ServicePlan_BYOC:
		return o11y.ByocType
	default:
		return strings.ToLower(sp.String())
	}
}

func ServicePlanV1BetaToDeployType(sp v1beta11.ServicePlan) string {
	if sp == v1beta11.ServicePlan_SERVICE_PLAN_UNSPECIFIED {
		return ""
	}
	return strings.ToLower(sp.String())
}
