package constant

import (
	regionalserverlessv1 "github.com/tidbcloud/tidb-management-service/api/spec/regional/serverless/v1"
	"k8s.io/utils/pointer"
)

type DMTaskMode string

const (
	DMTaskModeIncr DMTaskMode = "incremental"
	DMTaskModeAll  DMTaskMode = "all"

	DMTaskIDPrefix         = "dmt-"
	DMSourceIDPrefix       = "dms-"
	DMPrecheckIDPrefix     = "dmp-"
	DMPrecheckItemIDPrefix = "dmpi-"
	DMVpcEndpointPrefix    = "dmep-"

	ServerlessNamespace = "tidb-serverless"
	DMServiceName       = "serverless-cluster-dm-master"

	DMTaskTargetHost = "tidb-gateway-privatelink.tidb-admin"
	DMTaskTargetPort = 4000
)

func DMProxyTarget() (namespace, service *string) {
	return pointer.String(ServerlessNamespace), pointer.String(DMServiceName)
}

type DMTaskStage string

const (
	DMTaskStageSourceCreating DMTaskStage = "sourceCreating"
	DMTaskStageSourceBounding DMTaskStage = "sourceBounding"
	DMTaskStageTaskCreating   DMTaskStage = "taskCreating"
	DMTaskStageRunning        DMTaskStage = "running"
	DMTaskStageStopped        DMTaskStage = "stopped"
	DMTaskStageFailed         DMTaskStage = "failed"
	DMTaskStageDeleting       DMTaskStage = "deleting"
	DMTaskStageDeleted        DMTaskStage = "deleted"

	CodeSchedulerSourceCfgNotExist     = 46008
	CodeSchedulerSubTaskOpTaskNotExist = 46016
	CodeSchedulerTaskNotExist          = 46018
	CodeSchedulerSubTaskExist          = 46014
)

type DMSourceStage string

const (
	DMSourceStageCreating DMSourceStage = "creating"
	DMSourceStageBounding DMSourceStage = "bounding"
	DMSourceStageBounded  DMSourceStage = "bounded"
	DMSourceStageDeleting DMSourceStage = "deleting"
	DMSourceStageDeleted  DMSourceStage = "deleted"
)

type DMPrecheckStage string

const (
	DMPrecheckStagePending  DMPrecheckStage = "pending"
	DMPrecheckStageRunning  DMPrecheckStage = "running"
	DMPrecheckStageFinished DMPrecheckStage = "finished"
	DMPrecheckStageCanceled DMPrecheckStage = "canceled"
	DMPrecheckStageFailed   DMPrecheckStage = "failed"
)

type DMVpcEndpointState string

const (
	DMVpcEndpointStatePending           DMVpcEndpointState = "pending"
	DMVpcEndpointStatePendingAcceptance DMVpcEndpointState = "pendingAcceptance"
	DMVpcEndpointStateAvailable         DMVpcEndpointState = "available"
	// DMVpcEndpointStateDeleting marks an endpoint that is being deleted asynchronously.
	DMVpcEndpointStateDeleting DMVpcEndpointState = "deleting"
	DMVpcEndpointStateFailed   DMVpcEndpointState = "failed"
	DMVpcEndpointStateDeleted  DMVpcEndpointState = "deleted"
)

type ConnType string

const (
	ConnTypePublic      ConnType = "public"
	ConnTypePrivateLink ConnType = "privatelink"
)

type DBType string

const (
	DBTypeMySQL            DBType = "mysql"
	DBTypeAliCloudRDSMySQL DBType = "alicloud-rds-mysql"
)

func (t DBType) DisplayName() string {
	switch t {
	case DBTypeMySQL:
		return "MySQL"
	case DBTypeAliCloudRDSMySQL:
		return "AliCloud RDS MySQL"
	default:
		return "<unknown>"
	}
}

var (
	AllModeCheckList = []regionalserverlessv1.DMPrecheck_PrecheckItem{
		regionalserverlessv1.DMPrecheck_PRECHECK_ITEM_DUMP_PRIVILEGE_CHECKING,
		regionalserverlessv1.DMPrecheck_PRECHECK_ITEM_REPLICATION_PRIVILEGE_CHECKING,
		regionalserverlessv1.DMPrecheck_PRECHECK_ITEM_VERSION_CHECKING,
		regionalserverlessv1.DMPrecheck_PRECHECK_ITEM_SERVER_ID_CHECKING,
		regionalserverlessv1.DMPrecheck_PRECHECK_ITEM_BINLOG_ENABLE_CHECKING,
		regionalserverlessv1.DMPrecheck_PRECHECK_ITEM_BINLOG_FORMAT_CHECKING,
		regionalserverlessv1.DMPrecheck_PRECHECK_ITEM_BINLOG_ROW_IMAGE_CHECKING,
		regionalserverlessv1.DMPrecheck_PRECHECK_ITEM_TABLE_SCHEMA_CHECKING,
		regionalserverlessv1.DMPrecheck_PRECHECK_ITEM_BINLOG_DB_CHECKING,
		regionalserverlessv1.DMPrecheck_PRECHECK_ITEM_CONN_NUMBER_CHECKING,
		regionalserverlessv1.DMPrecheck_PRECHECK_ITEM_TARGET_DB_PRIVILEGE_CHECKING,
	}

	IncrementModeCheckList = []regionalserverlessv1.DMPrecheck_PrecheckItem{
		regionalserverlessv1.DMPrecheck_PRECHECK_ITEM_REPLICATION_PRIVILEGE_CHECKING,
		regionalserverlessv1.DMPrecheck_PRECHECK_ITEM_VERSION_CHECKING,
		regionalserverlessv1.DMPrecheck_PRECHECK_ITEM_SERVER_ID_CHECKING,
		regionalserverlessv1.DMPrecheck_PRECHECK_ITEM_BINLOG_ENABLE_CHECKING,
		regionalserverlessv1.DMPrecheck_PRECHECK_ITEM_BINLOG_FORMAT_CHECKING,
		regionalserverlessv1.DMPrecheck_PRECHECK_ITEM_BINLOG_ROW_IMAGE_CHECKING,
		regionalserverlessv1.DMPrecheck_PRECHECK_ITEM_TABLE_SCHEMA_CHECKING,
		regionalserverlessv1.DMPrecheck_PRECHECK_ITEM_BINLOG_DB_CHECKING,
		regionalserverlessv1.DMPrecheck_PRECHECK_ITEM_TARGET_DB_PRIVILEGE_CHECKING,
	}
)

var (
	tidbCloudBaseUrl        = "https://docs.pingcap.com/tidbcloud/"
	DmDocUrl                = tidbCloudBaseUrl + "migrate-from-mysql-using-data-migration"
	dmTroubleshootingDocUrl = tidbCloudBaseUrl + "tidb-cloud-dm-precheck-and-troubleshooting"
	PrecheckItemHelpUrls    = map[regionalserverlessv1.DMPrecheck_PrecheckItem]string{
		regionalserverlessv1.DMPrecheck_PRECHECK_ITEM_DUMP_PRIVILEGE_CHECKING:        DmDocUrl + "#grant-required-privileges-to-the-upstream-database",
		regionalserverlessv1.DMPrecheck_PRECHECK_ITEM_REPLICATION_PRIVILEGE_CHECKING: DmDocUrl + "#grant-required-privileges-to-the-upstream-database",
		regionalserverlessv1.DMPrecheck_PRECHECK_ITEM_VERSION_CHECKING:               DmDocUrl + "#make-sure-your-data-source-and-version-are-supported",
		regionalserverlessv1.DMPrecheck_PRECHECK_ITEM_SERVER_ID_CHECKING:             dmTroubleshootingDocUrl + "#error-message-check-whether-mysql-server_id-has-been-greater-than-0",
		regionalserverlessv1.DMPrecheck_PRECHECK_ITEM_BINLOG_ENABLE_CHECKING:         dmTroubleshootingDocUrl + "#error-message-check-whether-mysql-binlog-is-enabled",
		regionalserverlessv1.DMPrecheck_PRECHECK_ITEM_BINLOG_FORMAT_CHECKING:         dmTroubleshootingDocUrl + "#error-message-check-whether-mysql-binlog_format-is-row",
		regionalserverlessv1.DMPrecheck_PRECHECK_ITEM_BINLOG_ROW_IMAGE_CHECKING:      dmTroubleshootingDocUrl + "#error-message-check-whether-mysql-binlog_row_image-is-full",
		regionalserverlessv1.DMPrecheck_PRECHECK_ITEM_TABLE_SCHEMA_CHECKING:          DmDocUrl, // don't have doc in tidbcloud about this, give it a default url
		regionalserverlessv1.DMPrecheck_PRECHECK_ITEM_BINLOG_DB_CHECKING:             dmTroubleshootingDocUrl + "#error-message-check-whether-migrated-dbs-are-in-binlog_do_dbbinlog_ignore_db",
		regionalserverlessv1.DMPrecheck_PRECHECK_ITEM_CONN_NUMBER_CHECKING:           dmTroubleshootingDocUrl + "#error-message-check-if-connection-concurrency-exceeds-databases-maximum-connection-limit",
		regionalserverlessv1.DMPrecheck_PRECHECK_ITEM_TARGET_DB_PRIVILEGE_CHECKING:   DmDocUrl + "#grant-required-privileges-to-the-downstream-tidb-cloud-cluster",
		regionalserverlessv1.DMPrecheck_PRECHECK_ITEM_META_POSITION_CHECKING:         DmDocUrl, // TODO: add this later
		regionalserverlessv1.DMPrecheck_PRECHECK_ITEM_PRIMARY_KEY_CHECKING:           "https://docs.pingcap.com/tidb/dev/dm-faq/#does-dm-support-migrating-data-from-alibaba-rds-or-other-cloud-databases",
	}
)

var (
	ActiveDMTaskStages = []DMTaskStage{
		DMTaskStageSourceCreating,
		DMTaskStageSourceBounding,
		DMTaskStageTaskCreating,
		DMTaskStageRunning,
		DMTaskStageStopped,
		DMTaskStageFailed,
	}
	NonDeletedDMTaskStages = append(ActiveDMTaskStages, DMTaskStageDeleting)
)
