export type PinyinGetPinyinResult<Polyphone extends boolean | undefined> =
  Polyphone extends true ? string[] : string;

export type PinyinFirstLetterResult<Polyphone extends boolean | undefined> =
  Polyphone extends true ? string[] : string;

export interface PinyinUtilFirstLetterDict {
  /** 长度约 20902 的首字母字符串，索引为 (unicode - 19968) */
  all: string;
  /** key 为汉字 unicode，value 为首字母候选（例如 "ZC"） */
  polyphone: Record<number, string>;
}

export interface PinyinUtilDict {
  /** 汉字 -> 带声调拼音（多音字用空格分隔，例如 "da tai"） */
  withtone?: Record<string, string>;
  /** 汉字 -> 不带声调拼音（不支持多音字） */
  notone?: Record<string, string>;
  /** 拼音(无声调) -> 汉字集合字符串 */
  py2hz?: Record<string, string>;
  /** 首字母字典 */
  firstletter?: PinyinUtilFirstLetterDict;
  [key: string]: unknown;
}

export interface PinyinUtil {
  /** 解析各种字典文件（需在本文件之前导入字典脚本） */
  parseDict(): void;

  /**
   * 根据汉字获取拼音；遇到非汉字会原样保留。
   * - `withtone` 默认 `true`
   * - `polyphone` 默认 `false`
   *
   * 当 `polyphone=true` 时，可能返回所有组合的数组。
   */
  getPinyin<Polyphone extends boolean | undefined = false>(
    chinese: string,
    splitter?: string,
    withtone?: boolean,
    polyphone?: Polyphone
  ): PinyinGetPinyinResult<Polyphone>;

  /**
   * 获取汉字的拼音首字母；遇到非汉字会原样保留。
   *
   * 当 `polyphone=true` 时，返回所有可能组合的数组。
   */
  getFirstLetter<Polyphone extends boolean | undefined = false>(
    str: string,
    polyphone?: Polyphone
  ): PinyinFirstLetterResult<Polyphone>;

  /** 拼音转汉字（只支持单个拼音音节），返回匹配汉字集合字符串 */
  getHanzi(pinyin: string): string;

  /** 获取某个汉字的同音字（当前实现未完全可靠） */
  getSameVoiceWord(hz: string, sameTone?: boolean): string;

  /** 去除拼音中的声调，例如 "xiǎo míng" -> "xiao ming" */
  removeTone(pinyin: string): string;

  /** 数字声调转标点声调，例如 "xiao3" -> "xiǎo" */
  getTone(pinyinWithoutTone: string): string;

  /** 内部字典（由 `parseDict()` 填充） */
  dict: PinyinUtilDict;
}

declare const pinyinUtil: PinyinUtil;
export default pinyinUtil;
