package errorcode

import (
	"github.com/tidbcloud/pkgv2/bizerr"
	"github.com/tidbcloud/pkgv2/svcid"
)

const (
	BranchErrorOffset                = 1000
	ExportErrorOffset                = 2000
	ImportErrorOffSet                = 3000
	BackupErrorOffSet                = 4000
	AuditLogErrorOffSet              = 5000
	CDCErrOffset                     = 6000
	DMErrorOffSet                    = 7000
	PrivateLinkConnectionErrorOffSet = 8000
)

var (
	ErrCodeInvalidSpendLimitValue = bizerr.NewBusinessErrCode(
		svcid.ServerlessService,
		1,
		"ErrCodeInvalidSpendLimitValue",
	)
	ErrCodeLessThanMinSpendLimitValue = bizerr.NewBusinessErrCode(
		svcid.ServerlessService,
		2,
		"ErrCodeLessThanMinSpendLimitValue",
	)
	ErrCodeNoPaymentMethods = bizerr.NewBusinessErrCode(
		svcid.ServerlessService,
		3,
		"ErrCodeNoPaymentMethods",
	)
	ErrCodeNoFreeCreditAndSpendLimit = bizerr.NewBusinessErrCode(
		svcid.ServerlessService,
		4,
		"ErrCodeNoFreeCreditAndSpendLimit",
	)
	ErrCodeServerlessReachMaxFreeNum = bizerr.NewBusinessErrCode(
		svcid.ServerlessService,
		5,
		"ErrCodeServerlessReachMaxFreeNum",
	)
	ErrCodeGreaterThanMaxSpendLimitValue = bizerr.NewBusinessErrCode(
		svcid.ServerlessService,
		6,
		"ErrCodeGreaterThanMaxSpendLimitValue",
	)
	ErrCodeBranchNotRunning = bizerr.NewBusinessErrCode(
		svcid.ServerlessService,
		7,
		"ErrCodeBranchNotRunning",
	)
	ErrCodeClusterNotRunning = bizerr.NewBusinessErrCode(
		svcid.ServerlessService,
		9,
		"ErrCodeClusterNotRunning",
	)
	ErrCodeGreaterThanBranchNumbersLimit = bizerr.NewBusinessErrCode(
		svcid.ServerlessService,
		10,
		"ErrCodeGreaterThanBranchNumbersLimit",
	)
	ErrCodeCreateBranchFromThrottledCluster = bizerr.NewBusinessErrCode(
		svcid.ServerlessService,
		11,
		"ErrCodeCreateBranchFromThrottledCluster",
	)
	ErrCodeCreateBranchNotFromServerlessCluster = bizerr.NewBusinessErrCode(
		svcid.ServerlessService,
		12,
		"ErrCodeCreateBranchNotFromServerlessCluster",
	)
	ErrCodeBranchNameReserved = bizerr.NewBusinessErrCode(
		svcid.ServerlessService,
		13,
		"ErrCodeBranchNameReserved",
	)
	ErrCodeBranchNameInvalidLength = bizerr.NewBusinessErrCode(
		svcid.ServerlessService,
		15,
		"ErrCodeBranchNameInvalidLength",
	)
	ErrCodeBranchNotBelongToMainBranch = bizerr.NewBusinessErrCode(
		svcid.ServerlessService,
		16,
		"ErrCodeBranchNotBelongToMainBranch",
	)
	ErrCodeParentBranchSizeTooLarge = bizerr.NewBusinessErrCode(
		svcid.ServerlessService,
		17,
		"ErrCodeParentBranchSizeTooLarge",
	)
	ErrCodeInvalidBranchAnnotation = bizerr.NewBusinessErrCode(
		svcid.ServerlessService,
		18,
		"ErrCodeInvalidBranchAnnotation",
	)
	ErrCodeNegativePageSize = bizerr.NewBusinessErrCode(
		svcid.ServerlessService,
		20,
		"ErrCodeNegativePageSize",
	)
	ErrCodeInvalidPageToken = bizerr.NewBusinessErrCode(
		svcid.ServerlessService,
		21,
		"ErrCodeInvalidPageToken",
	)
	ErrCodeEmptyClusterID = bizerr.NewBusinessErrCode(
		svcid.ServerlessService,
		22,
		"ErrCodeEmptyClusterId",
	)
	ErrCodeUnsupportedClusterType = bizerr.NewBusinessErrCode(
		svcid.ServerlessService,
		23,
		"ErrCodeUnsupportedClusterType",
	)
	ErrCodeInvalidRegion = bizerr.NewBusinessErrCode(
		svcid.ServerlessService,
		24,
		"ErrCodeInvalidRegion",
	)
	ErrCodeInvalidOrderby = bizerr.NewBusinessErrCode(
		svcid.ServerlessService,
		25,
		"ErrCodeInvalidOrderby",
	)
	ErrCodeInvalidBranchParentId = bizerr.NewBusinessErrCode(
		svcid.ServerlessService,
		26,
		"ErrCodeInvalidBranchParentId",
	)
	ErrCodeDeleteBranchHasChildren = bizerr.NewBusinessErrCode(
		svcid.ServerlessService,
		27,
		"ErrCodeDeleteBranchHasChildren",
	)
	ErrCodeClusterNotServerless = bizerr.NewBusinessErrCode(
		svcid.ServerlessService,
		28,
		"ErrCodeClusterNotServerless",
	)
	ErrCodeInvalidParentTimestamp = bizerr.NewBusinessErrCode(
		svcid.ServerlessService,
		29,
		"ErrCodeInvalidParentTimestamp",
	)
	ErrCodeBranchParentOrChildNotRunning = bizerr.NewBusinessErrCode(
		svcid.ServerlessService,
		30,
		"ErrCodeBranchParentOrChildNotRunning",
	)
	ErrCodeS3AccessDeny = bizerr.NewBusinessErrCode(
		svcid.ServerlessService,
		31,
		"ErrCodeS3AccessDeny",
	)
	ErrCodeGcsAccessDeny = bizerr.NewBusinessErrCode(
		svcid.ServerlessService,
		32,
		"ErrCodeGcsAccessDeny",
	)
	ErrCodeAzureBlobAccessDeny = bizerr.NewBusinessErrCode(
		svcid.ServerlessService,
		33,
		"ErrCodeAzureBlobAccessDeny",
	)
	ErrCodeEmptyOrgId = bizerr.NewBusinessErrCode(
		svcid.ServerlessService,
		34,
		"ErrCodeEmptyOrgId",
	)
	ErrCodeS3BucketNotFound = bizerr.NewBusinessErrCode(
		svcid.ServerlessService,
		35,
		"ErrCodeS3BucketNotFound",
	)
	ErrCodeOssAccessDeny = bizerr.NewBusinessErrCode(
		svcid.ServerlessService,
		36,
		"ErrCodeOssAccessDeny",
	)
	ErrCodeInvalidCloudProvider = bizerr.NewBusinessErrCode(
		svcid.ServerlessService,
		37,
		"ErrCodeInvalidCloudProvider",
	)
	// ErrCodeClusterSQLError carries a user-actionable SQL error raised from the
	// user's own TiDB cluster (e.g. table not found, syntax error). It is a
	// business error code on purpose so the (sanitized) message is surfaced to
	// the user instead of being masked as a generic internal error.
	ErrCodeClusterSQLError = bizerr.NewBusinessErrCode(
		svcid.ServerlessService,
		38,
		"ErrCodeClusterSQLError",
	)

	ErrCodeSvcClusterProxy = bizerr.NewInternalErrCode(svcid.ServerlessService, 1, "ErrCodeSvcClusterProxy")
	ErrCodeSvcAccount      = bizerr.NewInternalErrCode(svcid.ServerlessService, 2, "ErrCodeSvcAccount")
	ErrCodeSvcBilling      = bizerr.NewInternalErrCode(svcid.ServerlessService, 3, "ErrCodeSvcBilling")
	ErrCodeSvcCore         = bizerr.NewInternalErrCode(svcid.ServerlessService, 4, "ErrCodeSvcCore")
	ErrCodeSvcInfra        = bizerr.NewInternalErrCode(svcid.ServerlessService, 5, "ErrCodeSvcInfra")
	ErrCodeSvcO11y         = bizerr.NewInternalErrCode(svcid.ServerlessService, 6, "ErrCodeSvcO11y")
	ErrCodeSvcDB           = bizerr.NewInternalErrCode(svcid.ServerlessService, 7, "ErrCodeSvcDB")
	ErrCodeSvcBranch       = bizerr.NewInternalErrCode(svcid.ServerlessService, 8, "ErrCodeSvcBranch")
	ErrCodeSvcEncryptor    = bizerr.NewInternalErrCode(svcid.ServerlessService, 9, "ErrCodeSvcEncryptor")
	// ErrCodeInternalError is used for user-friendly internal error message
	ErrCodeInternalError = bizerr.NewInternalErrCode(svcid.ServerlessService, 10, "ErrCodeInternalError")
	ErrCodeSvcCluster    = bizerr.NewInternalErrCode(svcid.ServerlessService, 11, "ErrCodeSvcCluster")
	ErrCodeSvcMgmt       = bizerr.NewInternalErrCode(svcid.ServerlessService, 12, "ErrCodeSvcMgmt")
)

const (
	InternalErrorMessage = "We are currently facing internal issues. Our team is actively working to resolve this as quickly as possible. Please try again later."

	ErrMsgInvalidSpendLimitValue        = "The value entered for Spending Limit is invalid. Please ensure that the value entered is greater than or equal to 0."
	ErrMsgSpendLimitPrecheckFailed      = "Precheck failed for Spending Limit."
	ErrMsgLessThanMinSpendLimitValue    = "Based on the resource usage of the cluster, we recommend that you set the Spending Limit to at least $%s."
	ErrMsgNoPaymentMethods              = "Please add a credit card to activate the Spending Limit setting."
	ErrMsgServerlessReachFreeMaximumNum = "You have reached the maximum number of free clusters. Please set a monthly Spending Limit to continue."
	ErrMsgGreaterThanMaxSpendLimitValue = "Spending limit cannot exceed $%s. If you require a higher limit, please contact our sales team for assistance."
	ErrMsgCheckAdvancedEncryption       = "Dual-layer encryption is only available for clusters with a monthly Spending Limit greater than zero."
	ErrMsgCheckAdvancedFeature          = "The cluster has advanced features enabled, and the monthly Spending Limit must be greater than zero."
	ErrMsgInvalidClusterPlan            = "The cluster plan does not support Spending Limit."
	ErrMsgInvalidRegion                 = "Invalid region %s"

	ErrMsgGetClusterFailed         = "get cluster failed"
	ErrMsgListClustersFailed       = "list cluster failed"
	ErrMsgGetSpendLimitFailed      = "query Spending Limit failed"
	ErrMsgListSpendLimitsFailed    = "list Spending Limits failed"
	ErrMsgSetSpendLimitFailed      = "set Spending Limit failed"
	ErrMsgModifySpendLimitFailed   = "update Spending Limit failed"
	ErrMsgGetSpendLimitInfoFailed  = "get Spending Limit info failed"
	ErrMsgSaveTidbPoolPolicyFailed = "save tidb pool policy failed"
	ErrMsgGetSkuUsagesFailed       = "get sku usages failed"
	ErrMsgGetSkuPricesFailed       = "get sku prices failed"
	ErrMsgBranchStatusUnknown      = "unknown branch status"
	ErrMsgBranchGetKeySpaceFailed  = "get branch keyspaceID failed"
	ErrMsgGetSkuCostsFailed        = "get sku costs failed"
	ErrMsgGetClusterCostsFailed    = "cluster cost explorer failed"
	ErrMsgMissMatchClusterNumber   = "miss match cluster number"
	ErrMsgIndexAdvisorFailed       = "advise indexes failed %s"
	ErrMsgInitS3Failed             = "init s3 failed"
	ErrMsgGenHtmlTemplateFailed    = "genarate html template failed"
	ErrMsgSendgridEmailFailed      = "send email through sendgrid failed"
	WarnMsgEmptyClustersOrg        = "there is no cluster in org"
	ErrMsgCheckFreeQuotaFailed     = "check free quota failed"
	ErrMsgS3AccessDeny             = "S3 access deny, please check your S3 access key or role arn and uri."
	ErrMsgBucketNotFound           = "S3 bucket not found, please check your S3 bucket URI."
	ErrMsgInvalidCloudProvider     = "Invalid cloud provider"
)
