package tmall

import (
	"bytes"
	"context"
	"fmt"
	"image"
	"image/png"
	"kami/utility/cache"
	"kami/utility/config"
	tmall "kami/utility/integration/tmall/models"

	"github.com/gogf/gf/v2/errors/gerror"
	"github.com/gogf/gf/v2/os/gfile"
	"github.com/gogf/gf/v2/os/glog"
	"github.com/golang/freetype"
	"golang.org/x/image/draw"
)

func GetCfgAndSession(ctx context.Context) (cfg config.TMAll, session *tmall.OAuthResponse, err error) {
	cfg, err = config.NewConfig(ctx).GetTMallGame()
	session = new(tmall.OAuthResponse)
	if err != nil {
		return
	}
	session, err = GetCachedOAuthToken(ctx)
	if err != nil {
		return
	}
	return
}

// GetCachedOAuthToken 获取缓存的授权信息
func GetCachedOAuthToken(ctx context.Context) (res *tmall.OAuthResponse, err error) {
	res = new(tmall.OAuthResponse)
	result, err := cache.NewCache().Get(ctx, cache.TMallGameThirdPartyCacheKeyTMall)
	if err != nil || result == nil || result.IsNil() {
		return
	}
	err = result.Scan(&res)
	return
}

// ClearCachedOAuthToken 清除缓存授权信息
func ClearCachedOAuthToken(ctx context.Context) (err error) {
	_, err = cache.NewCache().Remove(ctx, cache.TMallGameThirdPartyCacheKeyTMall)
	return
}

// WriteTextToBackground 向图片中写入文字
func WriteTextToBackground(ctx context.Context, input *tmall.DrawerInput) (retBytes []byte, err error) {
	file, err := gfile.Open("resource/public/resource/image/recharge-background.png")
	if err != nil {
		return
	}
	img, _, err := image.Decode(file)
	if img == nil {
		err = gerror.New("图片解码失败")
		return
	}
	// 创建一个与原图等大的新图像用于绘制
	bounds := img.Bounds()
	dst := image.NewNRGBA(bounds)
	// 将原始图像复制到新图像
	draw.Draw(dst, bounds, img, bounds.Min, draw.Src)
	// 创建一个绘图对象
	// 加载字体文件
	font, err := freetype.ParseFont(gfile.GetBytes("resource/public/resource/font/simsun.ttc"))
	if err != nil {
		glog.Error(ctx, err)
		return
	}
	// 生成文字信息
	f := freetype.NewContext()
	f.SetDPI(100)
	f.SetFont(font)   // 加载字体
	f.SetFontSize(60) // 设置字体尺寸
	f.SetClip(dst.Bounds())
	f.SetDst(dst)
	f.SetSrc(image.Black) // 设置字体颜色
	// 位置信息
	pt := freetype.Pt(200, 450)
	_, err = f.DrawString(fmt.Sprintf("购买钻石 %d豆", input.AmountNumber), pt)
	if err != nil {
		glog.Info(ctx, err)
		return
	}
	// 生成文字信息
	f = freetype.NewContext()
	f.SetDPI(100)
	f.SetFont(font)   // 加载字体
	f.SetFontSize(60) // 设置字体尺寸
	f.SetClip(dst.Bounds())
	f.SetDst(dst)
	f.SetSrc(image.Black) // 设置字体颜色
	// 位置信息
	pt = freetype.Pt(200, 600)
	_, err = f.DrawString(fmt.Sprintf("充值账号 %s", input.AccountNumber), pt)
	if err != nil {
		glog.Info(ctx, err)
		return
	}
	// 生成文字信息
	f = freetype.NewContext()
	f.SetDPI(100)
	f.SetFont(font)   // 加载字体
	f.SetFontSize(60) // 设置字体尺寸
	f.SetClip(dst.Bounds())
	f.SetDst(dst)
	f.SetSrc(image.Black) // 设置字体颜色
	// 位置信息
	pt = freetype.Pt(200, 750)
	_, err = f.DrawString(fmt.Sprintf("充值金额 %.2f元", input.Amount), pt)
	if err != nil {
		glog.Error(ctx, err)
		return
	}
	// 生成文字信息
	f = freetype.NewContext()
	f.SetDPI(100)
	f.SetFont(font)   // 加载字体
	f.SetFontSize(60) // 设置字体尺寸
	f.SetClip(dst.Bounds())
	f.SetDst(dst)
	f.SetSrc(image.Black) // 设置字体颜色
	// 位置信息
	pt = freetype.Pt(200, 900)
	_, err = f.DrawString(fmt.Sprintf("充值时间 %s", input.CreatedAt.Format("2006年01月02日 15:04:05")), pt)
	if err != nil {
		glog.Error(ctx, err)
		return
	}
	var buf bytes.Buffer
	err = png.Encode(&buf, dst)
	//写入到本地
	if err != nil {
		return
	}
	// 返回包含图片数据的字节切片
	return buf.Bytes(), nil
}
