package migrate

import (
	"context"

	jmpmod "github.com/tidbcloud/devops/models/jump"
	"github.com/tidbcloud/devops/pkg/service/jump/repo/cvt"

	"github.com/tidbcloud/pkgv2/db"
	"gorm.io/gorm"
)

// migration for jump table to add a column `destination_id`
var _ = AddMigrateRecord(
	"202601061400",
	func(raw *gorm.DB) error {
		err := raw.AutoMigrate(&jmpmod.Jump{})
		if err != nil {
			return err
		}

		dbp := db.NewProvider(raw)
		cvter := cvt.NewConverter()

		return dbp.Transaction(context.Background(), func(ctx context.Context) error {
			page := 1
			perPage := 100
			wdb := dbp.WriteDB(ctx)

			for {
				jumps := []*jmpmod.Jump{}
				err := wdb.Model(&jmpmod.Jump{}).Where("destination_id = ''").Limit(perPage).Offset((page - 1) * perPage).Find(&jumps).Error
				if err != nil {
					return err
				}

				if len(jumps) == 0 {
					break
				}

				for _, jump := range jumps {
					jumpEnt := cvter.ModelToEntity().Jump(jump)
					destID := jumpEnt.Destination.Extract().ID()
					jump.DestinationID = destID
					err := wdb.Model(&jmpmod.Jump{}).Where("id = ?", jump.ID).Update("destination_id", destID).Error
					if err != nil {
						return err
					}
				}
				page++
			}

			return nil
		})

	},
)
