import _ from './commands'
import gbk_build from './gbk'

const PrinterJobs = function () {
	this._queue = Array.from(_.HARDWARE.HW_INIT);
	this._enqueue = function (cmd) {
		this._queue.push.apply(this._queue, cmd);
	}
}

/**
 * 增加打印内容
 * @param  {string} content  文字内容
 */
PrinterJobs.prototype.text = function (content) {
	if (content) {
		let uint8Array = gbk_build.encode(content);
		let encoded = Array.from(uint8Array);
		this._enqueue(encoded);
	}
	return this;
}

/**
 * 打印文字
 * @param  {string} content  文字内容
 */
PrinterJobs.prototype.print = function (content) {
	this.text(content);
	this._enqueue(_.LF);
	return this;
}


/**
 * 打印条形码
 * @param  {string} content  打印条形码
 */
PrinterJobs.prototype.printQrFormat = function (code) {
	// 段前40点高度
	this._enqueue([27,74,40])
	// 居中
	this._enqueue([27,97,1])
	// 在一维码下面添加编号
	this._enqueue([29, 72, 2])
	// 条形码高度
	this._enqueue([29, 104, 140])
	// 条形码宽度
	this._enqueue([29, 119, 2])
	// 打印类型
	this._enqueue([29, 107, 72, code.length])
	return this;
}


PrinterJobs.prototype.printArrayP = function (num) {
	this._enqueue([27,74,num])
	return this
}



/**
 * 打印文字并换行
 * @param  {string}  content  文字内容
 */
PrinterJobs.prototype.println = function (content = '') {
	return this.print(content + _.EOL)
}

/**
 * 设置对齐方式
 * @param {string} align 对齐方式 LT/CT/RT
 */
PrinterJobs.prototype.setAlign = function (align) {
	this._enqueue(_.TEXT_FORMAT['TXT_ALIGN_' + align.toUpperCase()])
	return this
}

/**
 * 设置字体
 * @param  {string} family A/B/C
 */
PrinterJobs.prototype.setFont = function (family) {
	this._enqueue(_.TEXT_FORMAT['TXT_FONT_' + family.toUpperCase()])
	return this
}

/**
 * 设定字体尺寸
 * @param  {number} width 字体宽度 1~2
 * @param  {number} height 字体高度 1~2
 */
PrinterJobs.prototype.setSize = function (width, height) {
	if (2 >= width && 2 >= height) {
		this._enqueue(_.TEXT_FORMAT.TXT_NORMAL)
		if (2 === width && 2 === height) {
			this._enqueue(_.TEXT_FORMAT.TXT_4SQUARE)
		} else if (1 === width && 2 === height) {
			this._enqueue(_.TEXT_FORMAT.TXT_2HEIGHT)
		} else if (2 === width && 1 === height) {
			this._enqueue(_.TEXT_FORMAT.TXT_2WIDTH)
		}
	}
	return this
}

/**
 * 设定字体是否加粗
 * @param  {boolean} bold
 */
PrinterJobs.prototype.setBold = function (bold) {
	if (typeof bold !== 'boolean') {
		bold = true;
	}
	this._enqueue(bold ? _.TEXT_FORMAT.TXT_BOLD_ON : _.TEXT_FORMAT.TXT_BOLD_OFF)
	return this
}

/**
 * 设定是否开启下划线
 * @param  {boolean} underline
 */
PrinterJobs.prototype.setUnderline = function (underline) {
	if (typeof underline !== 'boolean') {
		underline = true
	}
	this._enqueue(underline ? _.TEXT_FORMAT.TXT_UNDERL_ON : _.TEXT_FORMAT.TXT_UNDERL_OFF)
	return this
}

/**
 * 设置行间距为 n 点行,默认值行间距是 30 点
 * @param {number} n 0≤n≤255
 */
PrinterJobs.prototype.setLineSpacing = function (n) {
	if (n === undefined || n === null) {
		this._enqueue(_.LINE_SPACING.LS_DEFAULT)
	} else {
		this._enqueue(_.LINE_SPACING.LS_SET)
		this._enqueue([n])
	}
	return this
}

/**
 * 打印空行
 * @param {number} n
 */
PrinterJobs.prototype.lineFeed = function (n = 1) {
	return this.print(new Array(n).fill(_.EOL).join(''))
}

/**
 *  设置字体颜色，需要打印机支持
 *  @param  {number} color - 0 默认颜色黑色 1 红色
 */
PrinterJobs.prototype.setColor = function (color) {
	this._enqueue(_.COLOR[color === 1 ? 1 : 0])
	return this
}

/**
 * https://support.loyverse.com/hardware/printers/use-the-beeper-in-a-escpos-printers
 * 蜂鸣警报，需要打印机支持
 * @param  {number} n    蜂鸣次数,1-9
 * @param  {number} t 蜂鸣长短,1-9
 */
PrinterJobs.prototype.beep = function (n, t) {
	this._enqueue(_.BEEP)
	this._enqueue([n, t])
	return this
}

/**
 * 清空任务
 */
PrinterJobs.prototype.clear = function () {
	this._queue = Array.from(_.HARDWARE.HW_INIT);
	return this
}

/**
 * 返回ArrayBuffer
 */
PrinterJobs.prototype.buffer = function () {
	return new Uint8Array(this._queue).buffer
}

export default PrinterJobs
