// Package util ...
//
// Description : util ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2023-06-25 17:22
package util

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

// PinYinArg 设置选项方法
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:33 2023/6/25
type PinYinArg func(arg *pinyin.Args)

// 拼音风格的设置

// PinYinStyleNormal ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:37 2023/6/25
func PinYinStyleNormal() PinYinArg {
	return func(arg *pinyin.Args) {
		arg.Style = pinyin.Normal
	}
}

// PinYinStyleToneStand 声调风格1,拼音声调在韵母第一个字母上。如: zhōng guó
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:38 2023/6/25
func PinYinStyleToneStand() PinYinArg {
	return func(arg *pinyin.Args) {
		arg.Style = pinyin.Tone
	}
}

// PinYinStyleToneAfterYunMu 声调风格2,即拼音声调在各个韵母之后,用数字 [1-4] 进行表示。如: zho1ng guo2
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:39 2023/6/25
func PinYinStyleToneAfterYunMu() PinYinArg {
	return func(arg *pinyin.Args) {
		arg.Style = pinyin.Tone2
	}
}

// PinYinStyleToneAtEnding 声调风格3,即拼音声调在各个拼音之后,用数字 [1-4] 进行表示。如: zhong1 guo2
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:40 2023/6/25
func PinYinStyleToneAtEnding() PinYinArg {
	return func(arg *pinyin.Args) {
		arg.Style = pinyin.Tone3
	}
}

// PinYinStyleShengMu 声母风格,只返回各个拼音的声母部分。如: zh g 。注意:不是所有的拼音都有声母
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:41 2023/6/25
func PinYinStyleShengMu() PinYinArg {
	return func(arg *pinyin.Args) {
		arg.Style = pinyin.Initials
	}
}

// PinYinStyleFirstLetter 首字母风格,只返回拼音的首字母部分。如: z g
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:42 2023/6/25
func PinYinStyleFirstLetter() PinYinArg {
	return func(arg *pinyin.Args) {
		arg.Style = pinyin.FirstLetter
	}
}

// PinYinStyleYunMu 韵母风格,只返回各个拼音的韵母部分,不带声调。如: ong uo
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:43 2023/6/25
func PinYinStyleYunMu() PinYinArg {
	return func(arg *pinyin.Args) {
		arg.Style = pinyin.Finals
	}
}

// PinYinStyleToneYunMu 韵母风格1,带声调,声调在韵母第一个字母上。如: ōng uó
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:44 2023/6/25
func PinYinStyleToneYunMu() PinYinArg {
	return func(arg *pinyin.Args) {
		arg.Style = pinyin.FinalsTone
	}
}

// PinYinStyleToneYunMuAtStart 韵母风格2,带声调,声调在各个韵母之后,用数字 [1-4] 进行表示。如: o1ng uo2
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:45 2023/6/25
func PinYinStyleToneYunMuAtStart() PinYinArg {
	return func(arg *pinyin.Args) {
		arg.Style = pinyin.FinalsTone2
	}
}

// PinYinStyleToneYunMuAtEnding 韵母风格3,带声调,声调在各个拼音之后,用数字 [1-4] 进行表示。如: ong1 uo2
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:40 2023/6/25
func PinYinStyleToneYunMuAtEnding() PinYinArg {
	return func(arg *pinyin.Args) {
		arg.Style = pinyin.FinalsTone3
	}
}

// 拼音风格设置结束

// PinYinStyleWithSeparator 设置拼音的分隔符
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:59 2023/6/25
func PinYinStyleWithSeparator(separator string) PinYinArg {
	return func(arg *pinyin.Args) {
		if len(separator) == 0 {
			return
		}
		arg.Separator = separator
	}
}

// PinYinStyleWithHeteronym 开启多音字模式
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:03 2023/6/25
func PinYinStyleWithHeteronym() PinYinArg {
	return func(arg *pinyin.Args) {
		arg.Heteronym = true
	}
}

// PinYin 汉字转拼音
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:23 2023/6/25
type pinYin struct {
}

// Convert 汉字生成拼音
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 17:26 2023/6/25
func (py *pinYin) Convert(text string, argFuncList ...PinYinArg) string {
	arg := pinyin.NewArgs()
	arg.Separator = " "
	for _, argFunc := range argFuncList {
		argFunc(&arg)
	}

	return pinyin.Slug(text, arg)
}

// ConvertSingle 每个字一个读音, 支持多音字
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:02 2023/6/25
func (py *pinYin) ConvertSingle(text string, argFuncList ...PinYinArg) []string {
	arg := pinyin.NewArgs()
	arg.Separator = " "
	for _, argFunc := range argFuncList {
		argFunc(&arg)
	}

	return pinyin.LazyPinyin(text, arg)
}

// ConvertWithHeteronym 多音字模式
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:02 2023/6/25
func (py *pinYin) ConvertWithHeteronym(text string, argFuncList ...PinYinArg) [][]string {
	arg := pinyin.NewArgs()
	arg.Separator = " "
	for _, argFunc := range argFuncList {
		argFunc(&arg)
	}
	return pinyin.Pinyin(text, arg)
}