package dm

import (
	"fmt"
	"time"

	. "github.com/tidbcloud/dataflow-service-e2e/internal/model"
	"github.com/tidbcloud/dataflow-service-e2e/internal/tidbcloud/premium/consoleapi"
	dm_model "github.com/tidbcloud/dataflow-service-e2e/internal/tidbcloud/premium/consoleapi/dm/model"
)

// Timeout constants
const (
	DefaultMigrationTimeout      = 45 * time.Minute
	IncrementalRunTimeout        = 10 * time.Minute
	PrecheckTimeout              = 10 * time.Minute
	DefaultRetryAttempts    uint = 3
	DefaultRetryInterval         = time.Minute
	DefaultExpectAttempts   uint = 30
	DefaultExpectInterval        = 30 * time.Second
	DefaultDBForDMTest           = "test1"
)

// GenerateMigrationName creates a unique migration name for test purposes.
func GenerateMigrationName(prefix string) string {
	return fmt.Sprintf("e2e-%s-%d", prefix, time.Now().Unix())
}

// BuildCreateMigrationBody constructs a CreatePremiumMigrationBody for creating a premium DM migration.
// doDBs specifies databases to include in migration via PremiumMigrationRules.
func BuildCreateMigrationBody(
	name string,
	mode dm_model.V1beta2PremiumDMTaskMode,
	importMode dm_model.PremiumDMTaskImportModeENUM,
	tidbCluster *TiDBPremiumEntity,
	mysql *MySQLEntity,
	doDBs ...string,
) *dm_model.PremiumMigrationServiceCreatePremiumMigrationBody {
	source := consoleapi.BuildPremiumDMSource(mysql, doDBs...)
	return &dm_model.PremiumMigrationServiceCreatePremiumMigrationBody{
		DisplayName: &name,
		Mode:        &mode,
		ImportMode:  &importMode,
		Sources:     []*dm_model.V1beta2PremiumDMSource{source},
		Target: &dm_model.V1beta2PremiumDMTarget{
			User:     &tidbCluster.User,
			Password: &tidbCluster.Password,
		},
	}
}

// BuildPrecheckBody constructs a CreatePremiumMigrationPrecheckBody for running a precheck.
// doDBs specifies databases to include in precheck via PremiumMigrationRules.
func BuildPrecheckBody(
	name string,
	mode dm_model.V1beta2PremiumDMTaskMode,
	importMode dm_model.PremiumDMTaskImportModeENUM,
	tidbCluster *TiDBPremiumEntity,
	mysql *MySQLEntity,
	doDBs ...string,
) *dm_model.PremiumMigrationServiceCreatePremiumMigrationPrecheckBody {
	source := consoleapi.BuildPremiumDMSource(mysql, doDBs...)
	return &dm_model.PremiumMigrationServiceCreatePremiumMigrationPrecheckBody{
		DisplayName: &name,
		Mode:        &mode,
		ImportMode:  &importMode,
		Sources:     []*dm_model.V1beta2PremiumDMSource{source},
		Target: &dm_model.V1beta2PremiumDMTarget{
			User:     &tidbCluster.User,
			Password: &tidbCluster.Password,
		},
	}
}
