package action

import tea "github.com/charmbracelet/bubbletea"

// DeleteChar implements Action (x)
type DeleteChar struct {
	Count int
}

func (a DeleteChar) Execute(m Model) tea.Cmd {
	pos := m.CursorX()
	line := m.Line(m.CursorY())
	for i := 0; i < a.Count && pos < len(line); i++ {
		line = line[:pos] + line[pos+1:]
		m.SetLine(m.CursorY(), line)
	}

	return nil
}

func (a DeleteChar) WithCount(n int) Action {
	return DeleteChar{Count: n}
}

type DeleteToEndOfLine struct {
	Count int
}

func (a DeleteToEndOfLine) Execute(m Model) tea.Cmd {
	// Delete to end of line
	pos := m.CursorX()
	line := m.Line(m.CursorY())

	m.SetLine(m.CursorY(), line[:pos])
	m.SetCursorX(pos - 1)

	// If count is greater, than we will delete the next N - 1 lines below
	initY := m.CursorY()
	if a.Count > 1 {
		// Copied from `internal/operator/delete.go`
		opCount := min(a.Count-1, m.LineCount()-m.CursorY())

		// Down one
		m.SetCursorY(initY + 1)

		for range opCount {
			y := m.CursorY() // Changed from the copied code

			// Stop if were on the starting line
			if y == initY {
				break
			}
			m.DeleteLine(y)

			if m.LineCount() == 0 {
				m.InsertLine(0, "")
			}

			if y >= m.LineCount() {
				y = m.LineCount() - 1
			}

			m.SetCursorY(y)
			m.ClampCursorX()
		}
	}

	m.SetCursorY(initY)
	m.ClampCursorX()

	return nil
}

func (a DeleteToEndOfLine) WithCount(n int) Action {
	return DeleteToEndOfLine{Count: n}
}
