/*
 * MinIO Client (C) 2019 MinIO, Inc.
 *
 * 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 cmd

import (
	"fmt"

	"github.com/minio/mc/pkg/console"
)

// Row specifies row description and theme
type Row struct {
	desc      string
	descTheme string
}

// PrettyRecord - an easy struct to format a set of key-value
// pairs into a record
type PrettyRecord struct {
	rows   []Row
	indent int
	maxLen int
}

// newPrettyRecord - creates a new pretty record
func newPrettyRecord(indent int, rows ...Row) PrettyRecord {
	maxDescLen := 0
	for _, r := range rows {
		if len(r.desc) > maxDescLen {
			maxDescLen = len(r.desc)
		}
	}
	return PrettyRecord{
		rows:   rows,
		indent: indent,
		maxLen: maxDescLen,
	}
}

// buildRecord - creates a string which represents a record table given
// some fields contents.
func (t PrettyRecord) buildRecord(contents ...string) (line string) {

	// totalRows is the minimum of the number of fields config
	// and the number of contents elements.
	totalRows := len(contents)
	if len(t.rows) < totalRows {
		totalRows = len(t.rows)
	}
	var format, separator string
	// Format fields and construct message
	for i := 0; i < totalRows; i++ {
		// default heading
		indent := 0
		format = "%s\n"
		// optionally indented rows with key value pairs
		if i > 0 {
			indent = t.indent
			format = fmt.Sprintf("%%%ds%%-%ds : %%s\n", indent, t.maxLen)
			line += console.Colorize(t.rows[i].descTheme, fmt.Sprintf(format, separator, t.rows[i].desc, contents[i]))
		} else {
			line += console.Colorize(t.rows[i].descTheme, fmt.Sprintf(format, contents[i]))
		}
	}
	return
}
