package migration

import "time"

// Mapping is the verified legacy repository revision to exact ContentVersion
// mapping owned by the bounded product migration seam.
type Mapping struct {
	ID               string     `gorm:"primaryKey;size:64"`
	WorkspaceID      string     `gorm:"size:64;not null;index:idx_content_migration_workspace_content"`
	RepositoryID     string     `gorm:"column:ags_repository_id;size:64;not null;uniqueIndex:uk_content_migration_source"`
	CommitSHA        string     `gorm:"column:ags_commit_sha;size:64;not null;uniqueIndex:uk_content_migration_source"`
	ContentID        string     `gorm:"size:64;not null;index:idx_content_migration_workspace_content"`
	ContentVersionID string     `gorm:"size:64;not null;uniqueIndex"`
	Model            string     `gorm:"size:32;not null"`
	RootDigest       string     `gorm:"size:64;not null"`
	FileCount        int        `gorm:"not null"`
	SizeBytes        int64      `gorm:"not null"`
	VerifiedAt       *time.Time `gorm:"index"`
	CreatedAt        time.Time  `gorm:"not null"`
	UpdatedAt        time.Time  `gorm:"not null"`
}

func (Mapping) TableName() string { return "content_ags_migration_map" }

// Job is the durable phase cursor for one explicitly requested product
// binding and legacy source revision. It has no global pending-list query.
type Job struct {
	ID                    string `gorm:"primaryKey;size:64"`
	WorkspaceID           string `gorm:"size:64;not null;uniqueIndex:uk_content_migration_job_target,priority:1"`
	Domain                string `gorm:"size:64;not null;uniqueIndex:uk_content_migration_job_target,priority:2"`
	BindingKey            string `gorm:"size:128;not null;uniqueIndex:uk_content_migration_job_target,priority:3"`
	SourceCursor          string `gorm:"size:128;not null;uniqueIndex:uk_content_migration_job_target,priority:4"`
	RepositoryID          string `gorm:"column:ags_repository_id;size:64;not null"`
	CommitSHA             string `gorm:"column:ags_commit_sha;size:64;not null"`
	ExpectedHeadVersionID string `gorm:"size:64;not null;default:''"`
	ContentID             string `gorm:"size:64;not null;default:''"`
	ContentVersionID      string `gorm:"size:64;not null;default:''"`
	RootDigest            string `gorm:"size:64;not null;default:''"`
	FileCount             int    `gorm:"not null;default:0"`
	SizeBytes             int64  `gorm:"not null;default:0"`
	Cursor                string `gorm:"size:32;not null;default:'pending'"`
	Attempts              int    `gorm:"not null;default:0"`
	LeaseOwner            string `gorm:"size:128;not null;default:''"`
	LeaseUntil            *time.Time
	LastError             string    `gorm:"type:text;not null"`
	CreatedAt             time.Time `gorm:"not null"`
	UpdatedAt             time.Time `gorm:"not null"`
	CompletedAt           *time.Time
}

func (Job) TableName() string { return "content_ags_migration_jobs" }
