package grpc

import (
	"testing"

	"github.com/stretchr/testify/require"
	"github.com/tidbcloud/dataflow-service/idl/pbgen/proto/common"
)

func TestGenerateLoadDataSql(t *testing.T) {
	tests := []struct {
		Name            string
		Separator       string
		Delimiter       string
		Terminator      string
		BackslashEscape bool
		IgnoreOneLine   bool
		SourceURL       string
		TargetDB        string
		TargetTable     string
		Expected        string
	}{
		{
			Name:            "Basic Example",
			Separator:       ",",
			Delimiter:       "\"",
			BackslashEscape: true,
			IgnoreOneLine:   true,
			SourceURL:       "s3://some_bucket/path/to/source.csv",
			TargetDB:        "test_db",
			TargetTable:     "test_table",
			Expected:        "LOAD DATA INFILE 's3://some_bucket/path/to/source.csv' INTO TABLE `test_db`.`test_table` FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\\\\' IGNORE 1 LINES;",
		},
		{
			Name:            "TSV Format",
			Separator:       "\t",
			Delimiter:       "\"",
			BackslashEscape: true,
			IgnoreOneLine:   true,
			SourceURL:       "path/to/source.tsv",
			TargetDB:        "test_db",
			TargetTable:     "test_table",
			Expected:        "LOAD DATA INFILE 'path/to/source.tsv' INTO TABLE `test_db`.`test_table` FIELDS TERMINATED BY '\t' ENCLOSED BY '\"' ESCAPED BY '\\\\' IGNORE 1 LINES;",
		},
		{
			Name:            "No Header",
			Separator:       ",",
			Delimiter:       "\"",
			BackslashEscape: true,
			IgnoreOneLine:   false,
			SourceURL:       "s3://some_bucket/path/to/source.csv",
			TargetDB:        "test_db",
			TargetTable:     "test_table",
			Expected:        "LOAD DATA INFILE 's3://some_bucket/path/to/source.csv' INTO TABLE `test_db`.`test_table` FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\\\\';",
		},
		{
			Name:            "No Delimiter",
			Separator:       ",",
			Delimiter:       "",
			BackslashEscape: true,
			IgnoreOneLine:   true,
			SourceURL:       "s3://some_bucket/path/to/source.csv",
			TargetDB:        "test_db",
			TargetTable:     "test_table",
			Expected:        "LOAD DATA INFILE 's3://some_bucket/path/to/source.csv' INTO TABLE `test_db`.`test_table` FIELDS TERMINATED BY ',' ESCAPED BY '\\\\' IGNORE 1 LINES;",
		},
		{
			Name:            "No Backslash Escape",
			Separator:       ",",
			Delimiter:       "\"",
			BackslashEscape: false,
			IgnoreOneLine:   true,
			SourceURL:       "s3://some_bucket/path/to/source.csv",
			TargetDB:        "test_db",
			TargetTable:     "test_table",
			Expected:        "LOAD DATA INFILE 's3://some_bucket/path/to/source.csv' INTO TABLE `test_db`.`test_table` FIELDS TERMINATED BY ',' ENCLOSED BY '\"' IGNORE 1 LINES;",
		},
		{
			Name:            "Terminator 1",
			Separator:       ",",
			Delimiter:       "\"",
			Terminator:      "\\n",
			BackslashEscape: true,
			IgnoreOneLine:   true,
			SourceURL:       "s3://some_bucket/path/to/source.csv",
			TargetDB:        "test_db",
			TargetTable:     "test_table",
			Expected:        "LOAD DATA INFILE 's3://some_bucket/path/to/source.csv' INTO TABLE `test_db`.`test_table` FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\\\\' LINES TERMINATED BY '\\n' IGNORE 1 LINES;",
		},
		{
			Name:            "Terminator 2",
			Separator:       ",",
			Delimiter:       "\"",
			Terminator:      "\\r\\n",
			BackslashEscape: true,
			IgnoreOneLine:   true,
			SourceURL:       "s3://some_bucket/path/to/source.csv",
			TargetDB:        "test_db",
			TargetTable:     "test_table",
			Expected:        "LOAD DATA INFILE 's3://some_bucket/path/to/source.csv' INTO TABLE `test_db`.`test_table` FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\\\\' LINES TERMINATED BY '\\r\\n' IGNORE 1 LINES;",
		},
	}

	for _, test := range tests {
		t.Run(test.Name, func(t *testing.T) {
			result := generateLoadDataSql(
				test.SourceURL, test.TargetDB, test.TargetTable,
				test.Terminator, test.Separator, test.Delimiter,
				test.BackslashEscape, test.IgnoreOneLine,
			)
			require.Equal(t, test.Expected, result)
		})
	}
}

func TestGenerateDropTableSql(t *testing.T) {
	tests := []struct {
		Name         string
		Tables       []*common.Table
		Expected     string
		ExpectedArgs []interface{}
	}{
		{
			Name:     "Basic Example",
			Tables:   []*common.Table{{Schema: "test_db", Table: "test_table"}},
			Expected: "DROP TABLE `test_db`.`test_table`;",
		},
		{
			Name: "Multi tables",
			Tables: []*common.Table{
				{Schema: "test_db", Table: "test_table"},
				{Schema: "test_db", Table: "test_table2"},
			},
			Expected: "DROP TABLE `test_db`.`test_table`,`test_db`.`test_table2`;",
		},
	}

	for _, test := range tests {
		t.Run(test.Name, func(t *testing.T) {
			result := generateDropTableSql(test.Tables)
			require.Equal(t, test.Expected, result)
		})
	}
}
