package migrate

import (
	"context"
	"fmt"

	"github.com/tidbcloud/core-svc/model"
	"github.com/tidbcloud/pkgv2/log"
	"github.com/tidbcloud/pkgv2/logid"
	"gorm.io/gorm"
)

// add RegionId to Cluster
var _ = AddCoreMigrateRecord(
	"202211291611",
	func(db *gorm.DB) error {
		if err := db.AutoMigrate(&model.Cluster{}); err != nil {
			return err
		}
		ctx := context.Background()
		ctx = logid.WithLogid(ctx, logid.GenLogid())
		return addRegion2Cluster(ctx, db)
	},
)

func addRegion2Cluster(ctx context.Context, db *gorm.DB) error {
	const (
		migrateClusterRegionBatchSize = 1000
	)
	logger := log.WithContextS(ctx)

	id := uint64(0)
	for {
		var clusters []*model.Cluster
		if err := db.Model(&model.Cluster{}).Preload("ComponentsV2").Where("id > ?", id).Order("id ASC").Limit(migrateClusterRegionBatchSize).
			Find(&clusters).Error; err != nil {
			return fmt.Errorf("find cluster: %w", err)
		}

		for _, cluster := range clusters {
			if len(cluster.ComponentsV2) == 0 {
				logger.Warnf("cluster have no components, id=%d", cluster.ID)
				continue
			}

			regionId := cluster.ComponentsV2[0].RegionID
			cluster.RegionID = regionId
			logger.Infof("cluster region, clusterId=%d,regionId=%d", cluster.ID, regionId)
			if err := cluster.Update(db, model.ClusterDBSchema.RegionID); err != nil {
				return fmt.Errorf("update cluster: %w", err)
			}
		}

		if len(clusters) < migrateClusterRegionBatchSize {
			logger.Infof("all cluster migrated, done")
			break
		}
		id = clusters[len(clusters)-1].ID.Uint64()
	}

	return nil
}
