package common

/**
 * @Author:yk
 * @Date: 2024/01/19
 * @Desc: 缓存方法，文件读取写入方法
 */
import (
	"encoding/base64"
	"fmt"
	"github.com/coocood/freecache"
	"os"
	"path/filepath"
	"runtime/debug"
	"strings"
	"sync"
)

var (
	instance *freecache.Cache
	mu       sync.Mutex
)

// GetInstance 返回单例缓存对象
func GetInstance() *freecache.Cache {
	if instance == nil {
		mu.Lock()
		defer mu.Unlock()
		if instance == nil {
			cacheSize := 100 * 1024 * 1024
			cache := freecache.NewCache(cacheSize)
			instance = cache
		}
	}
	return instance
}

// SetCache 设置缓存，默认过期时间为60秒
func SetCache(k string, v string) {
	SetCacheWithExpire(k, v, 60)
}

// SetCacheWithExpire 设置缓存
func SetCacheWithExpire(k string, v string, t int) {
	debug.SetGCPercent(20)
	key := []byte(k)
	val := []byte(v)
	GetInstance().Set(key, val, t)
}

// GetCache 获取缓存
func GetCache(k string) string {
	key := []byte(k)
	got, err := GetInstance().Get(key)
	if err != nil {
		fmt.Printf(GenLogLine()+"%s", err)
		Error(GenLogLine()+"%s", err)
		return ""
	} else {
		return string(got)
	}
}

// ReadFile  读取文件内容
func ReadFile(filePath string) string {
	content, err := os.ReadFile(filePath) // 读取文件内容
	if err != nil {
		fmt.Printf("读取文件失败：%v\n", err)
		Error("读取文件失败：%v\n", err)
		return ""
	}
	fmt.Println(string(content))
	return string(content)
}

// WriteFile 写入文件内容
func WriteFile(filePath string, content string) error {
	file, err := os.Create(filePath)
	if err != nil {
		return err
	}
	defer file.Close()
	_, err = file.WriteString(content)
	if err != nil {
		return err
	}
	return nil
}

func SaveBase64ImageToFile(base64Image string, outputFileName string) error {
	// 解码 base64 编码的图片数据
	imageData, err := base64.StdEncoding.DecodeString(extractBase64Data(base64Image))
	if err != nil {
		return fmt.Errorf("Error decoding base64 image data: %v", err)
	}

	if len(imageData) == 0 {
		return fmt.Errorf("Decoded image data is empty")
	}

	// 确保目录存在
	outputDir := filepath.Dir(outputFileName)
	if err := os.MkdirAll(outputDir, 0755); err != nil {
		return fmt.Errorf("Error creating directories: %v", err)
	}

	// 保存图片数据为文件
	err = os.WriteFile(outputFileName, imageData, 0644)
	if err != nil {
		return fmt.Errorf("Error saving image data to file: %v", err)
	}

	fmt.Printf("Image saved to %s\n", outputFileName)
	return nil
}

// extractBase64Data 从 base64 编码的图片数据中提取实际的 base64 数据部分
func extractBase64Data(base64Image string) string {
	// 图片数据格式为 "data:image/png;base64,..."，我们需要提取逗号后的部分
	parts := strings.SplitN(base64Image, ",", 2)
	if len(parts) != 2 {
		return base64Image
	}
	return parts[1]
}
