package keymap

import (
	
	
)

// CursorStyle is the style of the cursor
// in a given input mode/submode.
type CursorStyle string

// String - Implements fmt.Stringer.
func ( CursorStyle) () string {
	,  := cursors[]
	if ! {
		return string(cursorUserDefault)
	}

	return 
}

const (
	cursorBlock             CursorStyle = "block"
	cursorUnderline         CursorStyle = "underline"
	cursorBeam              CursorStyle = "beam"
	cursorBlinkingBlock     CursorStyle = "blinking-block"
	cursorBlinkingUnderline CursorStyle = "blinking-underline"
	cursorBlinkingBeam      CursorStyle = "blinking-beam"
	cursorUserDefault       CursorStyle = "default"
)

var cursors = map[CursorStyle]string{
	cursorBlock:             "\x1b[2 q",
	cursorUnderline:         "\x1b[4 q",
	cursorBeam:              "\x1b[6 q",
	cursorBlinkingBlock:     "\x1b[1 q",
	cursorBlinkingUnderline: "\x1b[3 q",
	cursorBlinkingBeam:      "\x1b[5 q",
	cursorUserDefault:       "\x1b[0 q",
}

var defaultCursors = map[Mode]CursorStyle{
	ViInsert:  cursorBlinkingBeam,
	Vi:        cursorBlinkingBeam,
	ViCommand: cursorBlinkingBlock,
	ViOpp:     cursorBlinkingUnderline,
	Visual:    cursorBlock,
	Emacs:     cursorBlinkingBlock,
}

// PrintCursor prints the cursor for the given keymap mode,
// either default value or the one specified in inputrc file.
func ( *Engine) ( Mode) {
	var  CursorStyle

	// Check for a configured cursor in .inputrc file.
	 := "cursor-" + string()
	 := strings.TrimSpace(.config.GetString())

	if ,  := cursors[CursorStyle()];  {
		fmt.Print(cursors[CursorStyle()])
		return
	}

	if ,  := defaultCursors[];  {
		fmt.Print(cursors[])
		return
	}

	fmt.Print(cursors[])
}