package database

import (
	"github.com/tidbcloud/AgentTeam/internal/store/resource/skills"
	"gorm.io/gorm"
)

func dropSkillAgentBindingRepoSnapshotColumns(db *gorm.DB) error {
	if db == nil || !db.Migrator().HasTable(&skills.SkillAgentBinding{}) {
		return nil
	}
	if db.Migrator().HasIndex(&skills.SkillAgentBinding{}, "idx_skill_agent_bindings_repo") {
		if err := db.Migrator().DropIndex(&skills.SkillAgentBinding{}, "idx_skill_agent_bindings_repo"); err != nil {
			return err
		}
	}
	for _, column := range []string{"repo_owner", "repo_name"} {
		if !db.Migrator().HasColumn(&skills.SkillAgentBinding{}, column) {
			continue
		}
		if err := db.Migrator().DropColumn(&skills.SkillAgentBinding{}, column); err != nil {
			return err
		}
	}
	return nil
}

func migrateSkillVisibilityScope(db *gorm.DB) error {
	if db == nil || !db.Migrator().HasTable(&skills.Skill{}) {
		return nil
	}
	if db.Migrator().HasColumn(&skills.Skill{}, "visibility_scope") {
		if err := db.Model(&skills.Skill{}).
			Where("visibility_scope = ? OR visibility_scope IS NULL", "").
			Update("visibility_scope", "private").Error; err != nil {
			return err
		}
	}
	if db.Migrator().HasColumn(&skills.Skill{}, "visibility_owner_id") {
		if err := db.Model(&skills.Skill{}).
			Where("(visibility_owner_id = ? OR visibility_owner_id IS NULL) AND created_by <> ?", "", "").
			Update("visibility_owner_id", gorm.Expr("created_by")).Error; err != nil {
			return err
		}
	}
	if db.Migrator().HasIndex(&skills.Skill{}, "uk_skill_workspace_slug") {
		if err := db.Migrator().DropIndex(&skills.Skill{}, "uk_skill_workspace_slug"); err != nil {
			return err
		}
	}
	if !db.Migrator().HasIndex(&skills.Skill{}, "uk_skill_workspace_visibility_slug") {
		if err := db.Migrator().CreateIndex(&skills.Skill{}, "uk_skill_workspace_visibility_slug"); err != nil {
			return err
		}
	}
	return nil
}
