package dm

import (
	"fmt"
	"time"

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

	dm_service "github.com/tidbcloud/dataflow-service-e2e/internal/tidbcloud/dedicated/consoleapi/dm/client/service"
)

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

// DM job modes
const (
	DMModeFull        = "full"
	DMModeIncremental = "incremental"
	DMModeAll         = "all"
)

// DM import modes
const (
	DMImportModeLogical  = "logical"
	DMImportModePhysical = "physical"
)

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

// BuildCreateJobBody constructs a CreateDMJobBody for creating a DM job.
// connProfileID is the ID of a pre-registered connection profile.
// precheckID is the ID of a completed precheck for the same cluster.
// Optional doDBs lists databases to include in migration (only applies when fullInstanceMigrate is false).
func BuildCreateJobBody(
	name string,
	mode string,
	importMode string,
	specID string,
	tidbCluster *TiDBDedicatedEntity,
	connProfileID string,
	precheckID string,
	fullInstanceMigrate bool,
	doDBs []string,
) dm_service.CreateDMJobBody {
	source := consoleapi.BuildDMSourceFromConnProfileID(connProfileID, fullInstanceMigrate, doDBs...)
	fullMigrate := fullInstanceMigrate
	return dm_service.CreateDMJobBody{
		Name:                &name,
		Mode:                &mode,
		ImportMode:          &importMode,
		SpecID:              specID,
		ClusterUser:         &tidbCluster.User,
		ClusterPassword:     &tidbCluster.Password,
		Sources:             []*dm_model.DmSource{source},
		FullInstanceMigrate: &fullMigrate,
		PrecheckID:          precheckID,
	}
}

// BuildPrecheckBody constructs a PrecheckJobBody for running a precheck.
func BuildPrecheckBody(
	name string,
	mode string,
	importMode string,
	specID string,
	tidbCluster *TiDBDedicatedEntity,
	mysql *MySQLEntity,
	fullInstanceMigrate bool,
) dm_service.PrecheckJobBody {
	source := consoleapi.BuildDMSource(mysql)
	fullMigrate := fullInstanceMigrate
	return dm_service.PrecheckJobBody{
		Name:                &name,
		Mode:                &mode,
		ImportMode:          &importMode,
		SpecID:              specID,
		ClusterUser:         &tidbCluster.User,
		ClusterPassword:     &tidbCluster.Password,
		Sources:             []*dm_model.DmSource{source},
		FullInstanceMigrate: &fullMigrate,
	}
}
