/*
 * Minio Cloud Storage, (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 parquet

import (
	"fmt"
	"strings"
)

// Record - ordered parquet record.
type Record struct {
	nameList     []string
	nameValueMap map[string]Value
}

// String - returns string representation of this record.
func (r *Record) String() string {
	values := []string{}
	r.Range(func(name string, value Value) bool {
		values = append(values, fmt.Sprintf("%v:%v", name, value))
		return true
	})

	return "map[" + strings.Join(values, " ") + "]"
}

func (r *Record) set(name string, value Value) {
	r.nameValueMap[name] = value
}

// Get - returns Value of name.
func (r *Record) Get(name string) (Value, bool) {
	value, ok := r.nameValueMap[name]
	return value, ok
}

// Range - calls f sequentially for each name and value present in the record. If f returns false, range stops the iteration.
func (r *Record) Range(f func(name string, value Value) bool) {
	for _, name := range r.nameList {
		value, ok := r.nameValueMap[name]
		if !ok {
			continue
		}

		if !f(name, value) {
			break
		}
	}
}

func newRecord(nameList []string) *Record {
	return &Record{
		nameList:     nameList,
		nameValueMap: make(map[string]Value),
	}
}