package experiment

import (
	"context"

	"github.com/tidbcloud/chaos-svc/idl/pbgen/proto/chaos"
	"github.com/tidbcloud/chaos-svc/pkg/domain/repo"
	"github.com/tidbcloud/chaos-svc/pkg/domain/service/workflow"
	"github.com/tidbcloud/pkgv2/bizerr"
)

type GetExperimentSvc struct {
	workflowRepo  repo.WorkflowRepo
	specConverter workflow.SpecConverter
}

func NewGetExperimentSvc(
	workflowRepo repo.WorkflowRepo,
	specConverter workflow.SpecConverter,
) *GetExperimentSvc {
	return &GetExperimentSvc{
		workflowRepo:  workflowRepo,
		specConverter: specConverter,
	}
}

func (svc *GetExperimentSvc) Execute(ctx context.Context, req *chaos.GetExperimentRequest) (*chaos.Experiment, bizerr.BizError) {
	experiment, err := svc.workflowRepo.Load(ctx, req.ExperimentId)
	if err != nil {
		return nil, err
	}
	if experiment.ClusterID != req.ClusterId || experiment.ProjectID != req.ProjectId {
		return nil, bizerr.New(bizerr.ErrCodeRecordNotFound, "experiment not found in this cluster")
	}

	return WorkflowEntity2Pb(svc.specConverter, experiment)
}
