package admin

import (
	"context"
	"fmt"
	"github.com/druidcaesa/gotool"
	"github.com/qiniu/go-sdk/v7/auth/qbox"
	"github.com/qiniu/go-sdk/v7/storage"
	"image"
	"image/jpeg"
	"image/png"
	"io"
	"log"
	"os"
	"strconv"
	"strings"
	"time"
	"ulink-admin/config"
	"ulink-admin/frame"
	"ulink-admin/modules/system/models/model"
	"ulink-admin/modules/system/models/req"
	"ulink-admin/modules/system/models/response"
	"ulink-admin/modules/system/service"
	"ulink-admin/pkg/excels"
	"ulink-admin/pkg/file"
	"ulink-admin/pkg/jwt/admin"
	"ulink-admin/pkg/page"
	"ulink-admin/pkg/tool"
)

type SysAttachmentApi struct {
	SysAttachmentService *service.SysAttachmentService `inject:""`
}

// List 查询附件分页数据
func (a SysAttachmentApi) List(c *frame.Context) {
	query := &req.SysAttachmentQuery{}
	c.ValidteError(c.ShouldBind(query), query)
	list, i := a.SysAttachmentService.FindList(query)
	c.Ok(page.Page{
		List:  list,
		Total: i,
		Size:  query.PageSize,
	})
}

// List 查询附件所有数据
func (a SysAttachmentApi) ListAll(c *frame.Context) {
	list := a.SysAttachmentService.FindAll()
	c.Ok(list)
}

// Get 根据附件Id获取详细信息
func (a SysAttachmentApi) Get(c *frame.Context) {
	param := c.Param("id")
	id, _ := strconv.ParseInt(param, 10, 64)
	c.Ok(a.SysAttachmentService.GetSysAttachmentById(id))
}

// DownLoad 下载文件
func (a SysAttachmentApi) DownLoad(c *frame.Context) {
	param := c.Param("id")
	isZIp := c.Query("isZip")

	id, _ := strconv.ParseInt(param, 10, 64)
	sysAttachment := a.SysAttachmentService.GetSysAttachmentById(id)
	filePath := sysAttachment.Path
	if gotool.StrUtils.HasNotEmpty(isZIp) {
		if gotool.StrUtils.HasNotEmpty(sysAttachment.ZipPath) {
			filePath = sysAttachment.ZipPath
		}
	}
	//打开文件
	file, err := os.Open(filePath)
	if err != nil {
		fmt.Println("打开文件错误", err)
	}
	defer file.Close()
	c.File(filePath)
	c.Header("Content-Type", "application/octet-stream")
	c.Header("Content-Disposition", "attachment; filename="+sysAttachment.Label+"."+sysAttachment.Ext)
	c.Header("Content-Transfer-Encoding", "binary")
	c.Header("Cache-Control", "no-cache")
}

// Add 新增附件
func (a SysAttachmentApi) Add(c *frame.Context) {
	sysAttachment := &model.SysAttachment{}
	c.ValidteError(c.ShouldBind(sysAttachment), sysAttachment)
	sysAttachment.CreateTime = time.Now()
	sysAttachment.CreateBy = admin.GetUserInfo(c).UserName
	a.SysAttachmentService.Insert(sysAttachment)
}

// Upload 附件上传
func (a SysAttachmentApi) Upload(c *frame.Context) {
	path := config.GetFilePath()
	file, header, err := c.Request.FormFile("file")
	//fileType := c.Request.FormValue("fileType")
	name := c.Request.FormValue("fileName")
	ext := ""
	if gotool.StrUtils.HasNotEmpty(name) {
		ary := strings.Split(name, ".")
		ext = ary[1]
	}
	ary := strings.Split(header.Filename, ".")
	if len(ary) > 1 {
		ext = ary[1]
	}
	fileName := gotool.IdUtils.IdUUIDToRan(true) + "." + ext
	filePath := path.Path + fileName
	compressPath := path.Path + "zip/" + fileName
	fileAppend, err := gotool.FileUtils.OpenFileAppend(filePath)
	defer fileAppend.Close()
	if err != nil {
		gotool.Logs.ErrorLog().Println(err)
		c.Error()
		return
	}
	_, err = io.Copy(fileAppend, file)
	if err != nil {
		gotool.Logs.ErrorLog().Println(err)
		c.Error()
		return
	}
	zipPath := ""
	if strings.Contains(header.Header.Get("Content-Type"), "image") {
		zipPath = a.Compress(filePath, compressPath)
	}
	sysAttachment := model.SysAttachment{}
	sysAttachment.Label = strings.Split(header.Filename, ".")[0]
	sysAttachment.Type = header.Header.Get("Content-Type")
	sysAttachment.Path = filePath
	sysAttachment.Ext = ext
	sysAttachment.CreateTime = time.Now()
	sysAttachment.CreateBy = admin.GetUserInfo(c).UserName
	sysAttachment.UpdateTime = time.Now()
	sysAttachment.ZipPath = zipPath
	sysAttachment.UpdateBy = admin.GetUserInfo(c).UserName
	a.SysAttachmentService.Insert(&sysAttachment)
	c.Ok(sysAttachment)
}

func (a SysAttachmentApi) Compress(imagePath string, compressPath string) string {
	//需要压缩
	imgfile, err := os.Open(imagePath)
	if err != nil {
		log.Println("os.Open::", err)
		return ""
	}
	defer imgfile.Close()
	jpgimg, layout, err := image.Decode(imgfile)
	if err != nil {
		log.Println("jpeg.Decode::", err)
		return ""
	}
	//保存到新文件中
	newfile, err := os.Create(compressPath)
	if err != nil {
		log.Println("Create::", err)
		return ""
	}
	defer newfile.Close()
	switch layout {
	case "png":
		err = png.Encode(newfile, jpgimg)
	case "jpeg", "jpg":
		err = jpeg.Encode(newfile, jpgimg, &jpeg.Options{Quality: 30})
	default:
		return ""
	}
	if err != nil {
		log.Println("Encode::", err)
		return ""
	}
	return compressPath
}

// 获取大小的借口
type Sizer interface {
	Size() int64
}

//	文件上传接口数据
//
// @Summary 文件上传接口数据
// @Description 文件上传接口数据
// @Tags 文件上传相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string false "Bearer 令牌"
// @Security ApiKeyAuth
// @Success 200 {object} resp.Response{data=string,msg=string} "文件上传结果"
// @Router /sysattachment/qiniuUpload [post]
func (a SysAttachmentApi) QiniuUpload(c *frame.Context) {
	file, _, err := c.Request.FormFile("file")
	fileSize := file.(Sizer).Size()
	var AccessKey = "Rt7_WT03Go8_BwO--ExFlnmsTBk9QUZX_NNnoTMp"
	var SerectKey = "NC1_hBQumLFEUCLICzPGPR8xnbn03-Gt5fDV2vlv"
	var Bucket = "longping"
	putPlicy := storage.PutPolicy{
		Scope: Bucket,
	}
	mac := qbox.NewMac(AccessKey, SerectKey)
	upToken := putPlicy.UploadToken(mac)
	cfg := storage.Config{
		Zone:          tool.Zone("longping"),
		UseCdnDomains: false,
		UseHTTPS:      true,
	}
	putExtra := storage.PutExtra{}
	formUploader := storage.NewFormUploader(&cfg)
	ret := storage.PutRet{}
	err = formUploader.PutWithoutKey(context.Background(), &ret, upToken, file, fileSize, &putExtra)
	if err != nil {
		c.Error("文件上传错误")
		return
	}
	url := "http://rsbl220vw.hd-bkt.clouddn.com/" + ret.Key
	data := response.QiniuResponse{}
	data.Url = url
	data.Label = ret.Key
	c.Ok(data)
}

// Edit 修改附件数据接口
func (a SysAttachmentApi) Edit(c *frame.Context) {
	sysAttachment := &model.SysAttachment{}
	c.ValidteError(c.ShouldBind(sysAttachment), sysAttachment)
	sysAttachment.UpdateTime = time.Now()
	sysAttachment.UpdateBy = admin.GetUserInfo(c).UserName
	a.SysAttachmentService.Update(sysAttachment)
	c.Ok(sysAttachment)

}

// Delete 删除附件数据
func (a SysAttachmentApi) Delete(c *frame.Context) {
	//获取sysAttachmentId
	param := c.Param("id")
	list := make([]int64, 0)
	if gotool.StrUtils.HasNotEmpty(param) {
		strs := strings.Split(param, ",")
		for _, str := range strs {
			id, _ := strconv.ParseInt(str, 10, 64)
			list = append(list, id)
		}
	}
	//判断是否可以删除
	a.SysAttachmentService.Delete(list)
}

// Export 导出excel
func (a SysAttachmentApi) Export(c *frame.Context) {
	query := &req.SysAttachmentQuery{}
	c.ValidteError(c.ShouldBind(query), query)
	list, _ := a.SysAttachmentService.FindList(query)
	excelList := make([]interface{}, 0)
	for _, sysAttachment := range *list {
		excelList = append(excelList, sysAttachment)
	}
	_, files := excels.ExportExcel(excelList, "附件数据表")
	file.DownloadExcel(c, files)
}