package auth

import (
	"fmt"
	"fonchain-fiee/pkg/service"
	"github.com/aliyun/aliyun-oss-go-sdk/oss"
	"github.com/gin-gonic/gin"
	"github.com/gin-gonic/gin/binding"
	"io"
	"net/http"
	"os"
)

type OOInf struct {
	Point string
	Img   string
	File  string
}

// DownImg 重定向到指定位置
func DownImg(c *gin.Context) {

	var req OOInf

	if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil {
		service.Error(c, err)
		return
	}

	client, err := oss.New(req.Point, "LTAI5tHfjSmWXHqfWgaL7Uo5", "kOPctFZ3DHsbdSSym1fLyDK39hkzPI")

	if err != nil {
		fmt.Println("Error:", err)
		service.Error(c, err)
		return
	}

	// 填写Bucket名称，例如examplebucket。
	bucketName := "erp-k8s-store"
	// 填写文件完整路径，例如exampledir/exampleobject.txt。文件完整路径中不能包含Bucket名称。
	objectName := req.Img
	// 下载OSS文件到本地文件，并保存到指定的本地路径中。如果指定的本地文件存在会覆盖，不存在则新建。
	// 如果未指定本地路径，则下载后的文件默认保存到示例程序所属项目对应本地路径中。

	// 获取存储空间。
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		panic(err)
	}

	// 指定签名URL过期时间，单位为秒，本示例以设置签名ULR过期时间为30天为例。您可以根据实际业务场景，设置合理的过期时间。
	signedURL, err := bucket.SignURL(objectName, oss.HTTPGet, 100)
	fmt.Println(signedURL, err)

	// 目标文件路径
	filePath := req.File

	// 发起GET请求
	resp, err := http.Get(signedURL)
	if err != nil {
		// 处理错误
		panic(err)
	}
	defer resp.Body.Close()

	// 确保HTTP响应状态码为200
	if resp.StatusCode != http.StatusOK {
		// 处理非200状态码
		panic("bad status: " + resp.Status)
	}

	// 创建或截断目标文件
	out, err := os.Create(filePath)
	if err != nil {
		// 处理错误
		panic(err)
	}
	defer out.Close()

	// 将响应体复制到文件
	_, err = io.Copy(out, resp.Body)
	if err != nil {
		// 处理错误
		panic(err)
	}

	// 输出成功信息
	service.Success(c, "")
	return

}

func DownImgV2(c *gin.Context) {

	var req OOInf

	if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil {
		service.Error(c, err)
		return
	}

	client, err := oss.New(req.Point, "LTAI5tHfjSmWXHqfWgaL7Uo5", "kOPctFZ3DHsbdSSym1fLyDK39hkzPI")
	//client, err := oss.New(req.Point, "xxxxx", "xxxx")
	bucketName := "erp-k8s-store"
	objectName := req.Img
	filePath := req.File //本地下载的地址

	// 获取存储空间。
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		panic(err)
	}

	rd, err := bucket.GetObject(objectName)

	// 读取所有数据
	_, err = io.ReadAll(rd)
	if err != nil {
		fmt.Println("Error reading data:", err)
		return
	}

	if err != nil {
		panic(err)
	}

	// If the local file does not exist, create a new one. If it exists, overwrite it.
	fd, err := os.OpenFile(filePath, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, os.FileMode(0664))
	if err != nil {
		panic(err)
	}
	defer fd.Close()

	// Copy the data to the local file path.
	_, err = io.Copy(fd, rd)
	if err != nil {
		panic(err)
	}

	// 输出成功信息
	service.Success(c, "")
	return

}

func DownImgV3(c *gin.Context) {

	var req OOInf

	if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil {
		service.Error(c, err)
		return
	}

	client, err := oss.New(req.Point, "LTAI5tHfjSmWXHqfWgaL7Uo5", "kOPctFZ3DHsbdSSym1fLyDK39hkzPI")
	//client, err := oss.New(req.Point, "xxxxx", "xxxx")
	bucketName := "erp-k8s-store"
	objectName := req.Img
	filePath := req.File //本地下载的地址

	// 获取存储空间。
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		panic(err)
	}

	bucket.GetObjectToFile(objectName, filePath)

	//body, err := bucket.GetObject(objectName)

	//data, err := ioutil.ReadAll(body)

	// 指定签名URL过期时间，单位为秒，本示例以设置签名ULR过期时间为30天为例。您可以根据实际业务场景，设置合理的过期时间。

	// 输出成功信息
	service.Success(c, "")
	return

}
