package k8supgrade

import (
	"time"

	"github.com/tidbcloud/devops/models/base"
)

type Task struct {
	base.Updatable

	Name                string     `gorm:"column:name;type:varchar(255);not null"`
	CloudProvider       string     `gorm:"column:cloud_provider;type:varchar(50);not null"`
	VersionToBeUpgraded string     `gorm:"column:version_to_be_upgrade;type:varchar(50);not null"`
	MaxRestartTimes     uint32     `gorm:"column:max_restart_times;type:tinyint unsigned"`
	Deadline            time.Time  `gorm:"column:deadline;type:timestamp;not null"`
	Status              string     `gorm:"index:idx_task_status,column:status;type:varchar(50);not null"`
	Applicant           string     `gorm:"column:applicant;type:varchar(255);not null"`
	ClosedAt            *time.Time `gorm:"column:closed_at;type:timestamp;default:null"`
	ApprovalID          *uint64    `gorm:"index:idx_approval_id,column:approval_id;type:bigint(20) unsigned"`
	Regions             []byte     `gorm:"type:JSON"`
	SelectorType        string     `gorm:"column:selector_type;type:varchar(50)"`
	SelectorValue       string     `gorm:"column:selector_value;type:varchar(255)"`
	Synced              bool       `gorm:"column:synced;default:false"`
}

func (Task) TableName() string {
	return "k8s_upgrade_tasks"
}

type K8sCluster struct {
	ID                     base.ID `gorm:"primary_key;not null"`
	Name                   string  `gorm:"column:name;type:varchar(255);not null"`
	TaskID                 uint64  `gorm:"index:task_id;column:task_id;type:bigint(20) unsigned"`
	CloudProvider          string  `gorm:"column:cloud_provider;type:varchar(50);not null"`
	MaintenanceWindowID    *uint64 `gorm:"column:maintenance_window_id;type:bigint(20) unsigned"`
	UpgradeOperationStatus string  `gorm:"column:upgrade_operation_status;type:varchar(50)"`
	UpgradeOperationCR     string  `gorm:"column:upgrade_operation_cr;type:TEXT"`
	IsExcluded             bool    `gorm:"column:is_excluded;default:false"`
	DesiredVersion         string  `gorm:"column:desired_version;type:varchar(50)"`
	DisableAutoGeneration  bool    `gorm:"column:disable_auto_generation;default:false"`
	TenantName             string  `gorm:"column:tenant_name;type:varchar(255)"`
	BusinessRegion         string  `gorm:"column:business_region;type:varchar(50)"`
	TenantKind             string  `gorm:"column:tenant_kind;type:varchar(50)"`
	Region                 string  `gorm:"column:region;type:varchar(50)"`
	K8sSnapshot            []byte  `gorm:"column:k8s_snapshot;type:JSON"`
	// Version is used for optimistic locking. It is incremented on every write.
	// Reads during sync record the version; the write-back only succeeds when
	// version still matches, preventing stale-snapshot overwrites.
	Version uint64 `gorm:"column:version;not null;default:0"`
}

func (K8sCluster) TableName() string {
	return "k8s_upgrade_k8s_clusters"
}
