package workflow

import (
	"context"

	"github.com/tidbcloud/chaos-svc/pkg/domain/facade"
	"github.com/tidbcloud/chaos-svc/pkg/domain/repo"
	"github.com/tidbcloud/pkgv2/bizerr"
)

type DeleteWorkflowSvc interface {
	Execute(ctx context.Context, params *DeleteWorkflowParam) bizerr.BizError
}

type DeleteWorkflowParam struct {
	TiDBCluster facade.TiDBCluster
	WorkflowID  uint64
}

type deleteWorkflowImp struct {
	workflowRepo repo.WorkflowRepo
	infraFacade  facade.Infra
	timeFacade   facade.Time
}

func NewDeleteWorkflowSvc(
	workflowRepo repo.WorkflowRepo,
	infraFacade facade.Infra,
	timeFacade facade.Time,
) DeleteWorkflowSvc {
	return &deleteWorkflowImp{
		workflowRepo: workflowRepo,
		infraFacade:  infraFacade,
		timeFacade:   timeFacade,
	}
}

func (imp *deleteWorkflowImp) Execute(ctx context.Context, params *DeleteWorkflowParam) bizerr.BizError {
	workflowEntity, err := imp.workflowRepo.Load(ctx, params.WorkflowID)
	if err != nil {
		return err
	}
	if workflowEntity.ClusterID != params.TiDBCluster.ClusterID {
		return bizerr.New(bizerr.ErrCodeRecordNotFound, "workflow not found in this cluster")
	}

	workflowEntity.SetStatusDeleted(imp.timeFacade.Now())
	err = imp.workflowRepo.Save(ctx, workflowEntity)
	if err != nil {
		return err
	}
	err = imp.infraFacade.DeleteWorkflowIgnoreNotFound(ctx, params.TiDBCluster.ProjectID, params.WorkflowID)
	if err != nil {
		return err
	}
	return nil
}
