package basic

import (
	"context"
	"fmt"

	"github.com/mitchellh/mapstructure"

	"github.com/tidbcloud/eks-provider/controllers/workflow/action"
	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
	"github.com/tidbcloud/infra-provider/pkg/consts"
)

// echoAction echos step inputs to its outputs
type echoAction struct{}

var (
	_ action.Action = &echoAction{}
)

func init() {
	action.RegisterWorkflowAction(&echoAction{})
}

func (d *echoAction) Name() cloudv1.WorkflowActionName {
	return consts.WorkflowActionEcho
}

func (d *echoAction) PreCheck(ctx context.Context, wf *cloudv1.Workflow, step cloudv1.WorkflowStep) error {
	inputs := map[string]interface{}{}
	if err := mapstructure.Decode(step.Inputs.Object, &inputs); err != nil {
		return fmt.Errorf("decode inputs: %w", err)
	}
	return nil
}

func (d *echoAction) Handle(ctx context.Context, wf *cloudv1.Workflow, step cloudv1.WorkflowStep) error {
	inputs := map[string]interface{}{}
	outputs := map[string]string{}
	if err := mapstructure.Decode(step.Inputs.Object, &inputs); err != nil {
		return fmt.Errorf("decode inputs: %w", err)
	}
	for k, v := range inputs {
		outputs[k] = fmt.Sprintf("%v", v)
	}
	return wf.UpdateStepOutput(ctx, step.Name, outputs)
}

func (d *echoAction) PostHandle(ctx context.Context, wf *cloudv1.Workflow, step cloudv1.WorkflowStep) error {
	inputs := map[string]interface{}{}
	outputs := map[string]string{}
	if err := mapstructure.Decode(step.Inputs.Object, &inputs); err != nil {
		return fmt.Errorf("decode inputs: %w", err)
	}
	for k, v := range inputs {
		outputs["PostHandle-"+k] = fmt.Sprintf("%v", v)
	}
	return wf.UpdateStepOutput(ctx, step.Name, outputs)
}
