import { fetchOssInitData } from '@/api/doc'
import OSS from 'ali-oss'
let client = null
let baseFileUrl = ''

export async function initOssClient() {
  try {
    const res = await fetchOssInitData()
    if (res.code) return
    const { accessKeyId, securityToken, bucket, accessKeySecret } = res.data
    const config = {
      // 以华东1（杭州）为例，Region填写为oss-cn-hangzhou。
      region: 'oss-cn-shenzhen',
      accessKeyId,
      accessKeySecret,
      stsToken: securityToken,
      bucket
    }
    client = new OSS(config)
    baseFileUrl = `https://${bucket}.${config.region}.aliyuncs.com/`

    setInterval(() => {
      initOssClient()
    }, 1000 * 60 * 60)
  } catch (error) {
    console.log(error)
  }
}

async function multipartUpload(options, callback) {
  if (!client) {
    await initOssClient()
  }
  if (options.status > -1) return
  try {
    // 指定上传到examplebucket的Object名称，例如exampleobject.txt。
    const name =
      process.env.VUE_APP_UPLOAD_DIR +
      options.fileName.replace(/([^\\/]+)\.([^\\/]+)/i, function(match, $1, $2) {
        options.uuid = options.uuid + '.' + $2
        return options.uuid
      })
    // 分片上传
    const res = await client.multipartUpload(name, options.file, {
      // 获取分片上传进度、断点和返回值。
      progress: (p, cpt, res) => {
        callback.progress && callback.progress(options, { p, cpt, res })
      },
      // 设置并发上传的分片数量。
      parallel: 10,
      // 设置分片大小。默认值为1 MB，最小值为100 KB。
      partSize: 1024 * 1024,
      // 文件类型
      mime: options.type,

      headers: {
        // 指定初始化分片上传时是否覆盖同名Object。此处设置为true，表示禁止覆盖同名Object。
        'x-oss-forbid-overwrite': 'true'
      }
    })
    // const url = client.signatureUrl(res.name)
    // console.log(res.name) baseFileUrl + res.name
    callback.success && callback.success(options, res, baseFileUrl + res.name)
  } catch (err) {
    console.log(err)
    callback.success && callback.faild(options, err)
  }
}

// 上传
export function upload(fileList, callback) {
  for (let i = 0; i < fileList.length; i++) {
    multipartUpload(fileList[i], callback)
  }
}
