package svctaskrunhandler

import (
	"context"

	"github.com/valyala/fasttemplate"

	taskM "github.com/pingcap/test-infra/common/model/tcms/taskruns"
)

type mockHandler struct {
	taskClient SvcTaskRefService
}

func (r mockHandler) OnCreate(ctx context.Context, obj *taskM.SvcTaskRun) (*taskM.SvcTaskRun, error) {
	task, err := r.taskClient.GetByName(ctx, obj.Spec.SvcTaskName, taskM.GetSvcTaskOpts{})
	if err != nil {
		return nil, err
	}
	for _, output := range task.Implementation.Mock.Outputs {
		val, err := renderMockOutput(*obj, *task, output.Value)
		if err != nil {
			MarkError(obj, err)
			return obj, nil
		}
		obj.Status.Outputs.SetValue(output.Name, val)
	}
	obj.Status.Completed = true
	return obj, nil
}

func (r mockHandler) OnSync(ctx context.Context, obj *taskM.SvcTaskRun) (*taskM.SvcTaskRun, error) {
	return obj, nil
}

func renderMockOutput(obj taskM.SvcTaskRun, task taskM.SvcTask, expr string) (string, error) {
	params, err := ExtractParams(obj.Spec.Inputs, task.Inputs)
	if err != nil {
		return "", err
	}
	template := fasttemplate.New(expr, "{{", "}}")
	rendered := template.ExecuteStringStd(params)
	return rendered, nil
}
