/**
 * 修改自https://github.com/song940/node-escpos/blob/master/commands.js
 * ESC/POS _ (Constants)
 */
const encode = require('./encoding');
var _ = {
	LF: [0x0a],
	FS: [0x1c],
	FF: [0x0c],
	GS: [0x1d],
	DLE: [0x10],
	EOT: [0x04],
	NUL: [0x00],
	ESC: [0x1b],
	EOL: '\n',
};

/**
 * [FEED_CONTROL_SEQUENCES Feed control sequences]
 * @type {Object}
 */
_.FEED_CONTROL_SEQUENCES = {
	CTL_LF: [0x0a], // Print and line feed
	CTL_GLF: [0x4a, 0x00], // Print and feed paper (without spaces between lines)
	CTL_FF: [0x0c], // Form feed
	CTL_CR: [0x0d], // Carriage return
	CTL_HT: [0x09], // Horizontal tab
	CTL_VT: [0x0b], // Vertical tab
};

_.CHARACTER_SPACING = {
	CS_DEFAULT: [0x1b, 0x20, 0x00],
	CS_SET: [0x1b, 0x20]
};

_.LINE_SPACING = {
	LS_DEFAULT: [0x1b, 0x32],
	LS_SET: [0x1b, 0x33],
	LS_ZERO: [0x1b, 0x00]
};

/**
 * [HARDWARE Printer hardware]
 * @type {Object}
 */
_.HARDWARE = {
	HW_INIT: [0x1b, 0x40], // Clear data in buffer and reset modes
	HW_SELECT: [0x1b, 0x3d, 0x01], // Printer select
	HW_RESET: [0x1b, 0x3f, 0x0a, 0x00], // Reset printer hardware
};

/**
 * [CASH_DRAWER Cash Drawer]
 * @type {Object}
 */
_.CASH_DRAWER = {
	CD_KICK_2: [0x1b, 0x70, 0x00], // Sends a pulse to pin 2 []
	CD_KICK_5: [0x1b, 0x70, 0x01], // Sends a pulse to pin 5 []
};

/**
 * [MARGINS Margins sizes]
 * @type {Object}
 */
_.MARGINS = {
	BOTTOM: [0x1b, 0x4f], // Fix bottom size
	LEFT: [0x1b, 0x6c], // Fix left size
	RIGHT: [0x1b, 0x51], // Fix right size
};

/**
 * [PAPER Paper]
 * @type {Object}
 */
_.PAPER = {
	PAPER_FULL_CUT: [0x1d, 0x56, 0x00], // Full cut paper
	PAPER_PART_CUT: [0x1d, 0x56, 0x01], // Partial cut paper
	PAPER_CUT_A: [0x1d, 0x56, 0x41], // Partial cut paper
	PAPER_CUT_B: [0x1d, 0x56, 0x42], // Partial cut paper
};

/**
 * [TEXT_FORMAT Text format]
 * @type {Object}
 */
_.TEXT_FORMAT = {
	TXT_NORMAL: [0x1b, 0x21, 0x00], // Normal text
	TXT_2HEIGHT: [0x1b, 0x21, 0x10], // Double height text
	TXT_2WIDTH: [0x1b, 0x21, 0x20], // Double width text
	TXT_4SQUARE: [0x1b, 0x21, 0x30], // Double width & height text

	TXT_UNDERL_OFF: [0x1b, 0x2d, 0x00], // Underline font OFF
	TXT_UNDERL_ON: [0x1b, 0x2d, 0x01], // Underline font 1-dot ON
	TXT_UNDERL2_ON: [0x1b, 0x2d, 0x02], // Underline font 2-dot ON
	TXT_BOLD_OFF: [0x1b, 0x45, 0x00], // Bold font OFF
	TXT_BOLD_ON: [0x1b, 0x45, 0x01], // Bold font ON
	TXT_ITALIC_OFF: [0x1b, 0x35], // Italic font ON
	TXT_ITALIC_ON: [0x1b, 0x34], // Italic font ON

	TXT_FONT_A: [0x1b, 0x4d, 0x00], // Font type A
	TXT_FONT_B: [0x1b, 0x4d, 0x01], // Font type B
	TXT_FONT_C: [0x1b, 0x4d, 0x02], // Font type C

	TXT_ALIGN_LT: [0x1b, 0x61, 0x00], // Left justification
	TXT_ALIGN_CT: [0x1b, 0x61, 0x01], // Centering
	TXT_ALIGN_RT: [0x1b, 0x61, 0x02], // Right justification
};

/**
 * [BARCODE_FORMAT Barcode format]
 * @type {Object}
 */
_.BARCODE_FORMAT = {
	BARCODE_TXT_OFF: [0x1d, 0x48, 0x00], // HRI barcode chars OFF
	BARCODE_TXT_ABV: [0x1d, 0x48, 0x01], // HRI barcode chars above
	BARCODE_TXT_BLW: [0x1d, 0x48, 0x02], // HRI barcode chars below
	BARCODE_TXT_BTH: [0x1d, 0x48, 0x03], // HRI barcode chars both above and below

	BARCODE_FONT_A: [0x1d, 0x66, 0x00], // Font type A for HRI barcode chars
	BARCODE_FONT_B: [0x1d, 0x66, 0x01], // Font type B for HRI barcode chars

	BARCODE_HEIGHT: function(height) { // Barcode Height [1-255]
		return [0x1d, 0x68, height];
	},
	BARCODE_WIDTH: function(width) { // Barcode Width  [2-6]
		return [0x1d, 0x77, width];
	},
	BARCODE_HEIGHT_DEFAULT: [0x1d, 0x68, 0x64], // Barcode height default:100
	BARCODE_WIDTH_DEFAULT: [0x1d, 0x77, 0x01], // Barcode width default:1

	BARCODE_UPC_A: [0x1d, 0x6b, 0x00], // Barcode type UPC-A
	BARCODE_UPC_E: [0x1d, 0x6b, 0x01], // Barcode type UPC-E
	BARCODE_EAN13: [0x1d, 0x6b, 0x02], // Barcode type EAN13
	BARCODE_EAN8: [0x1d, 0x6b, 0x03], // Barcode type EAN8
	BARCODE_CODE39: [0x1d, 0x6b, 0x04], // Barcode type CODE39
	BARCODE_ITF: [0x1d, 0x6b, 0x05], // Barcode type ITF
	BARCODE_NW7: [0x1d, 0x6b, 0x06], // Barcode type NW7
	BARCODE_CODE93: [0x1d, 0x6b, 0x48], // Barcode type CODE93
	BARCODE_CODE128: [0x1d, 0x6b, 0x49], // Barcode type CODE128
};

/**
 * [QRCODE_FORMAT qrcode format二维码]
 * @type {Object}
 */
_.QRCODE_FORMAT = {
	QRCODE_SIZE: function(n) { // 设置二维码大小
		let data = [29, 40, 107, 3, 0, 49, 67]
		if (n > 15) {
			n = 15
		}
		if (n < 1) {
			n = 1
		}
		data.push(n)
		return data;
	},
	QRCODE_ERROR: function(n) { // 设置纠错等级
		/*
		n      功能      纠错能力
		48 选择纠错等级 L 7
		49 选择纠错等级 M 15
		50 选择纠错等级 Q 25
		51 选择纠错等级 H 30
		*/
		let data = [29, 40, 107, 3, 0, 49, 69]
		data.push(n)
		return data;
	},
	QRCODE_DATA: function(content) { // 设置二维码内容
		let data = [29, 40, 107]
		var code = new encode.TextEncoder(
			'gb18030', {
				NONSTANDARD_allowLegacyEncoding: true
			}).encode(content)
		data.push(parseInt((code.length + 3) % 256))
		data.push(parseInt((code.length + 3) / 256))
		data.push(49)
		data.push(80)
		data.push(48)

		for (var i = 0; i < code.length; ++i) {
			data.push(code[i])
		}
		return data;
	},
	QRCODE_PRINT: [29, 40, 107, 3, 0, 49, 81, 48], // 打印二维码

};
/**
 * [IMAGE_FORMAT Image format]
 * @type {Object}
 */
_.IMAGE_FORMAT = {
	S_RASTER_N: [0x1d, 0x76, 0x30, 0x00], // Set raster image normal size
	S_RASTER_2W: [0x1d, 0x76, 0x30, 0x01], // Set raster image double width
	S_RASTER_2H: [0x1d, 0x76, 0x30, 0x02], // Set raster image double height
	S_RASTER_Q: [0x1d, 0x76, 0x30, 0x03], // Set raster image quadruple
};

/**
 * [BITMAP_FORMAT description]
 * @type {Object}
 */
_.BITMAP_FORMAT = {
	BITMAP_S8: [0x1b, 0x2a, 0x00],
	BITMAP_D8: [0x1b, 0x2a, 0x01],
	BITMAP_S24: [0x1b, 0x2a, 0x20],
	BITMAP_D24: [0x1b, 0x2a, 0x21]
};

/**
 * [GSV0_FORMAT description]
 * @type {Object}
 */
_.GSV0_FORMAT = {
	GSV0_NORMAL: [0x1d, 0x76, 0x30, 0x00],
	GSV0_DW: [0x1d, 0x76, 0x30, 0x01],
	GSV0_DH: [0x1d, 0x76, 0x30, 0x02],
	GSV0_DWDH: [0x1d, 0x76, 0x30, 0x03]
};

/**
 * [BEEP description]
 * @type {string}
 */
_.BEEP = [0x1b, 0x42]; // Printer Buzzer pre hex

/**
 * [COLOR description]
 * @type {Object}
 */

_.COLOR = {
	0: [0x1b, 0x72, 0x00], // black
	1: [0x1b, 0x72, 0x01] // red
};

/**
 * [exports description]
 * @type {[type]}
 */
module.exports = _;