package main

import (
	"github.com/elk-language/go-prompt"
	pstrings "github.com/elk-language/go-prompt/strings"
	"os"
	"strings"
)

type Action func(args []string)

type CommandArg struct {
	Name   string
	Action Action
	Help   string
}

func command(name string, action Action) CommandArg {
	return CommandArg{
		Name:   "/" + name,
		Action: action,
	}
}

func (arg CommandArg) withHelp(help string) CommandArg {
	arg.Help = help
	return arg
}

func Completer(d prompt.Document) ([]prompt.Suggest, pstrings.RuneNumber, pstrings.RuneNumber) {
	endIndex := d.CurrentRuneIndex()

	w := d.TextBeforeCursor()
	startIndex := endIndex - pstrings.RuneCount([]byte(w))

	if !strings.HasPrefix(w, "/") {
		return nil, startIndex, endIndex
	}

	var s []prompt.Suggest
	for _, cmd := range Commands {
		if strings.HasPrefix(cmd.Name, w) {
			s = append(s, prompt.Suggest{
				Text:        cmd.Name,
				Description: cmd.Help,
			})
		}
	}
	return prompt.FilterHasPrefix(s, w, true), startIndex, endIndex
}

var Commands = []CommandArg{
	command("quit", cmdQuit).withHelp("Quit the program"),
}

func cmdQuit(args []string) {
	os.Exit(0)
}