package sqls

import (
	"testing"

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

func TestNormalizeStatementsFilterValues_NA(t *testing.T) {
	require.Equal(t, []string{""}, normalizeStatementsFilterValues([]string{"N/A"}))
	require.Equal(t, []string{""}, normalizeStatementsFilterValues([]string{"n/a"}))
	require.Equal(t, []string{"db1", ""}, normalizeStatementsFilterValues([]string{"db1", "N/A"}))
	require.Equal(t, []string{"db1"}, normalizeStatementsFilterValues([]string{"db1", ""}))
}

func TestAppendStatementsSchemaNameQueryFilter(t *testing.T) {
	filter := appendStatementsSchemaNameQueryFilter("1=1", "N/A", "v2")
	require.Contains(t, filter, "coalesce(schema_name, '') = ''")

	filter = appendStatementsSchemaNameQueryFilter("1=1", "mydb", "v2")
	require.Contains(t, filter, "coalesce(schema_name, '') like '%mydb%'")
}

func TestAppendStatementsPlanDigestFilter(t *testing.T) {
	filter := appendStatementsPlanDigestFilter("digest = 'abc'", normalizeStatementsFilterValues([]string{"N/A"}))
	require.Contains(t, filter, "coalesce(plan_digest, '') = ''")

	filter = appendStatementsPlanDigestFilter("digest = 'abc'", normalizeStatementsFilterValues([]string{"plan1", "N/A"}))
	require.Contains(t, filter, "coalesce(plan_digest, '') = ''")
	require.Contains(t, filter, "coalesce(plan_digest, '') in ('plan1')")
}

func TestStatementsPlanDigestGroupByClause(t *testing.T) {
	require.Equal(t, "digest, coalesce(plan_digest, '')", statementsPlanDigestGroupByClause())
}

func TestAppendStatementsCoalescedInFilter_Empty(t *testing.T) {
	filter := appendStatementsCoalescedInFilter("1=1", "schema_name", normalizeStatementsFilterValues([]string{"N/A"}))
	require.Contains(t, filter, "coalesce(schema_name, '') = ''")

	filter = appendStatementsCoalescedInFilter("1=1", "schema_name", normalizeStatementsFilterValues([]string{"db1", "N/A"}))
	require.Contains(t, filter, "coalesce(schema_name, '') = ''")
	require.Contains(t, filter, "coalesce(schema_name, '') in ('db1')")
	require.Contains(t, filter, " or ")
}

func TestAppendStatementsFieldValuesFilter_NA(t *testing.T) {
	filter := appendStatementsFieldValuesFilter("1=1", "db", []string{"N/A"}, "v2")
	require.Contains(t, filter, "coalesce(schema_name, '') = ''")

	filter = appendStatementsFieldValuesFilter("1=1", "table_names", []string{"N/A"}, "")
	require.Contains(t, filter, "coalesce(table_names, '') = ''")
}

func TestAppendStatementsSampleUserFilter_NA(t *testing.T) {
	filter := appendStatementsSampleUserFilter("1=1", "N/A", "v2")
	require.Contains(t, filter, "coalesce(")
	require.Contains(t, filter, ") = ''")

	filter = appendStatementsSampleUserFilter("1=1", "N/A", "")
	require.Contains(t, filter, "coalesce(sample_user, '') = ''")
}

func TestStatementsDisplayString(t *testing.T) {
	require.Equal(t, statementsNAValue, statementsDisplayString(""))
	require.Equal(t, "db1", statementsDisplayString("db1"))
}

func TestFormatStatementsSummaryItemForAPI(t *testing.T) {
	item := StatementsSummaryItem{Dimension: "db", DB: ""}
	formatStatementsSummaryItemForAPI(&item, sqlsDataSourceV2)
	require.Equal(t, statementsNAValue, item.DB)

	others := StatementsSummaryItem{Dimension: "db", DB: "others", IsOther: true}
	formatStatementsSummaryItemForAPI(&others, sqlsDataSourceV2)
	require.Equal(t, "others", others.DB)

	v1Item := StatementsSummaryItem{Dimension: "digest", SQLDigest: ""}
	formatStatementsSummaryItemForAPI(&v1Item, "")
	require.Equal(t, "", v1Item.SQLDigest)
}

func TestFormatStatementsListRowsForAPI(t *testing.T) {
	rows := []map[string]interface{}{
		{"schema_name": "", "digest": "abc", "exec_count": 1},
	}
	formatStatementsListRowsForAPI(rows, sqlsDataSourceV2)
	require.Equal(t, statementsNAValue, rows[0]["schema_name"])
	require.Equal(t, "abc", rows[0]["digest"])
	require.Equal(t, 1, rows[0]["exec_count"])

	v1Rows := []map[string]interface{}{
		{"digest": "", "schema_name": ""},
	}
	formatStatementsListRowsForAPI(v1Rows, "")
	require.Equal(t, "", v1Rows[0]["digest"])
	require.Equal(t, "", v1Rows[0]["schema_name"])
}
