package db

import (
	"fmt"
	"sort"

	"gorm.io/gorm"
)

type Migration struct {
	Migrate func(*gorm.DB) error
	Version int
}

// byVersion implements sort.Interface based on the version field.
type byVersion []*Migration

func (a byVersion) Len() int           { return len(a) }
func (a byVersion) Less(i, j int) bool { return a[i].Version < a[j].Version }
func (a byVersion) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }

var MigrationRecords = make([]*Migration, 0)

func AddMigrateRecord(version int, m func(*gorm.DB) error) bool {
	checkDuplicateMigrationVersion(version, MigrationRecords)
	MigrationRecords = append(MigrationRecords, &Migration{
		Version: version,
		Migrate: m,
	})
	return true
}

func checkDuplicateMigrationVersion(version int, records []*Migration) {
	for _, item := range records {
		if item.Version == version {
			panic(fmt.Sprintf("migration version is already added: %d", version))
		}
	}
}

func GetMigrationRecords() []*Migration {
	sort.Sort(byVersion(MigrationRecords))
	return MigrationRecords
}

var _ = AddMigrateRecord(
	1,
	func(db *gorm.DB) error {
		return db.AutoMigrate(&ExperimentApproveRecord{})
	},
)
