// Package dm add by blacknc <blacknc@163.com> at 2024/10/31 00:19:09
package dm

import (
	"github.com/tidbcloud/dataflow-service/internal/db"
	"github.com/tidbcloud/dataflow-service/internal/db/entity"
	"github.com/tidbcloud/dataflow-service/pkg/log"
	"go.uber.org/zap"
	"gorm.io/gorm"
)

type StateFinishing struct{}

func (s *StateFinishing) String() string {
	return "StateFinishing"
}

func (s *StateFinishing) Exec(c *TaskContext) (next TaskState, err error) {

	dfJob := c.job.DFJob
	ctx := c.ctx
	logger := log.GetLogger(ctx)

	err = db.Transaction(func(tx *gorm.DB) error {
		return updateDFJobPhaseWithExLock(tx, dfJob, entity.DFJobPhaseCreated, entity.DFJobPhaseFinishing)
	})
	if err != nil {
		logger.Error("failed to update dm job to finishing phase", zap.Error(err))
	} else {
		logger.Info("successfully update dm job to finishing phase")
		next = new(StateFinished)
		dfJob.Phase = entity.DFJobPhaseFinishing
		PublishEvent(ctx, &PublishEventReq{Job: c.job})
	}
	return
}
