/*
 * Copyright 2018-present Open Networking Foundation

 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at

 * http://www.apache.org/licenses/LICENSE-2.0

 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package devicemenu

import (
	"fmt"
	"os"
	"strings"

	"github.com/opencord/voltha-go/cli/util"
)

func doHelp(enterPressed bool) {
	input := ""
	var b = make([]byte, 1)
	inputPrompt := *InputPrompt + "help "
	for {
		os.Stdin.Read(b)
		char := string(b)
		if char == "\t" || char == "\n" || char == "?" {
			if enterPressed {
				baseHelp()
				return
			}

			fmt.Println("")
			ret, prompt := util.Test(input, *Commands)
			if len(ret) == 1 {
				input = ret[0]
				if input == "quit" {
					util.Exit(true)
				} else if input == "exit" {
					return
				}

				MainLoop(Conn, input)
				return
			} else if len(ret) == 0 {
				input = ""
				fmt.Print("Invalid Input \n" + inputPrompt)
			} else {

				fmt.Println(ret)
				input = prompt
				fmt.Print(prompt + inputPrompt)
			}
		} else if b[0] == 127 || char == "\b" {

			sz := len(input)
			if sz > 0 {
				fmt.Print("\b \b")
				input = input[:sz-1]
			}
			if !(strings.HasPrefix(input, "device")) {
				return
			}
		} else {
			fmt.Print(char)
			input += char
		}
	}
}
func baseHelp() {
	message := `
Documented commands (type help <topic>):
========================================
edit   help          img_dnld_cancel   img_revert   ports  set
eof    history       img_dnld_list     list         py     shell
exit   images        img_dnld_request  pause        run    shortcuts
flows  img_activate  img_dnld_status   perf_config  save   show

Miscellaneous help topics:
==========================
load

Undocumented commands:
======================
quit

`
	fmt.Println(message)
}
