/*
 * 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"
	"strings"
)

// BuildTable populates input data in tabular format
func BuildTable(keys []string, rows []map[string]string) (string, error) {
	var returnString string
	fieldSizes := make(map[string]int)

	for i := 0; i < len(rows); i++ {
		for key, value := range rows[i] {
			currentSize := len(value)
			if currentSize > fieldSizes[key] {
				fieldSizes[key] = currentSize
			}

		}
	}
	for i := 0; i < len(keys); i++ {
		currentSize := len(keys[i])
		if currentSize > fieldSizes[keys[i]] {
			fieldSizes[keys[i]] = currentSize
		}
	}
	bottom := "+"

	for i := 0; i < len(rows); i++ {
		header := "|"
		line := "|"
		for j := 0; j < len(keys); j++ {
			key := keys[j]
			value := rows[i][key]
			if i == 0 {
				pad := 2 + fieldSizes[key] - len(key)
				field := fmt.Sprintf("%s%s|", strings.Repeat(" ", pad), key)
				spacer := fmt.Sprintf("%s+", strings.Repeat("-", fieldSizes[key]+2))
				header = header + field
				bottom = bottom + spacer
			}
			pad := 2 + fieldSizes[key] - len(value)
			field := fmt.Sprintf("%s%s|", strings.Repeat(" ", pad), value)
			line = line + field

		}
		if i == 0 {
			returnString = bottom + "\n" + header + "\n" + bottom + "\n"
		}

		returnString = returnString + line + "\n"
	}
	returnString = returnString + bottom + "\n"

	return returnString, nil

}
