import { langConfig } from './config-external.js';


// 缓存已加载的语言包
const loadedLangPacks = {};

// 处理页面目录映射
function processRoutePath(route) {
	let routeParts = route.split("/");

	// ---- 处理页面目录映射 <begin> 分包造成的，需要根据实际目录结构进行映射----
	// 先处理特殊的分包路径
	if (routeParts[0] === 'pages_tool') {
		// pages_tool 分包下的页面，直接使用子目录作为语言包路径
		routeParts = [routeParts[1], ...routeParts.slice(2)];
	} else if (routeParts[0] === 'pages_goods') {
		// pages_goods 分包映射到 goods 目录
		routeParts[0] = 'goods';
	} else if (routeParts[0] === 'pages_member') {
		// pages_member 分包映射到 member 目录
		routeParts[0] = 'member';
	} else if (routeParts[0] === 'pages_order') {
		// pages_order 分包映射到 order 目录
		routeParts[0] = 'order';
	} else if (routeParts[0] === 'pages_promotion') {
		// pages_promotion 分包特殊处理
		const promotionModules = ['point', 'fenxiao', 'merch'];
		if (routeParts[1] && promotionModules.includes(routeParts[1])) {
			routeParts = [routeParts[1], ...routeParts.slice(2)];
		}
	}
	// ---- 处理页面目录映射 <end>----
	
	// 去掉pages目录，只保留子目录
	if (routeParts[0] === 'pages') {
		routeParts = routeParts.slice(1);
	} 
	
	return routeParts.join("/");
}

// 加载语言包（同步方式）
function loadLangPackSync(lang, path) {
	try {
		if (loadedLangPacks[`${lang}_${path}`]) {
			return loadedLangPacks[`${lang}_${path}`];
		}
		const langData = require(`@/lang/${lang}/${path}.js`).lang;
		loadedLangPacks[`${lang}_${path}`] = langData;
		return langData;
	} catch (error) {
		console.error(`加载语言包 ${lang}/${path} 失败:`, error);
		return {};
	}
}

export default {
	langList: langConfig.langList,
	/**
	 * * 解析多语言
	 * @param {Object} field
	 */
	lang(field) {
		let _this = getCurrentPages()[getCurrentPages().length - 1];
		if (!_this) return;

		const locale = uni.getStorageSync('lang') || "zh-cn"; //设置语言

		let value = ''; // 存放解析后的语言值
		let langPath = ''; // 存放当前页面语言包路径

		try {
			//公共语言包（同步加载）
			var lang = loadLangPackSync(locale, 'common');
			
			//当前页面语言包（同步加载）
			let route = _this.route;
			langPath = processRoutePath(route);
			
			// 加载当前页面语言包
			let currentPageLang = loadLangPackSync(locale, langPath);

			// 合并语言包
			let mergedLang = { ...lang, ...currentPageLang };

			// 解析字段
			var arr = field.split(".");
			if (arr.length > 1) {
				// 处理嵌套属性，如 common.currencySymbol
				let temp = mergedLang;
				let found = true;
				for (let key of arr) {
					if (temp[key] !== undefined) {
						temp = temp[key];
					} else {
						found = false;
						break;
					}
				}
				value = found ? temp : field;
			} else {
				value = mergedLang[field] !== undefined ? mergedLang[field] : field;
			}
			
		} catch (e) {
			console.error('解析语言包失败:', e, { langPath, field, locale });
			value = field;
		}

		if (arguments.length > 1) {
			//有参数,需要替换
			for (var i = 1; i < arguments.length; i++) {
				value = value.replace("{" + (i - 1) + "}", arguments[i]);
			}
		}
		if (value == undefined || (value == 'title' && field == 'title')) value = ''; // field

		// 多语言调试，注释后可以关闭控制台输出
		if (field == value) {
			console.warn(`警告: 字段 ${field} 在语言包 ${langPath} 中未找到对应值，使用默认值 ${field} 当前语言: ${locale}`);		
		}

		return value;
	},
	/**
	 * * 切换语言
	 * @param {String} value 语言值
	 * @param {String} url 切换后跳转的页面url
	 */
	change(value, url = '/pages_tool/member/index') {
		let _this = getCurrentPages()[getCurrentPages().length - 1];
		if (!_this) return;

		uni.setStorageSync("lang", value);
		const locale = uni.getStorageSync('lang') || "zh-cn"; //设置语言

		// 清空已加载的语言包缓存
		for (let key in loadedLangPacks) {
			if (!key.startsWith(locale)) {
				delete loadedLangPacks[key];
			}
		}

		this.refresh();

		if (url) {
			uni.reLaunch({ url: url });
		}
	},
	//刷新标题、tabbar
	refresh() {
		let _this = getCurrentPages()[getCurrentPages().length - 1];
		if (!_this) return;
		const locale = uni.getStorageSync('lang') || "zh-cn"; //设置语言
	
		this.title(this.lang("title"));

		//设置tabbar的文字语言
		// uni.setTabBarItem({
		// 	index: 0,
		// 	text: this.lang("tabBar.home")
		// });
		// uni.setTabBarItem({
		// 	index: 1,
		// 	text: this.lang("tabBar.category")
		// });
		// uni.setTabBarItem({
		// 	index: 2,
		// 	text: this.lang("tabBar.cart")
		// });
		// uni.setTabBarItem({
		// 	index: 3,
		// 	text: this.lang("tabBar.member")
		// });
	},
	title(str) {
		if (str) {
			uni.setNavigationBarTitle({
				title: str,
				success: function (res) {
				},
				fail: function (err) {
				}
			});
		}
	},
	// 获取语言包列表
	list() {
		var list = [];
		try {
			//公共语言包
			for (var i = 0; i < langConfig.langList.length; i++) {
				let langType = langConfig.langList[i];
				let item = loadLangPackSync(langType, 'common');
				list.push({
					name: item.common ? item.common.name : langType,
					value: langType
				});
			}
		} catch (e) {
			console.error('获取语言包列表失败:', e);
		}
		return list;
	}
}
