package migrate

import (
	"encoding/json"

	dispatchmodel "github.com/tidbcloud/aisupport/services/ticket-manager/models/dispatch"

	"gorm.io/gorm"
)

var _ = addRecord("202607171200", migrateDispatchRuleIssueFields)

func migrateDispatchRuleIssueFields(db *gorm.DB) error {
	var rules []dispatchmodel.Rule
	if err := db.Select("id", "condition_json").Find(&rules).Error; err != nil {
		return err
	}
	for _, rule := range rules {
		var condition map[string]any
		if err := json.Unmarshal(rule.ConditionJSON, &condition); err != nil {
			return err
		}
		prefixIssueFields(condition)
		conditionJSON, err := json.Marshal(condition)
		if err != nil {
			return err
		}
		if err := db.Table("dispatch_rules").Where("id = ?", rule.ID).Update("condition_json", conditionJSON).Error; err != nil {
			return err
		}
	}
	return nil
}

func prefixIssueFields(condition map[string]any) {
	walkCondition(condition, func(condition map[string]any) {
		if field, ok := condition["field"].(string); ok {
			condition["field"] = "issue." + field
		}
	})
}

func walkCondition(value any, visit func(map[string]any)) {
	switch value := value.(type) {
	case map[string]any:
		visit(value)
		for _, child := range value {
			walkCondition(child, visit)
		}
	case []any:
		for _, child := range value {
			walkCondition(child, visit)
		}
	}
}
