/**
 * 微信同声传译插件（WechatSI）语音识别封装
 * 仅 MP-WEIXIN 可用；需在 manifest.json / app.json 声明插件
 */

const MAX_DURATION_MS = 60000
const LANG = 'zh_CN'

let manager = null
let inited = false

function getPluginManager() {
	// #ifdef MP-WEIXIN
	if (manager) return manager
	try {
		// eslint-disable-next-line no-undef
		const plugin = requirePlugin('WechatSI')
		if (!plugin || typeof plugin.getRecordRecognitionManager !== 'function') {
			return null
		}
		manager = plugin.getRecordRecognitionManager()
		return manager
	} catch (e) {
		console.error('[WechatSI] requirePlugin fail', e)
		return null
	}
	// #endif
	// #ifndef MP-WEIXIN
	return null
	// #endif
}

/**
 * 当前环境是否可用微信同声传译
 */
export function isWechatSIAvailable() {
	// #ifdef MP-WEIXIN
	return !!getPluginManager()
	// #endif
	// #ifndef MP-WEIXIN
	return false
	// #endif
}

/**
 * 确保已授权录音
 * @returns {Promise<boolean>}
 */
export function ensureRecordAuth() {
	return new Promise((resolve) => {
		// #ifndef MP-WEIXIN
		resolve(false)
		return
		// #endif
		uni.getSetting({
			success(res) {
				const auth = res.authSetting || {}
				if (auth['scope.record']) {
					resolve(true)
					return
				}
				uni.authorize({
					scope: 'scope.record',
					success() {
						resolve(true)
					},
					fail() {
						uni.showModal({
							title: '需要麦克风权限',
							content: '请在设置中开启麦克风，以便语音转文字',
							confirmText: '去设置',
							success(modalRes) {
								if (modalRes.confirm) {
									uni.openSetting({
										success(settingRes) {
											const ok = !!(settingRes.authSetting && settingRes.authSetting['scope.record'])
											resolve(ok)
										},
										fail() {
											resolve(false)
										}
									})
								} else {
									resolve(false)
								}
							}
						})
					}
				})
			},
			fail() {
				resolve(false)
			}
		})
	})
}

/**
 * 初始化识别回调（全局只绑一次，由业务侧传入最新 handlers）
 * @param {{
 *   onStart?: Function,
 *   onRecognize?: Function,
 *   onStop?: Function,
 *   onError?: Function
 * }} handlers
 */
export function initRecordRecognition(handlers = {}) {
	const m = getPluginManager()
	if (!m) return false

	m.onStart = (res) => {
		if (typeof handlers.onStart === 'function') handlers.onStart(res)
	}
	// 部分版本支持中间结果
	m.onRecognize = (res) => {
		if (typeof handlers.onRecognize === 'function') handlers.onRecognize(res)
	}
	m.onStop = (res) => {
		if (typeof handlers.onStop === 'function') handlers.onStop(res)
	}
	m.onError = (res) => {
		if (typeof handlers.onError === 'function') handlers.onError(res)
	}
	inited = true
	return true
}

/**
 * 开始录音识别，最长 60s
 * @param {{ duration?: number, lang?: string }} [options]
 */
export function startRecordRecognition(options = {}) {
	const m = getPluginManager()
	if (!m) {
		return Promise.reject(new Error('当前环境不支持语音识别'))
	}
	if (!inited) {
		return Promise.reject(new Error('语音识别未初始化'))
	}
	const duration = Math.min(
		MAX_DURATION_MS,
		Math.max(1000, Number(options.duration) || MAX_DURATION_MS)
	)
	const lang = options.lang || LANG
	try {
		m.start({ duration, lang })
		return Promise.resolve(true)
	} catch (e) {
		return Promise.reject(e)
	}
}

/**
 * 结束录音识别
 */
export function stopRecordRecognition() {
	const m = getPluginManager()
	if (!m) return
	try {
		m.stop()
	} catch (e) {
		console.warn('[WechatSI] stop fail', e)
	}
}

/**
 * 将插件错误码转为中文提示
 */
export function formatSiError(err) {
	const code = err && (err.retcode != null ? err.retcode : err.errCode)
	const msg = (err && (err.msg || err.errMsg || err.message)) || ''
	const map = {
		'-30001': '录音失败，请检查麦克风权限',
		'-30002': '录音已中断',
		'-30003': '录音数据发送失败',
		'-30004': '未获取到识别结果，请重试',
		'-30005': '语音识别服务异常',
		'-30006': '识别超时，请缩短说话时间后重试',
		'-30007': '启动参数错误',
		'-30008': '网络异常，请稍后重试',
		'-30009': '鉴权失败',
		'-30010': '鉴权网络失败',
		'-30011': '正在识别中，请稍候',
		'-30012': '当前没有进行中的识别',
		'-30013': '识别失败，请重试',
		'-40001': '调用过于频繁，请稍后再试'
	}
	const key = code != null ? String(code) : ''
	return map[key] || msg || '语音识别失败'
}

export const WECHAT_SI_MAX_DURATION_MS = MAX_DURATION_MS
