const api = uni.requireNativePlugin("DothanTech-LPAPI");

function request(action, data, callback) {
	console.log(`### Request: action = ${action}`);
	// console.log(data ? JSON.stringify(data) : data);
	return new Promise((resolve) => {
		if (api && api[action]) {
			api[action](data || {}, (result) => {
				// console.log(`### Response:`);
				// console.log(JSON.stringify(data));
				if (result && result.code === 0) {
					resolve(result.data || true);
				} else {
					resolve(undefined);
					console.log(result.data);
				}
				if (typeof callback === "function") {
					callback(result.code === 0 ? result.data : null);
				}
			});
		} else {
			if (api) {
				resolve(undefined);
				console.log("LPAPI插件加载失败");
			} else {
				resolve(undefined);
				console.log("未检测到该方法:" + action);
			}
		}
	});
}

const lpapi = {
	/**
	 * 获取指定型号的所有打印机；
	 * @param { string | {name?: string} } data 参数；
	 * @returns { {name: string, macAddress?: string}[] } 获取打印机列表；
	 */
	getPrinters(data) {
		if (typeof data === "string") {
			data = { name: data };
		}
		return request("getPrinters", data);
	},
	/**
	 * 获取指定型号的一台打印机；
	 * @param { string | {name?: string} } data 参数；
	 * @returns { {name: string, macAddress?: string} } 获取检测到的第一台打印机；
	 */
	getFirstPrinter(data) {
		if (typeof data === "string") {
			data = { name: data };
		}
		return request("getFirstPrinter", data);
	},
	/**
	 *
	 * @param { string | {name?: string}} data 参数；
	 */
	openPrinter(data, callback) {
		if (typeof data === "string") {
			data = { name: data };
		}
		return request("openPrinter", typeof data === "object" ? data : {}, callback);
	},
	/**
	 * 获取当前已连接打印机名称；
	 */
	getPrinterName() {
		return request("getPrinterName", {});
	},
	/**
	 * 获取当前已连接打印机信息；
	 * 调用该接口前要确保打印机已连接；
	 */
	getPrinterInfo() {
		return request("getPrinterInfo", {});
	},
	// /**
	//  * 获取当前打印机的连接状态；
	//  */
	// getPrinterState() {
	// 	return request('getPrinterState', {});
	// },
	/**
	 * 当前打印机是否已经打开；
	 */
	isPrinterOpened() {
		return request("isPrinterOpened", {});
	},
	/**
	 *
	 * @param { string | {}} data 参数；
	 * @param {string} data.name
	 * @param {string} data.model
	 * @returns
	 */
	isPrinterSupported(data) {
		data =
			typeof data === "object"
				? data
				: {
						name: arguments[0],
						model: arguments[1],
				  };
		return request("isPrinterSupported", data || {});
	},
	// /**
	//  * 取消当前打印任务；
	//  */
	// cancel() {
	// 	return request('cancel', {});
	// },
	/**
	 * 关闭打印机；
	 */
	closePrinter() {
		return request("closePrinter", {});
	},
	/**
	 * 打印BASE64图片；
	 * @param {{}} data
	 * @param {string} data.image
	 * @param {number} data.PRINT_DENSITY
	 * @param {number} data.PRINT_SPEED
	 * @param {number} data.PRINT_COPIES
	 */
	printImage(data) {
		return request("printImage", data);
	},
	/**
	 * 开始打印任务；
	 * @param {{}} data 参数；
	 * @param {number} data.width
	 * @param {number} data.height
	 * @param {number} data.orientation
	 */
	startJob(data) {
		return request("startJob", data);
	},
	// /**
	//  * 终止打印任务；
	//  */
	// abortJob() {
	// 	return request('abortJob', {});
	// },
	/**
	 * 提交打印任务；
	 * @param {{}} data 参数；
	 * @param {number} data.PRINT_DENSITY
	 * @param {number} data.PRINT_SPEED
	 * @param {number} data.PRINT_COPIES
	 */
	commitJob(data) {
		return request("commitJob", data);
	},
	// /**
	//  * 开始打印页面；
	//  */
	// startPage() {
	// 	return request('startPage', {});
	// },
	// /**
	//  * 结束打印页面；
	//  */
	// endPage() {
	// 	return request('endPage', {});
	// },
	/**
	 * 结束打印任务；
	 */
	endJob() {
		return request("endJob", {});
	},
	/**
	 * 获取当前的打印任务；
	 */
	getJobPages() {
		return request("getJobPages", {});
	},
	//
	/**
	 * 设置后续绘制参数，譬如字体名称，二维码纠错级别等等；
	 * @param {{}} data 参数
	 * @param {string} name
	 * @param value
	 */
	setDrawParam(data) {
		return request("setDrawParam", data);
	},
	// /**
	//  * 获取当前内容的旋转角度；
	//  */
	// getItemOrientation() {
	// 	return request('getItemOrientation', {});
	// },
	/**
	 * 设置后续内容的旋转方向；
	 * @param { number | { orientation: [0, 90, 180, 270]}} data 参数；
	 */
	setItemOrientation(data) {
		data = typeof data === "object" ? data : { orientation: data };
		return request("setItemOrientation", data);
	},
	// /**
	//  * 获取当前的水平对齐方式；
	//  */
	// getItemHorizontalAlignment() {
	// 	return request('getItemHorizontalAlignment', {});
	// },
	/**
	 * 设置水平对齐方式；
	 * @param { number | { alignment: [0, 1, 2]}} data 参数；
	 */
	setItemHorizontalAlignment(data) {
		data = typeof data === "object" ? data : { alignment: data };
		return request("setItemHorizontalAlignment", data);
	},
	// /**
	//  * 获取当前的垂直对齐方式；
	//  */
	// getItemVerticalAlignment() {
	// 	return request('getItemVerticalAlignment', {});
	// },
	/**
	 * 设置垂直对齐方式；
	 * @param { number | { alignment: [0, 1, 2]}} data 参数；
	 */
	setItemVerticalAlignment(data) {
		data = typeof data === "object" ? data : { alignment: data };
		return request("setItemVerticalAlignment", data);
	},
	/**
	 * 设置背景色；
	 * 默认白色底色：0xFFFFFFFF；
	 * 如需透明色，可设置：0x00000000；
	 * @param { number | {color: number} } data 参数；
	 */
	setBackground(data) {
		data = typeof data === "object" ? data : { color: data };
		return request("setBackground", data);
	},

	// ***************************************************
	// * 打印相关图形对象。
	// ***************************************************

	/**
	 * 绘制字符串；
	 *
	 * @param {{}} data 				 		字符串绘制参数；
	 * @param {string} data.text		 		待打印的字符串名称；
	 * @param {number} data.x			 		字符串显示的X轴坐标位置(单位毫米)；
	 * @param {number} data.y			 		字符串显示的Y轴坐标位置(单位毫米)；
	 * @param {number} data.width		 		字符串显示区域宽度(单位毫米)；
	 * @param {number} data.height		 		字符串显示区域高度(单位毫米)；
	 * @param {number} data.fontHeight	 		字体大小(单位毫米);
	 * @param {number} data.fontStyle	 		字体样式，默认位0；（0：常规，1：黑体，2：斜体，3：粗斜体）
	 * @param {string} data.fontName	 		字体名称，默认位"黑体";
	 * @param {boolean} data.autoReturn	 		字符串长度超过width之后，是否自动换行？默认位true;
	 * @param {0|90|180|270} data.orientation	字符串旋转方向？默认以setItemOrientation为准；如果未调用该函数，则为0；
	 * @param {0|1|2} data.horizontalAlignment	字符串在指定的宽高范围内的水平对齐方式，默认以setItemHorizontalAlignment为准，未设置则为0，表示居上对齐，值可为：0、1、2，分别表示左、中、右对齐;
	 * @param {0|1|2} data.verticalAlignment	字符串在指定的宽高范围内的垂直对齐方式，默认以setItemVerticalAlignment为准，未设置则为0，表示居上对齐，值可为：0、1、2，分别表示上、中、下对齐;
	 * 
	 */
	drawText(data) {
		return request("drawText", data);
	},
	/**
	 * 绘制一维码；
	 * @param {{}} data 一维码绘制参数；
	 * @param {string} data.text,				一维码内容
	 * @param {number} data.x,					一维码在坐标系X轴上的位置；
	 * @param {number} data.y,					一维码在坐标系中Y轴上的位置；
	 * @param {number} data.width,				一维码在坐标系中的宽度；
	 * @param {number} data.height,				一维码高度；
	 * @param {number} data.textHeight,			一维码下面显示的字符串高度，不需要的话可以设置位0；
	 * @param {number} data.type				一维码类型：{@link BarcodeType}
	 * @param {0|90|180|270} data.orientation	字符串旋转方向？默认以setItemOrientation为准；如果未调用该函数，则为0；
	 * @param {0|1|2} data.horizontalAlignment	字符串在指定的宽高范围内的水平对齐方式，默认以setItemHorizontalAlignment为准，未设置则为0，表示居上对齐，值可为：0、1、2，分别表示左、中、右对齐;
	 * @param {0|1|2} data.verticalAlignment	字符串在指定的宽高范围内的垂直对齐方式，默认以setItemVerticalAlignment为准，未设置则为0，表示居上对齐，值可为：0、1、2，分别表示上、中、下对齐;
	 * 
	 * @typedef{{
	 *	UPC_A: 20,
	 *	UPC_E: 21,
	 *	EAN13: 22,
	 *	EAN8: 23,
	 *	CODE39: 24,
	 *	ITF25: 25,
	 *	CODABAR: 26,
	 *	CODE93: 27,
	 *	CODE128: 28,
	 *	ISBN: 29,
	 *	ECODE39: 30,
	 *	AUTO: 60,
	 * }} BarcodeType 一维码类型
	 */
	draw1DBarcode(data) {
		return request("draw1DBarcode", data);
	},
	/**
	 * 绘制二维码；
	 * @param {{}} data
	 * @param {string} data.text				二维码内容
	 * @param {number} data.x					X轴坐标位置(单位毫米)
	 * @param {number} data.y					Y轴坐标位置
	 * @param {number} data.width				二维码大小(单位毫米)
	 * @param {0|1|2|3} data.eccLevel			二维码纠错级别，0|1|2|3分别表示: L(低)|M(中)|Q(强)|H(高)，默认为0，表示最低纠错级别
	 * @param {0|90|180|270} data.orientation	字符串旋转方向？默认以setItemOrientation为准；如果未调用该函数，则为0，表示不进行任何旋转；
	 * @param {0|1|2} data.horizontalAlignment	字符串在指定的宽高范围内的水平对齐方式，默认以setItemHorizontalAlignment为准，未设置则为0，表示居上对齐，值可为：0、1、2，分别表示左、中、右对齐;
	 * @param {0|1|2} data.verticalAlignment	字符串在指定的宽高范围内的垂直对齐方式，默认以setItemVerticalAlignment为准，未设置则为0，表示居上对齐，值可为：0、1、2，分别表示上、中、下对齐;
	 */
	draw2DQRCode(data) {
		return request("draw2DQRCode", data);
	},
	/**
	 * 绘制PDF417码；
	 * @param {{}} data PDF417打印参数；
	 * @param {string} data.text 			打印内容
	 * @param {number} data.x				X轴坐标位置(单位毫米)
	 * @param {number} data.y				Y轴坐标位置(单位毫米)
	 * @param {number} data.width			绘制数据内容的宽度(单位毫米)
	 * @param {number} data.height			绘制数据内容的高度(单位毫米)
	 */
	// draw2DPdf417(data) {
	// 	return request("draw2DPdf417", data);
	// },
	/**
	 * 绘制矩形框；
	 * @param {{}} data
	 * @param {number} data.x					X轴坐标位置(单位毫米)
	 * @param {number} data.y					Y轴坐标位置(单位毫米)
	 * @param {number} data.width				绘制数据内容的宽度(单位毫米)
	 * @param {number} data.height				绘制数据内容的高度(单位毫米)
	 * @param {number} data.lineWidth			边框宽度(单位毫米)，默认为0.4mm
	 * @param {0|90|180|270} data.orientation	字符串旋转方向？默认以setItemOrientation为准；如果未调用该函数，则为0，表示不进行任何旋转；
	 */
	drawRectangle(data) {
		return request("drawRectangle", data);
	},
	/**
	 * 绘制填充矩形；
	 * @param {{}} data
	 * @param {number} data.x					X轴坐标位置(单位毫米)
	 * @param {number} data.y					Y轴坐标位置(单位毫米)
	 * @param {number} data.width				绘制数据内容的宽度(单位毫米)
	 * @param {number} data.height				绘制数据内容的高度(单位毫米)
	 * @param {0|90|180|270} data.orientation	字符串旋转方向？默认以setItemOrientation为准；如果未调用该函数，则为0，表示不进行任何旋转；
	 */
	fillRectangle(data) {
		return request("fillRectangle", data);
	},
	/**
	 * 绘制圆角矩形框；
	 * @param {{}} data
	 * @param {number} data.x					X轴坐标位置(单位毫米)
	 * @param {number} data.y					Y轴坐标位置(单位毫米)
	 * @param {number} data.width				绘制数据内容的宽度(单位毫米)
	 * @param {number} data.height				绘制数据内容的高度(单位毫米)
	 * @param {number} data.cornerWidth			圆角半径(单位毫米)
	 * @param {number} data.cornerHeight		圆角半径(单位毫米)
	 * @param {number} data.lineWidth			边框宽度(单位毫米)
	 * @param {0|90|180|270} data.orientation	字符串旋转方向？默认以setItemOrientation为准；如果未调用该函数，则为0，表示不进行任何旋转；
	 */
	drawRoundRectangle(data) {
		return request("drawRoundRectangle", data);
	},
	/**
	 * 填充圆角矩形；
	 * @param {{}} data
	 * @param {number} data.x					X轴坐标位置(单位毫米)
	 * @param {number} data.y					Y轴坐标位置(单位毫米)
	 * @param {number} data.width				绘制数据内容的宽度(单位毫米)
	 * @param {number} data.height				绘制数据内容的高度(单位毫米)
	 * @param {number} data.cornerWidth			圆角半径(单位毫米)
	 * @param {number} data.cornerHeight		圆角半径(单位毫米)
	 * @param {0|90|180|270} data.orientation	字符串旋转方向？默认以setItemOrientation为准；如果未调用该函数，则为0，表示不进行任何旋转；
	 */
	fillRoundRectangle(data) {
		return request("fillRoundRectangle", data);
	},
	/**
	 * 绘制椭圆；
	 * @param {{}} data
	 * @param {number} data.x					X轴坐标位置(单位毫米)
	 * @param {number} data.y					Y轴坐标位置(单位毫米)
	 * @param {number} data.width				绘制数据内容的宽度(单位毫米)
	 * @param {number} data.height				绘制数据内容的高度(单位毫米)
	 * @param {number} data.lineWidth			边框宽度(单位毫米)
	 * @param {0|90|180|270} data.orientation	字符串旋转方向？默认以setItemOrientation为准；如果未调用该函数，则为0，表示不进行任何旋转；
	 */
	drawEllipse(data) {
		return request("drawEllipse", data);
	},
	/**
	 * 填充椭圆；
	 * @param {{}} data
	 * @param {number} data.x					X轴坐标位置(单位毫米)
	 * @param {number} data.y					Y轴坐标位置(单位毫米)
	 * @param {number} data.width				绘制数据内容的宽度(单位毫米)
	 * @param {number} data.height				绘制数据内容的高度(单位毫米)
	 * @param {0|90|180|270} data.orientation	字符串旋转方向？默认以setItemOrientation为准；如果未调用该函数，则为0，表示不进行任何旋转；
	 */
	fillEllipse(data) {
		return request("fillEllipse", data);
	},
	/**
	 * 绘制圆形；
	 * @param {{}} data
	 * @param {number} data.x				圆心X轴坐标位置(单位毫米)
	 * @param {number} data.y				圆心Y轴坐标位置(单位毫米)
	 * @param {number} data.radius			圆半径(单位毫米)
	 * @param {number} data.lineWidth		边框宽度(单位毫米)
	 */
	drawCircle(data) {
		return request("drawCircle", data);
	},
	/**
	 * 填充圆；
	 * @param {{}} data
	 * @param {number} data.x				圆心X轴坐标位置(单位毫米)
	 * @param {number} data.y				圆心Y轴坐标位置(单位毫米)
	 * @param {number} data.radius			圆半径(单位毫米)
	 */
	fillCircle(data) {
		return request("fillCircle", data);
	},
	/**
	 * 绘制直线；
	 * @param {{}} data
	 * @param {number} data.x1					起点X轴坐标位置(单位毫米)
	 * @param {number} data.y1					起点Y轴坐标位置(单位毫米)
	 * @param {number} data.x2					终点X轴坐标位置(单位毫米)
	 * @param {number} data.y2					终点Y轴坐标位置(单位毫米)
	 * @param {number} data.lineWidth			线条宽度(单位毫米)
	 * @param {0|90|180|270} data.orientation	字符串旋转方向？默认以setItemOrientation为准；如果未调用该函数，则为0，表示不进行任何旋转；
	 */
	drawLine(data) {
		return request("drawLine", data);
	},
	/**
	 * 绘制虚线；
	 * @param {{}} data
	 * @param {number} data.x1					起点X轴坐标位置(单位毫米)
	 * @param {number} data.y1					起点Y轴坐标位置(单位毫米)
	 * @param {number} data.x2					终点X轴坐标位置(单位毫米)
	 * @param {number} data.y2					终点Y轴坐标位置(单位毫米)
	 * @param {number} data.dashLen[],			电话线线段长度数组(单位毫米)
	 * @param {number} data.lineWidth			线条宽度(单位毫米)
	 * @param {0|90|180|270} data.orientation	字符串旋转方向？默认以setItemOrientation为准；如果未调用该函数，则为0，表示不进行任何旋转；
	 */
	drawDashLine(data) {
		return request("drawDashLine", data);
	},
	/**
	 * 绘制图片；
	 * @param {{}} data
	 * @param {string} data.image
	 * @param {number} data.x					X轴坐标位置(单位毫米)
	 * @param {number} data.y					Y轴坐标位置(单位毫米)
	 * @param {number} data.width				绘制数据内容的宽度(单位毫米)
	 * @param {number} data.height				绘制数据内容的高度(单位毫米)
	 * @param {number} data.threshold			黑白转换阈值，默认是192
	 * @param {0|90|180|270} data.orientation	字符串旋转方向？默认以setItemOrientation为准；如果未调用该函数，则为0，表示不进行任何旋转；
	 */
	drawImage(data) {
		return request("drawImage", data);
	},
};

export default lpapi;


