/*
Copyright © 2022-2025 Thomas von Dein

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

package lib

import (
	"strconv"
	"strings"
)

// contains a whole parsed table
type Tabdata struct {
	maxwidthHeader int      // longest header
	columns        int      // count
	headers        []string // [ "ID", "NAME", ...]
	entries        [][]string
}

func (data *Tabdata) CloneEmpty() Tabdata {
	newdata := Tabdata{
		maxwidthHeader: data.maxwidthHeader,
		columns:        data.columns,
		headers:        data.headers,
	}

	return newdata
}

// convert our internal data to a list of maps
func (data *Tabdata) ToMap() []map[string]any {
	dictlist := make([]map[string]any, len(data.entries))
	headers := make([]string, len(data.headers))

	for idx, header := range data.headers {
		headers[idx] = strings.ToLower(header)
	}

	for line, row := range data.entries {
		dict := make(map[string]any, len(data.headers))

		for col, cell := range row {
			n, ok := strconv.Atoi(cell)
			if ok == nil {
				dict[headers[col]] = n
				continue
			}

			if strings.ToLower(cell) == "true" {
				dict[headers[col]] = true
				continue
			}

			if strings.ToLower(cell) == "false" {
				dict[headers[col]] = false
				continue
			}

			dict[headers[col]] = cell
		}

		dictlist[line] = dict
	}

	return dictlist
}
