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 DBMigrationRecords []*Migration = make([]*Migration, 0)

func AddMigrateRecord(version int, m func(*gorm.DB) error) bool {
	checkDuplicateMigrationVersion(version, DBMigrationRecords)
	DBMigrationRecords = append(DBMigrationRecords, &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(DBMigrationRecords))
	return DBMigrationRecords
}
