package basic

import (
	"context"
	"fmt"
	"testing"

	"github.com/stretchr/testify/assert"

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

func Test_precheck(t *testing.T) {
	tests := []struct {
		name     string
		workflow cloudv1.Workflow
		action   action.Action
		expected error
	}{
		{
			name: "sleep action",
			workflow: cloudv1.Workflow{
				Spec: cloudv1.WorkflowSpec{
					Steps: []cloudv1.WorkflowStep{
						{
							Name:   "sleep action",
							Inputs: cloudv1.InputsWrapper{Object: map[string]interface{}{"duration": "30s"}},
						},
					},
				},
			},
			action:   &sleepAction{},
			expected: nil,
		},
		{
			name: "sleep action with invalid duration should fail to parse",
			workflow: cloudv1.Workflow{
				Spec: cloudv1.WorkflowSpec{
					Steps: []cloudv1.WorkflowStep{
						{
							Name:   "sleep action",
							Inputs: cloudv1.InputsWrapper{Object: map[string]interface{}{"duration": "30"}},
						},
					},
				},
			},
			action:   &sleepAction{},
			expected: fmt.Errorf("parse duration"),
		},
		{
			name: "echo action should accept whatever map[string]interface",
			workflow: cloudv1.Workflow{
				Spec: cloudv1.WorkflowSpec{
					Steps: []cloudv1.WorkflowStep{
						{
							Name: "echo",
							Inputs: cloudv1.InputsWrapper{Object: map[string]interface{}{
								"labels":  map[string]string{"name": "pingcap", "location": "beijing"},
								"enabled": true,
							}},
						},
					},
				},
			},
			action:   &echoAction{},
			expected: nil,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			ctx := context.TODO()
			err := tt.action.PreCheck(ctx, &tt.workflow, tt.workflow.Spec.Steps[0])
			if tt.expected == nil {
				assert.Nil(t, err, "precheck: "+tt.name)
			} else {
				assert.ErrorContains(t, err, tt.expected.Error(), "precheck: "+tt.name)
			}
		})
	}
}
