package patch_building

import (
	"github.com/jesseduffield/lazygit/pkg/config"
	. "github.com/jesseduffield/lazygit/pkg/integration/components"
)

var MoveToIndexPartial = NewIntegrationTest(NewIntegrationTestArgs{
	Description:  "Move a patch from a commit to the index. This is different from the MoveToIndex test in that we're only selecting a partial patch from a file",
	ExtraCmdArgs: "",
	Skip:         false,
	SetupConfig:  func(config *config.AppConfig) {},
	SetupRepo: func(shell *Shell) {
		shell.CreateFileAndAdd("file1", "first line\nsecond line\nthird line\n")
		shell.Commit("first commit")

		shell.UpdateFileAndAdd("file1", "first line2\nsecond line\nthird line2\n")
		shell.Commit("second commit")

		shell.CreateFileAndAdd("file2", "file1 content")
		shell.Commit("third commit")
	},
	Run: func(t *TestDriver, keys config.KeybindingConfig) {
		t.Views().Commits().
			Focus().
			Lines(
				Contains("third commit").IsSelected(),
				Contains("second commit"),
				Contains("first commit"),
			).
			NavigateToLine(Contains("second commit")).
			PressEnter()

		t.Views().CommitFiles().
			IsFocused().
			Lines(
				Contains("file1").IsSelected(),
			).
			PressEnter()

		t.Views().PatchBuilding().
			IsFocused().
			ContainsLines(
				Contains(`-first line`).IsSelected(),
				Contains(`+first line2`),
				Contains(` second line`),
				Contains(`-third line`),
				Contains(`+third line2`),
			).
			PressPrimaryAction().
			SelectNextItem().
			PressPrimaryAction().
			Tap(func() {
				t.Views().Information().Content(Contains("building patch"))

				t.Views().PatchBuildingSecondary().
					ContainsLines(
						Contains(`-first line`),
						Contains(`+first line2`),
						Contains(` second line`),
						Contains(` third line`),
					)

				t.Common().SelectPatchOption(Contains("move patch out into index"))

				t.Views().Files().
					Lines(
						Contains("M").Contains("file1"),
					)
			})

		// Focus is automatically returned to the commit files panel. Arguably it shouldn't be.
		t.Views().CommitFiles().
			IsFocused().
			Lines(
				Contains("file1"),
			)

		t.Views().Main().
			ContainsLines(
				Contains(` first line`),
				Contains(` second line`),
				Contains(`-third line`),
				Contains(`+third line2`),
			)

		t.Views().Files().
			Focus()

		t.Views().Main().
			ContainsLines(
				Contains(`-first line`),
				Contains(`+first line2`),
				Contains(` second line`),
				Contains(` third line2`),
			)
	},
})