/*
   * 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 util

import (
	"fmt"
	"os"
)

/*
ProcessTable parses table structure and executes functions
*/
func ProcessTable(functionTable map[string]func(bool), inputPrompt string) {
	keys := []string{}
	for k := range functionTable {
		keys = append(keys, k)
	}
	var b = make([]byte, 1)
	input := ""
	fmt.Print(inputPrompt)
	for {
		os.Stdin.Read(b)
		char := string(b)
		if char == "\t" || char == "\n" || char == "?" {
			fmt.Println("")
			ret, prompt := Test(input, keys)
			if len(ret) == 1 {
				input = ret[0]
				if input == "exit" {
					return
				}
				if char == "\n" {
					Route(input, functionTable, true)
				} else {
					Route(input, functionTable, false)
				}
				input = ""
				fmt.Print(inputPrompt)
			} else if len(ret) == 0 {
				input = ""
				fmt.Println("\nInvalid Input ")
				fmt.Print(inputPrompt)
			} else if len(ret) == 0 {
			} else {

				fmt.Println(ret)
				input = prompt
				fmt.Print(inputPrompt)
				fmt.Print(prompt)
			}
		} else if char == " " {
			_, ok := functionTable[input]
			if ok {
				Route(input, functionTable, false)
				fmt.Print(inputPrompt)
				input = ""
			} else {
				ret, prompt := Test(input, keys)
				if len(ret) == 1 {
					input = ret[0]
					Route(input, functionTable, false)
					input = ""
					fmt.Print(inputPrompt)
				} else if len(ret) == 0 {
					input = ""
					fmt.Println("\nInvalid Input ")
					fmt.Print(inputPrompt)
				} else {

					fmt.Println(ret)
					input = prompt
					fmt.Print(inputPrompt + input)
				}
			}

		} else if b[0] == 127 || char == "\b" {
			sz := len(input)

			if sz > 0 {
				fmt.Print("\b \b")
				input = input[:sz-1]
			}
		} else {
			fmt.Print(char)
			input += char
		}
	}
}
