package gateway

import (
	"testing"

	"github.com/stretchr/testify/require"
	"github.com/tidbcloud/pov-service/internal/common/constant"
	"github.com/tidbcloud/pov-service/internal/model"
)

type formProviderStub struct {
	trafficForms []model.WorkloadField
	prepareForms []model.WorkloadField
	err          error
}

func (s formProviderStub) GetTrafficForm(string) ([]model.WorkloadField, error) {
	return s.trafficForms, s.err
}

func (s formProviderStub) GetPrepareForm(string) ([]model.WorkloadField, error) {
	return s.prepareForms, s.err
}

func TestParamHelperTrafficParams(t *testing.T) {
	t.Parallel()

	stub := formProviderStub{
		trafficForms: []model.WorkloadField{
			{Key: "duration", Value: "60", Type: "int"},
			{Key: "enable_feature", Value: "false", Type: "checkbox"},
		},
	}
	helper := newParamHelper(stub, false)

	params := model.WorkloadParams{
		{Name: "duration", Value: "120"},
		{Name: "enable_feature", Value: "true"},
	}

	got, err := helper.trafficParams("tpcc", params)
	require.NoError(t, err)
	require.Equal(t, int64(120), got["duration"])
	require.Equal(t, true, got["enable_feature"])
}

func TestParamHelperPrepareParams(t *testing.T) {
	t.Parallel()

	stub := formProviderStub{
		prepareForms: []model.WorkloadField{
			{Key: "method", Type: "string"},
			{Key: "warehouses", Type: "int"},
		},
	}
	helper := newParamHelper(stub, false)

	params := model.WorkloadParams{
		{Name: "prepare_method", Value: "sql_generate"},
		{Name: "prepare_warehouses", Value: "100"},
		{Name: string(constant.BrStorageURL), Value: "s3://dataset"},
	}

	got, err := helper.prepareParams("tpcc", params)
	require.NoError(t, err)
	require.Equal(t, "sql_generate", got["method"])
	require.Equal(t, int64(100), got["warehouses"])
	require.Equal(t, "s3://dataset", got["storage_url"])
}

func TestParamHelperClusterWorkflowIDAndRunner(t *testing.T) {
	t.Parallel()

	helper := newParamHelper(formProviderStub{}, false)

	params := model.WorkloadParams{
		{Name: string(constant.ClusterType), Value: string(model.ClusterTypeTiDBCloudEssential)},
	}

	id, err := helper.clusterWorkflowID(params)
	require.NoError(t, err)
	require.Equal(t, tcmsCreateEssentialClusterWorkflowID, id)

	runner, err := helper.tcmsRunnerID(params)
	require.NoError(t, err)
	require.NotZero(t, runner)

	prodHelper := newParamHelper(formProviderStub{}, true)
	_, err = prodHelper.clusterWorkflowID(params)
	require.Error(t, err)
}
