package utils

import (
	"bytes"
	"encoding/base64"
	"fmt"
	"github.com/nfnt/resize"
	"github.com/skip2/go-qrcode"
	"image"
	"image/draw"
	"image/jpeg"
	"image/png"
	"net/http"
)

func CreateQr(content string, logoUrl string, level qrcode.RecoveryLevel, size int) (qr string, err error) {
	emptyBuff, err := CreateQrBase(content, logoUrl, level, size)

	if err != nil {
		return "", err
	}

	return string(emptyBuff.Bytes()), nil
	//return "data:image/png;base64," + base64.StdEncoding.EncodeToString(emptyBuff.Bytes()), nil
}

func CreateQrBase64(content string, logoUrl string) (qr string, err error) {

	emptyBuff, err := CreateQrBase(content, logoUrl, qrcode.Low, 120)
	if err != nil {
		return "", err
	}

	//return string(emptyBuff.Bytes()), nil
	return "data:image/png;base64," + base64.StdEncoding.EncodeToString(emptyBuff.Bytes()), nil
}

func CreateQrBase(content string, logoUrl string, level qrcode.RecoveryLevel, size int) (emptyBuff *bytes.Buffer, err error) {
	emptyBuff = bytes.NewBuffer(nil) //开辟一个新的空buff

	qrC, err := qrcode.New(content, level)
	img := qrC.Image(size)

	if err != nil {
		return
	}

	total := image.NewRGBA(img.Bounds()) //设置背景
	draw.Draw(total, total.Bounds(), img, img.Bounds().Min, draw.Over)

	if logoUrl != "" { //是否有logo
		v, err := http.Get(logoUrl)
		if err != nil {
			fmt.Printf("Http get [%v] failed! %v", logoUrl, err)
			return emptyBuff, err
		}
		defer v.Body.Close()

		icoImg2, err := png.Decode(v.Body)
		if err != nil {
			return nil, err
		}

		icoImg := resize.Resize(54, 52, icoImg2, resize.Lanczos3)

		icoImgPnt := image.Point{X: (total.Bounds().Size().X - icoImg.Bounds().Size().X) / -2, Y: (total.Bounds().Size().Y - icoImg.Bounds().Size().Y) / -2}
		draw.DrawMask(total, total.Bounds(), icoImg, icoImgPnt, nil, image.Point{}, draw.Src)
	}

	err = jpeg.Encode(emptyBuff, total, nil)
	if err != nil {
		return emptyBuff, err
	}
	return emptyBuff, nil
}