package migrate

import (
	"github.com/go-gormigrate/gormigrate/v2"
	migrate_record "github.com/pingcap/dbaas/cost-metering-service/model/migrate/migrate_record"
	"github.com/pingcap/errors"
	"gorm.io/gorm"
)

func MigrateDB(db *gorm.DB, initData bool) error {
	if initData {
		return doMigrate(db, migrate_record.InitDBWithData, migrate_record.GetMigrationRecords())
	}
	return doMigrate(db, migrate_record.InitDB, migrate_record.GetMigrationRecords())
}

func doMigrate(db *gorm.DB, initSchema gormigrate.InitSchemaFunc, migrations []*migrate_record.Migration) error {
	var gormMigrations []*gormigrate.Migration
	for _, item := range migrations {
		gormMigrations = append(gormMigrations, &gormigrate.Migration{
			ID:      item.Version,
			Migrate: item.Migrate,
		})
	}
	goMigration := gormigrate.New(db, &gormigrate.Options{TableName: "migrations"}, gormMigrations)
	goMigration.InitSchema(initSchema)
	err := goMigration.Migrate()
	if err != nil {
		return errors.Annotate(err, "migrate database failed")
	}
	return nil
}
