package migrate

import (
	sdkmigrate "github.com/tidbcloud/aisupport/packages/sdk-go/infra/database/migrate"
	"github.com/tidbcloud/aisupport/services/ticket-manager/models/collaboration"
	"github.com/tidbcloud/aisupport/services/ticket-manager/models/dispatch"
	engmodel "github.com/tidbcloud/aisupport/services/ticket-manager/models/engineer"
	taskmodel "github.com/tidbcloud/aisupport/services/ticket-manager/models/task"
	"github.com/tidbcloud/aisupport/services/ticket-manager/models/ticket"
	"github.com/tidbcloud/aisupport/services/ticket-manager/models/workspace"

	"gorm.io/gorm"
)

var (
	Migrator = sdkmigrate.NewMigrator(
		sdkmigrate.WithTable("ticket_manager_migrations"),
		sdkmigrate.WithInitDBFunc(initDB),
	)
)

func addRecord(name string, migrate func(*gorm.DB) error) bool {
	return Migrator.Add(name, migrate)
}

func initDB(db *gorm.DB) error {
	mods := []any{
		&ticket.Ticket{},
		&ticket.TimelineEvent{},
		&engmodel.Engineer{},
		&dispatch.Policy{},
		&dispatch.Rule{},
		&dispatch.Context{},
		&dispatch.Execution{},
		&dispatch.RuleExecution{},
		&dispatch.DispatchTrigger{},

		&collaboration.Resource{},

		&taskmodel.Task{},
		&taskmodel.TaskMember{},
		&taskmodel.TaskList{},

		&workspace.Workspace{},
		&workspace.WorkspaceMember{},
		&workspace.IssueBinding{},
		&workspace.AlertBinding{},
		&workspace.TenantBinding{},
		&workspace.ClusterBinding{},
		&workspace.CollaborationResourceBinding{},
		&workspace.Advice{},
		&workspace.TimelineEvidence{},
		&workspace.TimelineEntry{},
		&workspace.TimelineEntryEvidence{},
		&workspace.TimelineSummary{},
		&workspace.TimelineSyncState{},
		&workspace.TimelineEntryRevision{},
	}

	if err := db.AutoMigrate(mods...); err != nil {
		return err
	}

	return nil
}
