package cheatsheet

import (
	"testing"

	"github.com/jesseduffield/lazygit/pkg/gui/types"
	"github.com/jesseduffield/lazygit/pkg/i18n"
	"github.com/stretchr/testify/assert"
)

func TestGetBindingSections(t *testing.T) {
	tr := i18n.EnglishTranslationSet()

	tests := []struct {
		testName string
		bindings []*types.Binding
		expected []*bindingSection
	}{
		{
			testName: "no bindings",
			bindings: []*types.Binding{},
			expected: []*bindingSection{},
		},
		{
			testName: "one binding",
			bindings: []*types.Binding{
				{
					ViewName:    "files",
					Description: "stage file",
					Key:         'a',
				},
			},
			expected: []*bindingSection{
				{
					title: "Files",
					bindings: []*types.Binding{
						{
							ViewName:    "files",
							Description: "stage file",
							Key:         'a',
						},
					},
				},
			},
		},
		{
			testName: "global binding",
			bindings: []*types.Binding{
				{
					ViewName:    "",
					Description: "quit",
					Key:         'a',
				},
			},
			expected: []*bindingSection{
				{
					title: "Global keybindings",
					bindings: []*types.Binding{
						{
							ViewName:    "",
							Description: "quit",
							Key:         'a',
						},
					},
				},
			},
		},
		{
			testName: "grouped bindings",
			bindings: []*types.Binding{
				{
					ViewName:    "files",
					Description: "stage file",
					Key:         'a',
				},
				{
					ViewName:    "files",
					Description: "unstage file",
					Key:         'a',
				},
				{
					ViewName:    "submodules",
					Description: "drop submodule",
					Key:         'a',
				},
			},
			expected: []*bindingSection{
				{
					title: "Files",
					bindings: []*types.Binding{
						{
							ViewName:    "files",
							Description: "stage file",
							Key:         'a',
						},
						{
							ViewName:    "files",
							Description: "unstage file",
							Key:         'a',
						},
					},
				},
				{
					title: "Submodules",
					bindings: []*types.Binding{
						{
							ViewName:    "submodules",
							Description: "drop submodule",
							Key:         'a',
						},
					},
				},
			},
		},
		{
			testName: "with navigation bindings",
			bindings: []*types.Binding{
				{
					ViewName:    "files",
					Description: "stage file",
					Key:         'a',
				},
				{
					ViewName:    "files",
					Description: "unstage file",
					Key:         'a',
				},
				{
					ViewName:    "files",
					Description: "scroll",
					Key:         'a',
					Tag:         "navigation",
				},
				{
					ViewName:    "commits",
					Description: "revert commit",
					Key:         'a',
				},
			},
			expected: []*bindingSection{
				{
					title: "List panel navigation",
					bindings: []*types.Binding{
						{
							ViewName:    "files",
							Description: "scroll",
							Key:         'a',
							Tag:         "navigation",
						},
					},
				},
				{
					title: "Commits",
					bindings: []*types.Binding{
						{
							ViewName:    "commits",
							Description: "revert commit",
							Key:         'a',
						},
					},
				},
				{
					title: "Files",
					bindings: []*types.Binding{
						{
							ViewName:    "files",
							Description: "stage file",
							Key:         'a',
						},
						{
							ViewName:    "files",
							Description: "unstage file",
							Key:         'a',
						},
					},
				},
			},
		},
		{
			testName: "with duplicate navigation bindings",
			bindings: []*types.Binding{
				{
					ViewName:    "files",
					Description: "stage file",
					Key:         'a',
				},
				{
					ViewName:    "files",
					Description: "unstage file",
					Key:         'a',
				},
				{
					ViewName:    "files",
					Description: "scroll",
					Key:         'a',
					Tag:         "navigation",
				},
				{
					ViewName:    "commits",
					Description: "revert commit",
					Key:         'a',
				},
				{
					ViewName:    "commits",
					Description: "scroll",
					Key:         'a',
					Tag:         "navigation",
				},
				{
					ViewName:    "commits",
					Description: "page up",
					Key:         'a',
					Tag:         "navigation",
				},
			},
			expected: []*bindingSection{
				{
					title: "List panel navigation",
					bindings: []*types.Binding{
						{
							ViewName:    "files",
							Description: "scroll",
							Key:         'a',
							Tag:         "navigation",
						},
						{
							ViewName:    "commits",
							Description: "page up",
							Key:         'a',
							Tag:         "navigation",
						},
					},
				},
				{
					title: "Commits",
					bindings: []*types.Binding{
						{
							ViewName:    "commits",
							Description: "revert commit",
							Key:         'a',
						},
					},
				},
				{
					title: "Files",
					bindings: []*types.Binding{
						{
							ViewName:    "files",
							Description: "stage file",
							Key:         'a',
						},
						{
							ViewName:    "files",
							Description: "unstage file",
							Key:         'a',
						},
					},
				},
			},
		},
	}

	for _, test := range tests {
		t.Run(test.testName, func(t *testing.T) {
			actual := getBindingSections(test.bindings, &tr)
			assert.EqualValues(t, test.expected, actual)
		})
	}
}