package logstorage

import (
	"sort"
	"strings"
)

type fieldsSet map[string]struct{}

func newFieldsSet() fieldsSet {
	return fieldsSet(map[string]struct{}{})
}

func (fs fieldsSet) reset() {
	clear(fs)
}

func (fs fieldsSet) String() string {
	a := fs.getAll()
	return "[" + strings.Join(a, ",") + "]"
}

func (fs fieldsSet) clone() fieldsSet {
	fsNew := newFieldsSet()
	for _, f := range fs.getAll() {
		fsNew.add(f)
	}
	return fsNew
}

func (fs fieldsSet) getAll() []string {
	a := make([]string, 0, len(fs))
	for f := range fs {
		a = append(a, f)
	}
	sort.Strings(a)
	return a
}

func (fs fieldsSet) addFields(fields []string) {
	for _, f := range fields {
		fs.add(f)
	}
}

func (fs fieldsSet) removeFields(fields []string) {
	for _, f := range fields {
		fs.remove(f)
	}
}

func (fs fieldsSet) contains(field string) bool {
	if field == "" {
		field = "_msg"
	}
	_, ok := fs[field]
	if !ok {
		_, ok = fs["*"]
	}
	return ok
}

func (fs fieldsSet) remove(field string) {
	if field == "*" {
		fs.reset()
		return
	}
	if !fs.contains("*") {
		if field == "" {
			field = "_msg"
		}
		delete(fs, field)
	}
}

func (fs fieldsSet) add(field string) {
	if fs.contains("*") {
		return
	}
	if field == "*" {
		fs.reset()
		fs["*"] = struct{}{}
		return
	}
	if field == "" {
		field = "_msg"
	}
	fs[field] = struct{}{}
}