package qr

import (
	"errors"
	"fmt"
	"fonchain-fiee/cmd/config"
	"fonchain-fiee/pkg/common/utils"
	"fonchain-fiee/pkg/service"
	"github.com/gin-gonic/gin"
	"github.com/gin-gonic/gin/binding"
	"github.com/skip2/go-qrcode"
	"net/url"
)

// CreateQr 直接生成二维码
func Upload(c *gin.Context) {

	realUrl := c.Query("url")
	logo := c.Query("logo")
	if realUrl == "" {
		service.Error(c, errors.New("not real url"))
		return
	}

	realUrl, err := url.QueryUnescape(realUrl)
	if err != nil {
		service.Error(c, errors.New("url解码错误"))
		return
	}

	logo, err = url.QueryUnescape(logo)
	if err != nil {
		service.Error(c, errors.New("logo解码错误"))
		return
	}

	fmt.Println("url真实连接是-------", realUrl)
	s, err := utils.CreateQr(realUrl, logo, qrcode.Medium, 120)
	if err != nil {
		service.Error(c, err)
		return
	}

	c.Writer.Header().Set("content-type", "image/apng")
	if _, err = c.Writer.WriteString(s); err != nil {
		service.Error(c, err)
		return
	}

	return
}

// CreateQr 直接生成二维码
func CreateQr(c *gin.Context) {

	type AuctionBuyListTemp struct {
		Url   string `form:"url"`
		Logo  string `form:"logo"`
		Size  int    `form:"size" default:"120"`
		Level int    `form:"level" default:"1"`
	}

	var tempReq AuctionBuyListTemp

	if err := c.ShouldBindWith(&tempReq, binding.Query); err != nil {
		service.Error(c, err)
		return
	}

	fmt.Println(tempReq)
	realUrl := tempReq.Url
	logo := tempReq.Logo
	if realUrl == "" {
		service.Error(c, errors.New("not real url"))
		return
	}

	if tempReq.Level > int(qrcode.Highest) {
		tempReq.Level = int(qrcode.Highest)
	}

	if tempReq.Level > int(qrcode.Low) {
		tempReq.Level = int(qrcode.Low)
	}

	realUrl, err := url.QueryUnescape(realUrl)
	if err != nil {
		service.Error(c, errors.New("url解码错误"))
		return
	}

	logo, err = url.QueryUnescape(logo)
	if err != nil {
		service.Error(c, errors.New("logo解码错误"))
		return
	}

	fmt.Println("url真实连接是-------", realUrl)
	s, err := utils.CreateQr(realUrl, logo, qrcode.RecoveryLevel(tempReq.Level), tempReq.Size)
	if err != nil {
		service.Error(c, err)
		return
	}

	c.Writer.Header().Set("content-type", "image/apng")
	if _, err = c.Writer.WriteString(s); err != nil {
		service.Error(c, err)
		return
	}

	return
}

// CreateRedirectQr 生成重定向二维码
func CreateRedirectQr(c *gin.Context) {

	realUrl := c.Query("url")
	logo := c.Query("logo")
	if realUrl == "" {
		service.Error(c, errors.New("not real url"))
		return
	}

	s, err := utils.CreateQr(config.AppConfig.System.Host+config.AppConfig.System.RedirectUri+"?base_redirect_url="+url.QueryEscape(realUrl), logo, qrcode.Low, 120)
	if err != nil {
		service.Error(c, err)
		return
	}

	c.Writer.Header().Set("content-type", "image/apng")
	if _, err = c.Writer.WriteString(s); err != nil {
		service.Error(c, err)
		return
	}

	return
}

// CreateQrBase64 直接生成二维码
func CreateQrBase64(c *gin.Context) {

	realUrl := c.Query("url")
	logo := c.Query("logo")
	if realUrl == "" {
		service.Error(c, errors.New("not real url"))
		return
	}

	s, err := utils.CreateQrBase64(realUrl, logo)
	if err != nil {
		service.Error(c, err)
		return
	}

	c.Writer.Header().Set("content-type", "image/apng")
	if _, err = c.Writer.WriteString(s); err != nil {
		service.Error(c, err)
		return
	}

	return
}

// CreateRedirectQrBase64 生成重定向二维码
func CreateRedirectQrBase64(c *gin.Context) {

	realUrl := c.Query("url")
	logo := c.Query("logo")
	if realUrl == "" {
		service.Error(c, errors.New("not real url"))
		return
	}

	s, err := utils.CreateQrBase64(config.AppConfig.System.Host+config.AppConfig.System.RedirectUri+"?base_redirect_url="+url.QueryEscape(realUrl), logo)
	if err != nil {
		service.Error(c, err)
		return
	}

	c.Writer.Header().Set("content-type", "image/apng")
	if _, err = c.Writer.WriteString(s); err != nil {
		service.Error(c, err)
		return
	}

	return
}