const barcodes = require('./barcodes/index.js')['default'];
let barcode = {};
(function () {
    // 初始化
    barcode = function (cont, ctxid, options, ctxsize, result) {
        let ops = {}, newOptions, encodings, globaContext, ctx, globaCtxid, cbCanvasSize, cbResult;
        globaCtxid = ctxid
        cbCanvasSize = ctxsize
        cbResult = result
        newOptions = Object.assign(ops, options);
        // 修成margin
        fixMargin(newOptions)
        // 处理options 数据
        if (newOptions.text == '' || cont == '') {
            return false
        }
        // 获取ctx
        globaContext = cont
        ctx = uni.createCanvasContext(globaCtxid, globaContext)
        // 获取编码数据
        encodings = new barcodes[newOptions.format.toUpperCase()](newOptions.text, newOptions).encode()
        let fixencodings = fixEncodings(encodings, newOptions)
        // 返回canvas实际大小
        cbCanvasSize({ width: fixencodings.width, height: fixencodings.height })
        // 绘制canvas
        setTimeout(() => {
            drawCanvas.render(newOptions, fixencodings)
        }, 50);
        // 绘制canvas
        let drawCanvas = {
            render(options, encoding) {
                this.prepare(options, encoding)
                encoding.encodings.forEach((v, i) => {
                    this.barcode(options, v)
                    this.text(options, v)
                    this.move(v)
                });
                this.draw(options, encoding)
            },
            barcode(options, encoding) {
                let binary = encoding.data;
                let yFrom;
                if (options.textPosition == "top") {
                    yFrom = options.marginTop + options.fontSize + options.textMargin;
                } else {
                    yFrom = options.marginTop;
                }
                // 绘制条码
                ctx.fillStyle = options.lineColor;
                for (let b = 0; b < binary.length; b++) {
                    let x = b * options.width + encoding.barcodePadding;
                    let height = options.height
                    if (encoding.options) {
                        if (encoding.options.height != undefined) {
                            height = encoding.options.height
                        }
                    }
                    if (binary[b] === "1") {
                        ctx.fillRect(x, yFrom, options.width, height);
                    } else if (binary[b]) {
                        ctx.fillRect(x, yFrom, options.width, height * binary[b]);
                    }
                }
            },
            text(options, encoding) {
				return
                if (options.displayValue) {
                    let x, y, align, size;
                    if (options.textPosition == "top") {
                        y = options.marginTop + options.fontSize;
                    } else {
                        y = options.height + options.textMargin + options.marginTop + options.fontSize;
                    }
                    if (encoding.options) {
                        if (encoding.options.textAlign != undefined) {
                            align = encoding.options.textAlign
                        }
                        if (encoding.options.fontSize != undefined) {
                            size = encoding.options.fontSize
                        }
                    } else {
                        align = options.textAlign
                        size = options.fontSize
                    }
                    ctx.setFontSize(size)
                    if (align == "left" || encoding.barcodePadding > 0) {
                        x = 0;
                        ctx.setTextAlign('left')
                    } else if (align == "right") {
                        x = encoding.width - 1;
                        ctx.setTextAlign('right')
                    }
                    else {
                        x = encoding.width / 2;
                        ctx.setTextAlign('center');
                    }
                    ctx.fillStyle = options.fontColor;
                    if (encoding.text != undefined) {
                        ctx.fillText(encoding.text, x, y);
                    }
                }
            },
            move(encoding) {
                ctx.translate(encoding.width, 0);
            },
            prepare(options, encoding) {
                // 绘制背景
                if (options.background) {
                    ctx.fillStyle = options.background;
                    ctx.fillRect(0, 0, encoding.width, encoding.height);
                }
                ctx.translate(options.marginLeft, 0);
            },
            draw(options, encoding) {
                ctx.draw(false, () => {
                    this.toImgs(options, encoding)
                })
            },
            toImgs(options, encoding) {
                setTimeout(() => {
                    uni.canvasToTempFilePath({
                        width: encoding.width,
                        height: encoding.height,
                        destWidth: encoding.width,
                        destHeight: encoding.height,
                        canvasId: globaCtxid,
                        fileType: 'png',
                        success: function (res) {
                            cbResult(res.tempFilePath)
                        },
                        fail: function (res) {
                            cbResult(res)
                        },
                        complete: function () {
                            uni.hideLoading();
                        },
                    }, globaContext);
                }, options.text.length + 100);
            }
        }
        // 混入canvas数据
        function fixEncodings(encoding, options) {
            let encodingArr = [], width = options.marginLeft + options.marginRight, height;
            if (!Array.isArray(encoding)) {
                encodingArr[0] = JSON.parse(JSON.stringify(encoding))
            } else {
                encodingArr = [...encoding]
            }
            encodingArr.forEach((v, i) => {
                // 获取文本宽度
                let textWidth = ctx.measureText(encodingArr[i].text ? encodingArr[i].text : '').width;
                // 获取条形码宽度
                let barcodeWidth = encodingArr[i].data.length * options.width;
                // 获取内边距
                let barcodePadding = 0;
                if (options.displayValue && barcodeWidth < textWidth) {
                    if (options.textAlign == "center") {
                        barcodePadding = Math.floor((textWidth - barcodeWidth) / 2);
                    } else if (options.textAlign == "left") {
                        barcodePadding = 0;
                    } else if (options.textAlign == "right") {
                        barcodePadding = Math.floor(textWidth - barcodeWidth);
                    }
                }
                // 混入encodingArr[i]
                encodingArr[i].barcodePadding = barcodePadding
                encodingArr[i].width = Math.ceil(Math.max(textWidth, barcodeWidth))
                width += encodingArr[i].width
                if (encodingArr[i].options) {
                    if (encodingArr[i].options.height != undefined) {
                        encodingArr[i].height = encodingArr[i].options.height + (options.displayValue && (encodingArr[i].text ? encodingArr[i].text : '').length > 0 ? options.fontSize + options.textMargin : 0) + options.marginTop + options.marginBottom;
                    } else {
                        encodingArr[i].height = height = options.height + (options.displayValue && (encodingArr[i].text ? encodingArr[i].text : '').length > 0 ? options.fontSize + options.textMargin : 0) + options.marginTop + options.marginBottom;
                    }
                } else {
                    encodingArr[i].height = height = options.height + (options.displayValue && (encodingArr[i].text ? encodingArr[i].text : '').length > 0 ? options.fontSize + options.textMargin : 0) + options.marginTop + options.marginBottom;
                }
            });
            return { encodings: encodingArr, width, height };
        }
        // 修正Margin
        function fixMargin(options) {
            options.marginTop = options.marginTop == undefined ? options.margin : options.marginTop;
            options.marginBottom = options.marginBottom == undefined ? options.margin : options.marginBottom;
            options.marginRight = options.marginRight == undefined ? options.margin : options.marginRight;
            options.marginLeft = options.marginLeft == undefined ? options.margin : options.marginLeft;
        }
    };
})()

export default barcode