import { createI18n } from 'vue-i18n'

import { Locale } from 'wot-design-uni'
// 引入英文语言包
import enUS from 'wot-design-uni/locale/lang/en-US'
import bn from './bn.json'
import en from './en.json'
import zhHans from './zh-Hans.json'
// 简体中文
const messages = {
  en,
  'zh-Hans': zhHans, // key 不能乱写，查看截图 screenshots/i18n.png
  bn,
}

const supportedLocales = ['en', 'zh-Hans', 'bn'] as const
type SupportedLocale = typeof supportedLocales[number]

function normalizeLocale(locale: string | undefined | null): SupportedLocale {
  if (!locale)
    return 'bn'
  if (supportedLocales.includes(locale as SupportedLocale))
    return locale as SupportedLocale

  const lower = locale.toLowerCase()
  if (lower.startsWith('en'))
    return 'en'

  return 'bn'
}

function getInitialLocale(): SupportedLocale {
  const storedLocale = uni.getStorageSync('app_locale')
  if (storedLocale)
    return normalizeLocale(storedLocale)

  const systemLocale = uni.getSystemInfoSync().language || uni.getLocale()
  const normalized = normalizeLocale(systemLocale)
  return normalized === 'en' ? 'en' : 'bn'
}

const i18n = createI18n({
  locale: getInitialLocale(), // 获取已设置的语言，fallback 语言需要再 manifest.config.ts 中设置
  messages,
  allowComposition: true,
})
Locale.use('en-US', enUS)
console.log(uni.getLocale())
console.log(i18n.global.locale)

/**
 * 可以拿到原始的语言模板，非 vue 文件使用这个方法，
 * @param { string } key 多语言的key，eg: "app.name"
 * @returns {string} 返回原始的多语言模板，eg: "{heavy}KG"
 */
export function getTemplateByKey(key: string) {
  if (!key) {
    console.error(`[i18n] Function getTemplateByKey(), key param is required`)
    return ''
  }
  const locale = uni.getLocale()

  const message = messages[locale] // 拿到某个多语言的所有模板（是一个对象)
  if (Object.keys(message).includes(key)) {
    return message[key]
  }

  try {
    const keyList = key.split('.')
    return keyList.reduce((pre, cur) => {
      return pre[cur]
    }, message)
  }
  catch (error) {
    console.error(`[i18n] Function getTemplateByKey(), key param ${key} is not existed.`)
    return ''
  }
}

/**
 * formatI18n('我是{name},身高{detail.height},体重{detail.weight}',{name:'张三',detail:{height:178,weight:'75kg'}})
 * 暂不支持数组
 * @param template 多语言模板字符串，eg: `我是{name}`
 * @param {object | undefined} data 需要传递的数据对象，里面的key与多语言字符串对应，eg: `{name:'菲鸽'}`
 * @returns
 */
function formatI18n(template: string, data?: any) {
  return template.replace(/\{([^}]+)\}/g, (match, key: string) => {
    // console.log( match, key) // => { detail.height }  detail.height
    const arr = key.trim().split('.')
    let result = data
    while (arr.length) {
      const first = arr.shift()
      result = result[first]
    }
    return result
  })
}

/**
 * t('introduction',{name:'张三',detail:{height:178,weight:'75kg'}})
 * => formatI18n('我是{name},身高{detail.height},体重{detail.weight}',{name:'张三',detail:{height:178,weight:'75kg'}})
 * 没有key的，可以不传 data；暂不支持数组
 * @param template 多语言模板字符串，eg: `我是{name}`
 * @param {object | undefined} data 需要传递的数据对象，里面的key与多语言字符串对应，eg: `{name:'菲鸽'}`
 * @returns
 */
export function t(key, data?) {
  return formatI18n(getTemplateByKey(key), data)
}

/**
 * 处理文本中的换行符，将 \n 转换为 <br> 标签
 * @param text 包含换行符的文本
 * @returns 转换后的HTML字符串
 */
export function formatTextWithBreaks(text: string): string {
  if (!text)
    return ''
  return text.replace(/\n/g, '<br>')
}

/**
 * 带换行处理的国际化函数
 * @param key 多语言的key
 * @param data 需要传递的数据对象
 * @returns 处理换行符后的HTML字符串
 */
export function tWithBreaks(key: string, data?: any): string {
  const text = t(key, data)
  return formatTextWithBreaks(text)
}
export default i18n
