package model

import "strings"

type WorkloadTaskType string

const (
	WorkloadTaskTypeCreateCluster WorkloadTaskType = "create_cluster"
	WorkloadTaskTypePrepareData   WorkloadTaskType = "prepare_data"
	WorkloadTaskTypeRunTraffic    WorkloadTaskType = "run_traffic"
)

type ExecStatus string

const (
	ExecStatusPending   ExecStatus = "pending"
	ExecStatusRunning   ExecStatus = "running"
	ExecStatusCompleted ExecStatus = "completed"
	ExecStatusFailed    ExecStatus = "failed"

	// stopping is a special phase for startting stopping a task, **trigerred by user**
	// which means tasks cancelled/terminated by downstream svces shouldn't be set to this phase(but set to failed)
	ExecStatusStopping ExecStatus = "stopping"
	ExecStatusStopped  ExecStatus = "stopped"
)

var ActiveStatuses = []ExecStatus{
	ExecStatusPending,
	ExecStatusRunning,
	ExecStatusStopping,
}

type RelatedService string

const (
	RelatedServiceTiDBCloud  RelatedService = "tidbcloud"
	RelatedServiceTCMS       RelatedService = "tcms"
	RelatedServiceTiWorkload RelatedService = "tiworkload"
)

type WorkloadTestPhase string

const (
	WorkloadTestPhasePending       WorkloadTestPhase = "Pending"
	WorkloadTestPhaseCreateCluster WorkloadTestPhase = "Creating Cluster"
	WorkloadTestPhasePrepareData   WorkloadTestPhase = "Preparing Data"
	WorkloadTestPhaseRunWorkload   WorkloadTestPhase = "Running Workload"
	WorkloadTestPhaseFinished      WorkloadTestPhase = "Finished"
	WorkloadTestPhaseDumb          WorkloadTestPhase = ""
)

// WorkloadTaskPhase represents the internal phase of a task for better tracking and recovery
type WorkloadTaskPhase string

const (
	WorkloadTaskPhasePending    WorkloadTaskPhase = "pending"    // Task created but not yet triggered
	WorkloadTaskPhaseTriggering WorkloadTaskPhase = "triggering" // Calling external service to trigger the task
	WorkloadTaskPhaseRunning    WorkloadTaskPhase = "running"    // Polling external service for task status
	WorkloadTaskPhaseCompleted  WorkloadTaskPhase = "completed"  // Task completed successfully
	WorkloadTaskPhaseFailed     WorkloadTaskPhase = "failed"     // Task failed

	WorkloadTaskPhaseStopping WorkloadTaskPhase = "stopping"
	WorkloadTaskPhaseStopped  WorkloadTaskPhase = "stopped"

	WorkloadTaskPhaseUpdating WorkloadTaskPhase = "updating" // under Updating task configuration, only viable for workload task now
)

var FlyingWorkloadTaskPhases = []WorkloadTaskPhase{
	WorkloadTaskPhaseTriggering,
	WorkloadTaskPhaseStopping,
}

type OperatorType string

const (
	OperatorTypeService OperatorType = "service"
	OperatorTypeUser    OperatorType = "user"
)

// OperateType follows the pattern:
// {service}_{action}_{object}
type OperateType string

// ReadableString returns a readable string for the operate type
// which remove the service prefix, and replace _ with space
func (o OperateType) ReadableString() string {
	s := string(o)
	if idx := strings.Index(s, "_"); idx != -1 {
		s = s[idx+1:]
	}
	return strings.ReplaceAll(s, "_", " ")
}

const (
	// INFO: add async type (like workload_finish_scaling_cluster) if need
	// the trigger operation don't need to be prefixed with "trigger" for concision.

	OperateTypeCreateWorkloadTest OperateType = "workload_create_test"
	OperateTypeStopWorkloadTest   OperateType = "workload_stop_test"

	OperateTypeCreateCluster OperateType = "workload_create_cluster"
	OperateTypePrepareData   OperateType = "workload_prepare_data"
	OperateTypeRunTraffic    OperateType = "workload_run_traffic"

	OperateTypeScaleCluster      OperateType = "workload_scale_cluster"
	OperateTypeConfigTrafficConn OperateType = "workload_config_traffic_connection"
	OperateTypeUpdateClusterRU   OperateType = "workload_update_cluster_ru"
	OperateTypeInjectFailure     OperateType = "workload_inject_failure"
	OperateTypeRollbackFailure   OperateType = "workload_rollback_failure"
	OperateTypeExecuteSQL        OperateType = "workload_execute_sql"

	OperateTypeDownloadWorkloadTestPDF OperateType = "workload_download_pdf"

	OperateTypeProceed OperateType = "workload_script_proceed"
)

var WorkloadTestObjectTypes = []OperateType{
	OperateTypeCreateWorkloadTest,
	OperateTypeStopWorkloadTest,
	OperateTypeCreateCluster,
	OperateTypePrepareData,
	OperateTypeRunTraffic,
	OperateTypeScaleCluster,
	OperateTypeConfigTrafficConn,
	OperateTypeUpdateClusterRU,
	OperateTypeInjectFailure,
	OperateTypeRollbackFailure,
	OperateTypeExecuteSQL,
	OperateTypeDownloadWorkloadTestPDF,
	OperateTypeProceed,
}

type ClusterType string

const (
	ClusterTypeTiDBCloudPremium   ClusterType = "tidbcloud-premium"
	ClusterTypeTiDBCloudEssential ClusterType = "tidbcloud-essential"
)

type ScriptPhaseType string

const (
	ScriptPhaseTypeProceed ScriptPhaseType = "proceed"
	ScriptPhaseTypeMutate  ScriptPhaseType = "mutate"
)
