package qrcode

// 生成登录二维码图片

import (
	"errors"
	"image"
	"image/jpeg"
	"image/png"
	"os"
	"path/filepath"
	"strings"

	"github.com/boombuler/barcode"
	"github.com/boombuler/barcode/qr"
)

func SaveJpegFile(filePath, content string, edges ...int) error {
	edgeLen := 300
	if len(edges) > 0 && edges[0] > 100 && edges[0] < 2000 {
		edgeLen = edges[0]
	}
	img, _ := qr.Encode(content, qr.L, qr.Unicode)
	img, _ = barcode.Scale(img, edgeLen, edgeLen)

	return writeFile(filePath, img, "jpg")
}

func SavePngFile(filePath, content string, edges ...int) error {
	edgeLen := 300
	if len(edges) > 0 && edges[0] > 100 && edges[0] < 2000 {
		edgeLen = edges[0]
	}
	img, _ := qr.Encode(content, qr.L, qr.Unicode)
	img, _ = barcode.Scale(img, edgeLen, edgeLen)

	return writeFile(filePath, img, "png")
}

func writeFile(filePath string, img image.Image, format string) error {
	if err := createDir(filePath); err != nil {
		return err
	}
	file, err := os.Create(filePath)
	defer file.Close()
	if err != nil {
		return err
	}
	switch strings.ToLower(format) {
	case "png":
		err = png.Encode(file, img)
		break
	case "jpg":
		err = jpeg.Encode(file, img, nil)
	default:
		return errors.New("format not accept")
	}
	if err != nil {
		return err
	}
	return nil
}

func createDir(filePath string) error {
	var err error
	// filePath, _ = filepath.Abs(filePath)
	dirPath := filepath.Dir(filePath)
	dirInfo, err := os.Stat(dirPath)
	if err != nil {
		if !os.IsExist(err) {
			err = os.MkdirAll(dirPath, 0777)
			if err != nil {
				return err
			}
		} else {
			return err
		}
	} else {
		if dirInfo.IsDir() {
			return nil
		}
		return errors.New("directory is a file")
	}
	return nil
}