package taskboard

import (
	"context"
	"strings"
	"testing"

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

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

	execer := &scriptedTaskboardQueryExecer{}
	err := insertDefaultTaskFieldOptions(context.Background(), execer, []taskFieldOptionDefaultInsert{
		{
			ID:          "tfo_priority_p0",
			WorkspaceID: "wsp_taxonomy",
			FieldKind:   taskFieldKindPriority,
			Key:         "p0",
			Label:       "Critical",
			Position:    4,
		},
		{
			ID:          "tfo_kind_feature",
			WorkspaceID: "wsp_taxonomy",
			FieldKind:   taskFieldKindKind,
			Key:         "feature",
			Label:       "Feature",
			Position:    12,
		},
	})

	require.NoError(t, err)
	require.Len(t, execer.queries, 1)
	query := strings.Join(strings.Fields(execer.queries[0]), " ")
	require.Contains(t, query, "INSERT INTO task_field_options")
	require.Contains(t, query, "ON DUPLICATE KEY UPDATE id = id")
	require.Len(t, execer.args[0], 12)
	require.Equal(t, []any{
		"tfo_priority_p0", "wsp_taxonomy", taskFieldKindPriority, "p0", "Critical", int64(4),
		"tfo_kind_feature", "wsp_taxonomy", taskFieldKindKind, "feature", "Feature", int64(12),
	}, execer.args[0])
}

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

	execer := &scriptedTaskboardQueryExecer{
		queryResults: []scriptedTaskboardQueryResult{
			{
				rows: [][]any{
					{"tfo_priority_p0", taskFieldKindPriority, "p0"},
					{"tfo_kind_feature", taskFieldKindKind, "feature"},
				},
			},
		},
	}
	optionIDs, err := loadTaskFieldOptionIDsForDefaultAliases(context.Background(), execer, "wsp_taxonomy", []taskFieldOptionDefaultAlias{
		{FieldKind: taskFieldKindPriority, OptionKey: "p0", AliasKey: "critical"},
		{FieldKind: taskFieldKindKind, OptionKey: "feature", AliasKey: "feat"},
	})

	require.NoError(t, err)
	require.Equal(t, map[string]string{
		taskFieldKindPriority + ":p0":  "tfo_priority_p0",
		taskFieldKindKind + ":feature": "tfo_kind_feature",
	}, optionIDs)
	require.Len(t, execer.queries, 1)
	query := strings.Join(strings.Fields(execer.queries[0]), " ")
	require.Contains(t, query, "FROM task_field_options")
	require.Contains(t, query, "field_kind = $2 AND option_key = $3")
	require.Contains(t, query, "field_kind = $4 AND option_key = $5")
	require.Equal(t, []any{"wsp_taxonomy", taskFieldKindPriority, "p0", taskFieldKindKind, "feature"}, execer.args[0])
}

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

	execer := &scriptedTaskboardQueryExecer{}
	err := insertDefaultTaskFieldOptionAliases(context.Background(), execer, []taskFieldOptionAliasInsert{
		{
			ID:          "tfa_default_1",
			OptionID:    "tfo_priority_p0",
			WorkspaceID: "wsp_taxonomy",
			FieldKind:   taskFieldKindPriority,
			AliasKey:    "critical",
		},
		{
			ID:          "tfa_default_2",
			OptionID:    "tfo_kind_feature",
			WorkspaceID: "wsp_taxonomy",
			FieldKind:   taskFieldKindKind,
			AliasKey:    "feat",
		},
	})

	require.NoError(t, err)
	require.Len(t, execer.queries, 1)
	query := strings.Join(strings.Fields(execer.queries[0]), " ")
	require.Contains(t, query, "INSERT INTO task_field_option_aliases")
	require.Contains(t, query, "ON DUPLICATE KEY UPDATE id = id")
	require.Len(t, execer.args[0], 10)
	require.Equal(t, []any{
		"tfa_default_1", "tfo_priority_p0", "wsp_taxonomy", taskFieldKindPriority, "critical",
		"tfa_default_2", "tfo_kind_feature", "wsp_taxonomy", taskFieldKindKind, "feat",
	}, execer.args[0])
}
