package migrate_record

import (
	"fmt"
	"sort"

	"gorm.io/gorm"
)

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

// 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 string, m func(*gorm.DB) error) bool {
	checkDuplicateMigrationVersion(version, dbMigrationRecords)
	dbMigrationRecords = append(dbMigrationRecords, &Migration{
		Version: version,
		Migrate: m,
	})
	return true
}

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

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