/*
 * *********************************************************************************************************************
 *
 *          !!
 *        .F88X
 *        X8888Y
 *      .}888888N;
 *        i888888N;        .:!              .I$WI:
 *          R888888I      .'N88~            i8}+8Y&8"l8i$8>8W~'>W8}8]KW+8IIN"8&
 *          .R888888I    .;N8888~          .X8'  "8I.!,/8"  !%NY8`"8I8~~8>,88I
 *            +888888N;  .8888888Y                                  "&&8Y.}8,
 *            ./888888N;  .R888888Y        .'}~    .>}'.`+>  i}!    "i'  +/'  .'i~  !11,.:">,  .~]!  .i}i
 *              ~888888%:  .I888888l      .]88~`1/iY88Ii+1'.R$8$8]"888888888>  Y8$  W8E  X8E  W8888'188Il}Y88$*
 *              18888888    E8888881    .]W%8$`R8X'&8%++N8i,8N%N8+l8%`  .}8N:.R$RE%N88N%N$K$R  188,FE$8%~Y88I
 *            .E888888I  .i8888888'      .:$8I;88+`E8R:/8N,.>881.`$8E/1/]N8X.Y8N`"KF&&FK!'88*."88K./$88%RN888+~
 *            8888888I  .,N888888~        ~88i"8W,!N8*.I88.}888%F,i$88"F88"  888:E8X.>88!i88>`888*.}Fl1]*}1YKi'
 *          i888888N'      I888Y          ]88;/EX*IFKFK88X  K8R  .l8W  88Y  ~88}'88E&%8W.X8N``]88!.$8K  .:W8I
 *        .i888888N;        I8Y          .&8$  .X88!  i881.:%888>I88  ;88]  +88+.';;;;:.Y88X  18N.,88l  .+88/
 *      .:R888888I
 *      .&888888I                                          Copyright (c) 2009-2020.  博锐尚格科技股份有限公司
 *        ~8888'
 *        .!88~                                                                     All rights reserved.
 *
 * *********************************************************************************************************************
 */

package com.persagy.server.utils

import com.google.zxing.BarcodeFormat
import com.google.zxing.EncodeHintType
import com.google.zxing.WriterException
import com.google.zxing.qrcode.QRCodeWriter
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel
import java.awt.image.BufferedImage
import java.util.*

/**
 * 二维码生成工具
 *
 * @author  Andy
 */
object QrCodeUntils {

    var bgColor = 0xFFFFFF
    var pixelColor = 0x0

    /**
     * 创建二维码图像
     *
     * @param   contents        二维码存储的内容
     * @param   size            二维码大小
     * @return  二维码图像
     */
    fun createQrCode(contents: String, size: Int, logo: BufferedImage? = null): BufferedImage? {
        try {
            val hints = Hashtable<EncodeHintType, Any>()
            hints[EncodeHintType.CHARACTER_SET] = "utf-8"
            hints[EncodeHintType.ERROR_CORRECTION] = ErrorCorrectionLevel.L

            val matrix = QRCodeWriter().encode(contents, BarcodeFormat.QR_CODE, size, size, hints)
            var image = BufferedImage(size, size, BufferedImage.TYPE_INT_RGB)
            for (y in 0 until size) {
                for (x in 0 until size) {
                    if (matrix.get(x, y)) {
                        image.setRGB(x, y, pixelColor)
                    } else {
                        image.setRGB(x, y, bgColor)
                    }
                }
            }

            if (null != logo) {
                image = addLogo(image, logo)
            }

            return image
        } catch (e: WriterException) {
            e.printStackTrace()
        }
        return null
    } // Function createQrCode()

    /**
     * 为二维码图片增加Logo
     *
     * @param   src         二维码图片
     * @param   logo        Logol图片
     * @return  添加过Logo的二维码图片
     */
    private fun addLogo(src: BufferedImage, logo: BufferedImage): BufferedImage {
        val srcWidth = src.width
        val srcHeight = src.height
        val logoWidth = logo.width
        val logoHeight = logo.height


        val image = BufferedImage(srcWidth, srcHeight, BufferedImage.TYPE_4BYTE_ABGR)
        val gd = image.createGraphics()
        gd.drawImage(src,0,0, null)
        gd.drawImage(logo,srcWidth * 2 / 5, srcHeight * 2 / 5, srcWidth * 3 / 5, srcHeight / 5, null)

        return image
    } // Function addLogo()
} // Object QrCodeUntils