package aliyun

import (
	"fmt"
	"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
	"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
	"github.com/aliyun/alibaba-cloud-sdk-go/services/vod"
	"github.com/astaxie/beego"
	"gitlab.fjmaimaimai.com/mmm-go/gocomm/common"
	"gitlab.fjmaimaimai.com/mmm-go/gocomm/pkg/log"
	comm_time "gitlab.fjmaimaimai.com/mmm-go/gocomm/time"
	"openapi/pkg/constant"
	"openapi/pkg/infrastructure/utils"
	"path"
	"path/filepath"
	"time"
)

//客户端
func DefaultVodClient() (client *vod.Client, err error) {
	return InitVodClient(constant.AccessKeyID, constant.AccessKeySecret)
}

//初始化客户端
func InitVodClient(accessKeyId string, accessKeySecret string) (client *vod.Client, err error) {
	// 点播服务接入区域
	regionId := constant.RegionID
	// 创建授权对象
	credential := &credentials.AccessKeyCredential{
		accessKeyId,
		accessKeySecret,
	}
	// 自定义config
	config := sdk.NewConfig()
	config.AutoRetry = true     // 失败是否自动重试
	config.MaxRetryTime = 3     // 最大重试次数
	config.Timeout = 3000000000 // 连接超时,单位:纳秒;默认为3秒
	// 创建vodClient实例
	return vod.NewClientWithOptions(regionId, config, credential)
}

//获取视频上传地址和凭证,并创建视频信息
func CreateUploadVideo(client *vod.Client, r *CreateUploadVideoRequest) (response *CreateUploadVideoResponse, err error) {
	request := vod.CreateCreateUploadVideoRequest()
	request.Title = r.Title
	request.FileName = r.FileName
	request.AcceptFormat = "JSON"
	rsp, err := client.CreateUploadVideo(request)
	if err != nil {
		return
	}
	response = &CreateUploadVideoResponse{
		RequestId:     rsp.RequestId,
		VideoId:       rsp.VideoId,
		UploadAddress: rsp.UploadAddress,
		UploadAuth:    rsp.UploadAuth,
	}
	return
}

func RefreshUploadVideo(client *vod.Client, r *RefreshUploadVideoRequest) (response *RefreshUploadVideoResponse, err error) {
	request := vod.CreateRefreshUploadVideoRequest()
	request.VideoId = r.VideoId
	request.AcceptFormat = "JSON"

	var rsp *vod.RefreshUploadVideoResponse
	rsp, err = client.RefreshUploadVideo(request)
	if err != nil {
		return
	}
	if err = utils.JsonDeepCopy(&response, &rsp); err != nil {
		return
	}
	if up, e := ParseUploadAddress(rsp.UploadAddress); e != nil {
		log.Error(e)
	} else {
		response.FileURL = up.GetFileUrl(constant.CName)
	}
	return
}

//获取图片上传地址和凭证,并创建视频信息
func CreateUploadImage(client *vod.Client, r *CreateUploadImageRequest) (response *CreateUploadImageResponse, err error) {
	request := vod.CreateCreateUploadImageRequest()
	request.ImageType = "default"
	request.Title = r.Title
	if filepath.Ext(r.FileName) == "" {
		err = fmt.Errorf("filename:%v invalid", r.FileName)
		return
	}
	request.ImageExt = filepath.Ext(r.FileName)[1:]
	if !ValidFileExt(ImageFileExt, r.FileName) {
		request.ImageExt = "jpg"
	}
	request.AcceptFormat = "JSON"
	//request.StorageLocation = filepath.Base(request.Title)
	rsp, err := client.CreateUploadImage(request)
	if err != nil {
		return
	}
	err = utils.JsonDeepCopy(&response, &rsp)
	return
}

//获取播放信息
func GetPlayInfo(client *vod.Client, r *GetPlayInfoRequest) (response *vod.GetPlayInfoResponse, err error) {
	request := vod.CreateGetPlayInfoRequest()
	request.VideoId = r.VideoId
	request.AcceptFormat = "JSON"
	return client.GetPlayInfo(request)
}

//获取播放信息
func GetGetVideoPlayAuth(client *vod.Client, r *GetVideoPlayAuthRequest) (response GetVideoPlayAuthResponse, err error) {
	request := vod.CreateGetVideoPlayAuthRequest()
	request.VideoId = r.VideoId
	request.AcceptFormat = "JSON"
	var rsp *vod.GetVideoPlayAuthResponse
	if rsp, err = client.GetVideoPlayAuth(request); err != nil {
		log.Error(err)
		return
	}
	err = utils.JsonDeepCopy(&response, rsp)
	return
}

//fileType: video voice image
func GetFileName(fileType string, filename string) string {
	date := comm_time.GetTimeByYyyymmdd()
	subfix := path.Ext(filename)
	prefix := fmt.Sprintf("%v_%v", time.Now().Unix(), common.RandomString(32))
	filename = fmt.Sprintf("%v%v", prefix, subfix)
	sourcePath := fmt.Sprintf("%v/%v/%v/%v/%v", beego.BConfig.AppName, beego.BConfig.RunMode, fileType, date, filename)
	return sourcePath
}