package migrate

import (
	"github.com/tidbcloud/devops/models/github"
	"github.com/tidbcloud/devops/models/release"
	"github.com/tidbcloud/devops/pkg/infra/utils/pointer"

	"gorm.io/gorm"
)

// migration for github service.
var _ = AddMigrateRecord(
	"202309041100",
	func(db *gorm.DB) error {
		err := db.AutoMigrate(&github.GithubPullRequest{}, &github.GithubRepository{}, &release.ReleaseTicket{}, &release.ReleaseTicketToGithubPR{})
		if err != nil {
			return err
		}

		// fill release name which is added for tickets.
		tickets := make([]*release.ReleaseTicket, 0)
		err = db.Model(&release.ReleaseTicket{}).Find(&tickets).Error
		if err != nil {
			return err
		}

		for _, ticket := range tickets {
			if ticket.ReleaseName == nil && ticket.ReleaseID != 0 {
				rel := &release.Release{}
				err = db.Model(&release.Release{}).Where("id = ?", ticket.ReleaseID).First(rel).Error
				if err != nil {
					return err
				}

				ticket.ReleaseName = pointer.Pointer(rel.Name)
				err = db.Save(ticket).Error
				if err != nil {
					return err
				}
			}
		}

		// we manage all tickets, so no need to delete them.
		err = db.Exec("UPDATE release_tickets SET deleted_at = NULL WHERE deleted_at is not NULL;").Error
		if err != nil {
			return err
		}

		return nil
	},
)
