package schema

import (
	"time"

	"gorm.io/gorm"
)

type PrivateLinkServiceMigration struct {
	gorm.Model

	SourceClusterID              uint64 `gorm:"column:source_cluster_id;not null;index:idx_plsm_source_target"`
	TargetClusterID              uint64 `gorm:"column:target_cluster_id;not null;index:idx_plsm_source_target"`
	RunMode                      string `gorm:"column:run_mode;type:ENUM('PARALLEL','SEQUENTIAL')"`
	State                        string `gorm:"column:state;type:ENUM('PENDING','RUNNING','SUCCEEDED','FAILED','CANCELLED');index:idx_plsm_state"`
	Message                      string `gorm:"column:message;size:1024"`
	OrganizationID               uint64 `gorm:"column:organization_id;not null;index:idx_plsm_organization_project"`
	ProjectID                    uint64 `gorm:"column:project_id;not null;index:idx_plsm_organization_project"`
	MigrationPlanDisableRecreate *bool  `gorm:"column:migration_plan_disable_recreate"`
	MigrationPlanTimeoutSeconds  *int   `gorm:"column:migration_plan_timeout_seconds"`

	MigrationTidbGroups []*MigrationTidbGroup `gorm:"foreignKey:migration_id;constraint:OnDelete:CASCADE"`
}

type MigrationTidbGroup struct {
	gorm.Model

	MigrationID       uint64     `gorm:"column:migration_id;not null;index:idx_mtg_migration;uniqueIndex:idx_mtg_unique_migration_source_target"`
	SourceTidbGroupID uint64     `gorm:"column:source_tidb_group_id;not null;uniqueIndex:idx_mtg_unique_migration_source_target"`
	TargetTidbGroupID uint64     `gorm:"column:target_tidb_group_id;not null;uniqueIndex:idx_mtg_unique_migration_source_target"`
	State             string     `gorm:"column:state;not null;index:idx_mtg_state;type:ENUM('PENDING','RUNNING','SUCCEEDED','FAILED','CANCELLED')"`
	Message           string     `gorm:"column:message;size:1024"`
	StartTime         *time.Time `gorm:"column:start_time"`
	CompleteTime      *time.Time `gorm:"column:complete_time"`
}
