package aghnet

import (
	"fmt"
	"strings"

	"github.com/AdguardTeam/golibs/stringutil"
)

// NormalizeDomain returns a lowercased version of host without the final dot,
// unless host is ".", in which case it returns it unchanged.  That is a special
// case that to allow matching queries like:
//
//	dig IN NS '.'
func NormalizeDomain(host string) (norm string) {
	if host == "." {
		return host
	}

	return strings.ToLower(strings.TrimSuffix(host, "."))
}

// NewDomainNameSet returns nil and error, if list has duplicate or empty domain
// name.  Otherwise returns a set, which contains domain names normalized using
// [NormalizeDomain].
func NewDomainNameSet(list []string) (set *stringutil.Set, err error) {
	set = stringutil.NewSet()

	for i, host := range list {
		if host == "" {
			return nil, fmt.Errorf("at index %d: hostname is empty", i)
		}

		host = NormalizeDomain(host)
		if set.Has(host) {
			return nil, fmt.Errorf("duplicate hostname %q at index %d", host, i)
		}

		set.Add(host)
	}

	return set, nil
}