package controller

import (
	"testing"

	service "dataservices/internal/service/dataapi_executor"

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

func TestSplitSqlIntoStmts(t *testing.T) {
	sql := `drop database if exists test2;
create database test2;
use test2;
create table t1 (id int key, name varchar(10));
insert into t1 values (?, ?),(?, ?);
select * from test2.t1 where id in ( ?, ? ) or name = ?;
update t1 set id=id+10 where name in ( ?, ?);
select * from test2.t1 where name in ( ?, ? );
delete from t1 where name = ?;
select * from test2.t1 where name in ( ?, ? );
`
	args := []interface{}{"0", "aa0", "1", "bb1", "0", "1", "bb1", "aa0", "bb1", "aa0", "bb1", "bb1", "aa0", "bb1"}
	stmts, err := service.SplitSqlIntoStmts(sql, args)
	require.NoError(t, err)
	expect := []struct {
		sql  string
		args []interface{}
	}{
		{
			"drop database if exists test2;",
			[]interface{}{},
		},
		{
			"create database test2;",
			[]interface{}{},
		},
		{
			"use test2;",
			[]interface{}{},
		},
		{
			"create table t1 (id int key, name varchar(10));",
			[]interface{}{},
		},
		{
			"insert into t1 values (?, ?),(?, ?);",
			[]interface{}{"0", "aa0", "1", "bb1"},
		},
		{
			"select * from test2.t1 where id in ( ?, ? ) or name = ?;",
			[]interface{}{"0", "1", "bb1"},
		},
		{
			"update t1 set id=id+10 where name in ( ?, ?);",
			[]interface{}{"aa0", "bb1"},
		},
		{
			"select * from test2.t1 where name in ( ?, ? );",
			[]interface{}{"aa0", "bb1"},
		},
		{
			"delete from t1 where name = ?;",
			[]interface{}{"bb1"},
		},
		{
			"select * from test2.t1 where name in ( ?, ? );",
			[]interface{}{"aa0", "bb1"},
		},
	}
	require.Equal(t, len(expect), len(stmts))
	for i, stmt := range stmts {
		require.Equal(t, expect[i].sql, stmt.Stmt.OriginalText())
		require.Equal(t, expect[i].args, stmt.Args)
	}
}

// func TestBuildSqlArg(t *testing.T) {
// 	cases := []struct {
// 		arg *dataapi.SqlArg
// 		v   interface{}
// 		err string
// 	}{
// 		{
// 			&dataapi.SqlArg{
// 				Tp:    "number",
// 				Value: "1",
// 			},
// 			uint64(1),
// 			"",
// 		},
// 		{
// 			&dataapi.SqlArg{
// 				Tp:    "number",
// 				Value: "-1",
// 			},
// 			int64(-1),
// 			"",
// 		},
// 		{
// 			&dataapi.SqlArg{
// 				Tp:    "number",
// 				Value: "x",
// 			},
// 			nil,
// 			"BuildSqlArgs failed, tp: number, value: x, error: strconv.ParseUint: parsing \"x\": invalid syntax",
// 		},
// 		{
// 			&dataapi.SqlArg{
// 				Tp:    "string",
// 				Value: "-1",
// 			},
// 			"-1",
// 			"",
// 		},
// 	}
// 	for _, ca := range cases {
// 		v, err := service.BuildSqlArg(ca.arg)
// 		if ca.err == "" {
// 			require.NoError(t, err)
// 			require.Equal(t, v, ca.v)
// 		} else {
// 			require.Error(t, err)
// 			require.Equal(t, ca.err, err.Error())
// 		}
// 	}
// }
