package utils

import (
	"bytes"
	"fmt"
	"github.com/nfnt/resize"
	"go.uber.org/zap"
	"image"
	"image/jpeg"
	"os"
)

const (
	CompressLimit      = 1024 * 1024 * 1
	MaxHeight     uint = 600
)

// CompressJPG 压缩图片,并返回缩略图路径
func CompressJPG(dst string, newDst string) (err error) {
	filebytes, err := os.ReadFile(dst)
	if err != nil {
		return err
	}
	compressbytes := compressImageResource(filebytes)
	fo, err := os.Create(newDst)
	defer fo.Close()
	if err != nil {
		return err
	}
	_, err = fo.Write(compressbytes)
	if err != nil {
		return err
	}
	return nil
}

func compressImageResource(data []byte) []byte {
	if len(data) < CompressLimit {
		return data
	}
	img, _, err := image.Decode(bytes.NewReader(data))
	if err != nil {
		return data
	}
	m := resize.Resize(0, MaxHeight, img, resize.Lanczos3)
	buf := bytes.Buffer{}

	err = jpeg.Encode(&buf, m, &jpeg.Options{Quality: 100})
	if err != nil {
		zap.L().Error("compressImageResource Encode err", zap.Error(err))
		return data
	}
	if buf.Len() > len(data) {
		return data
	}
	fmt.Println(buf.Len())
	if buf.Len() >= CompressLimit {
		bytes := compressImageResource(buf.Bytes())
		return bytes
	}
	return buf.Bytes()
}