package punycode

import (
	"fmt"
	"slices"

	"golang.org/x/net/idna"
)

// EncodeDomain 将 Unicode 域名编码为 Punycode
func EncodeDomain(domain string) (string, error) {
	ascii, err := idna.ToASCII(domain)
	if err != nil {
		return "", fmt.Errorf("domain encode failed: %w", err)
	}
	return ascii, nil
}

// EncodeDomains 将 Unicode 域名列表编码为 Punycode
func EncodeDomains(domain []string) (encoded []string, err error) {
	var punycode string
	for item := range slices.Values(domain) {
		punycode, err = EncodeDomain(item)
		if err != nil {
			return nil, err
		}
		encoded = append(encoded, punycode)
	}
	return encoded, nil
}

// DecodeDomain 将 Punycode 域名解码为 Unicode 域名
func DecodeDomain(punycodeDomain string) (string, error) {
	unicode, err := idna.ToUnicode(punycodeDomain)
	if err != nil {
		return "", fmt.Errorf("domain decode failed: %w", err)
	}
	return unicode, nil
}

// DecodeDomains 将 Punycode 域名列表解码为 Unicode 域名
func DecodeDomains(punycode []string) (decoded []string, err error) {
	var unicode string
	for item := range slices.Values(punycode) {
		unicode, err = DecodeDomain(item)
		if err != nil {
			return nil, err
		}
		decoded = append(decoded, unicode)
	}
	return decoded, nil
}
