import { toCanvas } from 'qrcode'
import type { QRCodeRenderersOptions } from 'qrcode'
import { cloneDeep } from 'lodash-es'
import type { ContentType, RenderQrCodeParams } from './typing'

export function renderQrCode({ canvas, content, width = 0, options: params = {} }: RenderQrCodeParams) {
    const options = cloneDeep(params)
    // 容错率，默认对内容少的二维码采用高容错率，内容多的二维码采用低容错率
    options.errorCorrectionLevel = options.errorCorrectionLevel || getErrorCorrectionLevel(content)

    return getOriginWidth(content, options).then((_width: number) => {
        options.scale = width === 0 ? undefined : (width / _width) * 4
        return toCanvas(canvas, content, options)
    })
}

// 得到原QrCode的大小，以便缩放得到正确的QrCode大小
function getOriginWidth(content: ContentType, options: QRCodeRenderersOptions) {
    const _canvas = document.createElement('canvas')
    return toCanvas(_canvas, content, options).then(() => _canvas.width)
}

// 对于内容少的QrCode，增大容错率
function getErrorCorrectionLevel(content: ContentType) {
    if (content.length > 36) {
        return 'M'
    } else if (content.length > 16) {
        return 'Q'
    } else {
        return 'H'
    }
}
