package controller_test

import (
	"testing"

	controller "dataservices/internal/controller/dataapi_gateway"
	"dataservices/internal/entity"

	"github.com/stretchr/testify/require"
)

func TestBuildEndpoint(t *testing.T) {
	sql, args, err := controller.BuildEndpoint(
		"select * from t where name=${name} and id in (${ids})",
		[]*entity.EndpointArgs{
			{
				Name:     "name",
				Type:     entity.EndpointArgTypeString,
				Required: 1,
			},
			{
				Name:     "ids",
				Type:     entity.EndpointArgTypeArray,
				ItemType: entity.EndpointArgTypeString,
				Required: 1,
			},
		},
		map[string]any{
			"name": "alice",
			"ids":  "1,2,3",
		},
	)

	require.NoError(t, err)
	require.Equal(t, "select * from t where name=? and id in (?,?,?)", sql)

	values := make([]any, 0, len(args))
	for i := range args {
		value, valueErr := args[i].Value()
		require.NoError(t, valueErr)
		values = append(values, value)
	}
	require.Equal(t, []any{"alice", "1", "2", "3"}, values)
}

func TestBuildEndpointMissingRequiredArg(t *testing.T) {
	sql, args, err := controller.BuildEndpoint(
		"select * from t where name=${name}",
		[]*entity.EndpointArgs{
			{
				Name:     "name",
				Type:     entity.EndpointArgTypeString,
				Required: 1,
			},
		},
		map[string]any{},
	)

	require.Empty(t, sql)
	require.Nil(t, args)
	require.EqualError(t, err, "The `name` parameter is required")
}
