package migrate

import (
	"fmt"

	premmod "github.com/tidbcloud/devops/models/premiumupgrade"

	"gorm.io/gorm"
)

var _ = AddMigrateRecord(
	"202608141630",
	func(db *gorm.DB) error {
		step := &premmod.UpgradeStep{}
		migrator := db.Migrator()
		if !migrator.HasTable(step) {
			return db.AutoMigrate(step)
		}

		// The first version stored one component per step. Add the grouped intent
		// as nullable columns first so existing rows can be backfilled safely.
		if !migrator.HasColumn(step, "ApplyGroup") {
			if err := db.Exec("ALTER TABLE `premium_upgrade_steps` ADD COLUMN `apply_group` VARCHAR(255) NULL").Error; err != nil {
				return fmt.Errorf("add premium upgrade apply group: %w", err)
			}
		}
		if !migrator.HasColumn(step, "Components") {
			if err := db.Exec("ALTER TABLE `premium_upgrade_steps` ADD COLUMN `components` JSON NULL").Error; err != nil {
				return fmt.Errorf("add premium upgrade step components: %w", err)
			}
		}

		if migrator.HasColumn(step, "component") {
			if err := db.Exec(`
				UPDATE premium_upgrade_steps
				SET apply_group = component,
				    components = JSON_ARRAY(JSON_OBJECT(
				        'component', component,
				        'from_version', from_version,
				        'to_version', to_version
				    ))
				WHERE apply_group IS NULL OR components IS NULL
			`).Error; err != nil {
				return fmt.Errorf("backfill premium upgrade step components: %w", err)
			}
		}

		if err := db.Exec("ALTER TABLE `premium_upgrade_steps` MODIFY COLUMN `apply_group` VARCHAR(255) NOT NULL, MODIFY COLUMN `components` JSON NOT NULL").Error; err != nil {
			return fmt.Errorf("require premium upgrade grouped intent: %w", err)
		}
		for _, index := range []string{"uk_premium_upgrade_step_component", "uk_premium_upgrade_step_sequence"} {
			if migrator.HasIndex(step, index) {
				if err := migrator.DropIndex(step, index); err != nil {
					return fmt.Errorf("drop legacy premium upgrade step index %s: %w", index, err)
				}
			}
		}
		for _, column := range []string{"component", "from_version", "to_version"} {
			if migrator.HasColumn(step, column) {
				if err := migrator.DropColumn(step, column); err != nil {
					return fmt.Errorf("drop legacy premium upgrade step column %s: %w", column, err)
				}
			}
		}
		return db.AutoMigrate(step)
	},
)
