package translit

import (
	"bytes"
	"strings"
	"unicode"

	"github.com/mozillazg/go-pinyin"
)

// ChineseTranslit implements Transliterator using a pinyin
// conversion library.
type ChineseTranslit struct{}

func (ChineseTranslit) Init() {}

func (ct *ChineseTranslit) Transliterate(s string) string {
	// Create buffer for final output
	outBuf := &bytes.Buffer{}
	// Create buffer to temporarily store chinese characters
	tmpBuf := &bytes.Buffer{}
	// For every character in string
	for _, char := range s {
		// If character in Han range
		if unicode.Is(unicode.Han, char) {
			// Write character to temporary buffer
			tmpBuf.WriteRune(char)
		} else {
			// If buffer contains characters
			if tmpBuf.Len() > 0 {
				// Convert to pinyin (without tones)
				out := pinyin.LazyConvert(tmpBuf.String(), nil)
				// Write space-separated string to output
				outBuf.WriteString(strings.Join(out, " "))
				// Reset temporary buffer
				tmpBuf.Reset()
			}
			// Write character to output
			outBuf.WriteRune(char)
		}
	}
	// If buffer contains characters
	if tmpBuf.Len() > 0 {
		// Convert to pinyin (without tones)
		out := pinyin.LazyConvert(tmpBuf.String(), nil)
		// Write space-separated string to output
		outBuf.WriteString(strings.Join(out, " "))
		// Reset temporary buffer
		tmpBuf.Reset()
	}
	// Return output string
	return outBuf.String()
}
