import request from '@/utils/request';
import {
	setStorageWithExpiry,
	getStorageWithExpiry
} from '@/utils/auth'

export function getWXStatusHeight() {
	// #ifdef MP-WEIXIN
	// 获取距上
	const barTop = wx.getSystemInfoSync().statusBarHeight
	// 获取胶囊按钮位置信息
	const menuButtonInfo = wx.getMenuButtonBoundingClientRect()
	// 获取导航栏高度
	const barHeight = menuButtonInfo.height + (menuButtonInfo.top - barTop) * 2
	let barWidth = menuButtonInfo.width
	console.log('menuButtonInfo', menuButtonInfo)
	let barLeftPosition = 375 - menuButtonInfo.right + menuButtonInfo.width
	let menuButtonLeft = menuButtonInfo.left
	let menuButtonRight = menuButtonInfo.right
	return {
		barHeight,
		barTop,
		barWidth,
		barLeftPosition,
		menuButtonLeft,
		menuButtonRight
	}
	// #endif
}

/**
 * 根据订单的状态获取订单的文字展示状态(这个状态范围少，是按李总意思整理出来的状态)
 * @param ticketsStatus 订单状态
 * @param workStatus 维修工作状态
 */
export function getOrderStatusText(ticketsStatus,workStatus){
	let str = "已进厂";
	if("04"==ticketsStatus){
		//待派工
		str = "待维修"
	}else if("05"==ticketsStatus){
		//维修中
		str = "维修中"
	}else if("01"==ticketsStatus){
		//待取车结算
		str = "已竣工"
	}else if("06"==ticketsStatus){
		//挂单/记账
		str = "已结算"
	}else if("07"==ticketsStatus){
		//待通知客户取车
		str = "已竣工"
	}else if("08"==ticketsStatus){
		//已交车
		str = "已交车"
	}else if("02"==ticketsStatus){
		//已结账
		str = "已结算"
	}else if("03"==ticketsStatus){
		//已作废
		str = "已作废"
	}
	return str;
}

/**
 * 根据订单的状态获取订单的文字展示状态(这个状态多，就是系统初始状态)
 * @param ticketsStatus 订单状态
 * @param workStatus 维修工作状态
 */
export function getOrderStatusTextAll(ticketsStatus,workStatus){
	let str = "已进厂";
	if("04"==ticketsStatus){
		//待派工
		str = "待派工"
	}else if("05"==ticketsStatus){
		//维修中
		str = "维修中"
	}else if("01"==ticketsStatus){
		//待取车结算
		str = "待取车结算"
	}else if("06"==ticketsStatus){
		//挂单/记账
		str = "已挂单/记账待交车"
	}else if("07"==ticketsStatus){
		//待通知客户取车
		str = "待通知客户取车"
	}else if("08"==ticketsStatus){
		//已交车
		str = "已交车"
	}else if("02"==ticketsStatus){
		//已结账
		str = "已结账待交车"
	}else if("03"==ticketsStatus){
		//已作废
		str = "已作废"
	}
	return str;
}


/**
 * 查询字典可选值
 * @param dictCode
 */
export function getDictByCode(dictCode){
	let dictArray = getStorageWithExpiry(dictCode);
	if(null==dictArray || undefined==dictArray){
		request({
			url: '/admin-api/system/dict-data/type',
			method: 'get',
			params:{type:dictCode}
		}).then((res) => {
			console.log(res)
			if (res.code == 200) {
				setStorageWithExpiry(dictCode,res.data,3600)
				return res.data
			}
		})
	}else{
		return dictArray
	}
}
/**
 * 工单记录操作日志
 * @param id 工单主表id
 * @param ticketsWorkStatus 工单主表状态
 * @param itemId 工单子表id
 * @param itemStatus 工单子表状态
 * @param recordType 操作类型  对应后端枚举：RecordTypeEnum
 * @param remark 备注
 * @param image 图片相对路径，多个英文逗号隔开
 * @param finishType 完成类型  01：完成并移交下一班组、02：完成并移交总检、03：完成工单
 * @param nextName 下一班组名称
 */
export function saveTicketsRecords(id,ticketsWorkStatus,itemId,itemStatus,recordType,remark,image,finishType,nextName){
	return new Promise((resolve, reject) => {
		let dataObj = {
			id: id,
			ticketsWorkStatus:ticketsWorkStatus,
			item: {id: itemId, itemStatus: itemStatus},
			recordType: recordType,
			remark: remark,
			finishType:finishType,
			nextName:nextName,
			image: image
		}
		request({
			url: '/admin-api/repair/tickets/updateStatus',
			method: 'POST',
			data:dataObj
		}).then((res) => {
			console.log(res)
			if (res.code == 200) {
				uni.showToast({
					title: '操作成功',
					icon: 'none'
				})
				resolve(1);
			}else{
				uni.showToast({
					title: '操作失败，请联系管理员',
					icon: 'none'
				})
				reject(0);
			}
		})
	});
}

/**
 * 翻译字典
 * @param dictCode
 */
export async function getDictTextByCodeAndValue(dictCode, value) {
	let dictArray = getStorageWithExpiry(dictCode);
	if (null == dictArray || undefined == dictArray) {
		let res = await request({
			url: '/admin-api/system/dict-data/type',
			method: 'get',
			params: {type: dictCode}
		})
		if (res.code == 200) {
			setStorageWithExpiry(dictCode, res.data, 3600)
			dictArray = res.data
			let dictObj = dictArray.find(item => item.value == value)
			if (dictObj) {
				return dictObj.label
			} else {
				return "未知数据"
			}
		}
	} else {
		let dictObj = dictArray.find(item => item.value == value)
		if (dictObj) {
			return dictObj.label
		} else {
			return "未知数据"
		}
	}
}

export function formatTimestamp(timestamp) {
	// 将时间戳转换为Date对象
	const date = new Date(timestamp);
	// 获取年月日时分秒
	const year = date.getFullYear();
	const month = (date.getMonth() + 1).toString().padStart(2, '0');
	const day = date.getDate().toString().padStart(2, '0');
	const hours = date.getHours().toString().padStart(2, '0');
	const minutes = date.getMinutes().toString().padStart(2, '0');
	const seconds = date.getSeconds().toString().padStart(2, '0');
	// 组合成日期时间字符串
	return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}

/**
 * 将时间戳转换为指定格式的日期字符串
 * @param {number} timestamp - 时间戳（毫秒）
 * @param {string} [format='YYYY-MM-DD'] - 日期格式，默认为 'YYYY-MM-DD'
 * @returns {string} - 格式化的日期字符串
 */
export function formatTimestampCustom(timestamp, format = 'YYYY-MM-DD') {
	const date = new Date(timestamp);

	const year = date.getFullYear();
	const month = (date.getMonth() + 1).toString().padStart(2, '0');
	const day = date.getDate().toString().padStart(2, '0');
	const hour = date.getHours().toString().padStart(2, '0');
	const minute = date.getMinutes().toString().padStart(2, '0');
	const second = date.getSeconds().toString().padStart(2, '0');

	const replaceMap = {
		'YYYY': year,
		'MM': month,
		'DD': day,
		'HH': hour,
		'mm': minute,
		'ss': second
	};

	return format.replace(/YYYY|MM|DD|HH|mm|ss/g, match => replaceMap[match]);
}

/**
 * 组装订单对象
 * @param order
 */
export function builderOrder(order) {
	return {
		id: order.id,
		orderNo: order.ticketNo,
		flag: 1,
		ticketsStatus: order.ticketsStatus,
		ticketsWorkStatus: order.ticketsWorkStatus,
		flagStr: getOrderStatusTextAll(order.ticketsStatus, order.ticketsWorkStatus),
		carNum: order.carNo,
		nowRepairId: order.nowRepairId,
		carModel: order.carBrandName,
		userName: order.userName,
		userPhone: order.userMobile,
		counselorName: order.adviserName,
		canOperate:order.canOperate,
	}
}

export function formatDate(timestamp) {
	// 将时间戳转换为Date对象
	const date = new Date(timestamp);
	// 获取年月日时分秒
	const year = date.getFullYear();
	const month = (date.getMonth() + 1).toString().padStart(2, '0');
	const day = date.getDate().toString().padStart(2, '0');
	// 组合成日期时间字符串
	return `${year}-${month}-${day}`;
}

//转换为double
// utils.js
export function convertToDouble(value, decimalPlaces = 1) {
	if (value !== undefined && value !== null) {
		const parsedValue = parseFloat(value);
		if (!isNaN(parsedValue)) {
			return parsedValue.toFixed(decimalPlaces);
		} else {
			console.error('转换失败，值不是有效的数字');
			return '0.0'; // 可以设置一个默认值
		}
	} else {
		console.error('值不存在');
		return '0.0'; // 可以设置一个默认值
	}
}


/**
 * 生成一个16位的纯数字的唯一ID
 * 生成策略 head + 当前时间戳 + 随机数
 * @param head 前缀
 */
export function createUniqueCodeByHead(head = '') {
	const min = 100; // 最小值
	const max = 999; // 最大值
	return head.toString() + Date.now().toString() + Math.floor(Math.random() * (max - min + 1)) + min;
}

/**
 * 构造树
 * @param items 原对象数组
 * @param idKey 主标识
 * @param parentKey 父标识
 * @param mapping 映射Map
 */
export function buildTree(items, idKey, parentKey, mapping = null) {
	const result = [];  // 存储最终的树形结构
	const itemMap = {}; // 用于快速查找对象

	// 首先将所有项放入map中，便于后续快速查找
	for (const item of items) {
		itemMap[item[idKey]] = { ...item, children: [] };
	}

	// 遍历每个项，构建树形结构
	for (const item of items) {
		const id = item[idKey];
		const parentId = item[parentKey];

		const node = itemMap[id];
		if (parentId !== null && itemMap[parentId]) {
			// 如果有父ID，并且父节点存在，则将当前节点加入到其父节点的children数组中
			itemMap[parentId].children.push(node);
		} else {
			// 如果没有父ID，或者找不到对应的父节点，则认为这是根节点
			result.push(node);
		}
	}

	if (mapping){
		return mapTree(result, mapping)
	}

	return result;
}

// 映射函数
function mapTree(tree, mapping) {
	if (!tree || !Array.isArray(tree)) {
		return tree;
	}

	const mappedTree = tree.map(item => {
		const mappedItem = {};
		for (const key in item) {
			if (key === 'children') {
				// 递归处理 children 数组
				if (mapping.children) {
					mappedItem[mapping.children] = mapTree(item[key], mapping);
				} else {
					mappedItem[key] = mapTree(item[key], mapping);
				}
			} else if (key in mapping) {
				// 根据映射规则转换属性
				const targetKey = mapping[key];
				mappedItem[targetKey] = item[key];
			}
		}
		return mappedItem;
	});

	return mappedTree;
}


