const OSS = require('ali-oss');
import { getSTSToken } from '@/api/H5Camera';

// 自定义请求头
const headers = {
  // 指定Object的存储类型。
  'x-oss-storage-class': 'Standard',
  // 指定Object的访问权限。
  'x-oss-object-acl': 'private',
  // 通过文件URL访问文件时，指定以附件形式下载文件，下载后的文件名称定义为example.txt。
  'Content-Disposition': 'attachment; filename="example.txt"',
  // 设置Object的标签，可同时设置多个标签。
  'x-oss-tagging': 'Tag1=1&Tag2=2',
  // 指定PutObject操作时是否覆盖同名目标Object。此处设置为true，表示禁止覆盖同名Object。
  'x-oss-forbid-overwrite': 'true',
};
export function dataURLtoFile(dataurl, filename) {
  let arr = dataurl.split(','),
    mime = arr[0].match(/:(.*?);/)[1],
    bstr = atob(arr[1]),
    n = bstr.length,
    u8arr = new Uint8Array(n);
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n);
  }
  return new File([u8arr], filename, { type: mime });
}

const progress = (p, _checkpoint) => {
  // Object的上传进度。
  console.log(p);
  // 分片上传的断点信息。
  console.log(_checkpoint);
};

let credentials = null;
async function uploadAliOss(base64, filename) {
  if (isCredentialsExpired(credentials)) {
    // 获取 STS token.
    const response = await getSTSToken();
    if (response.code != 200 || !response.data) {
      // 处理错误的HTTP状态码。
      let err = `获取STS令牌失败: ${response.msg}`;
      throw new Error(err);
    }
    credentials = await response.data;
  }
  const client = new OSS({
    region: 'cn-shanghai',
    bucket: process.env.NODE_ENV == 'production' ? 'ssbsfa-prd' : 'svs-test',
    accessKeyId: credentials.accessKeyId,
    accessKeySecret: credentials.accessKeySecret,
    stsToken: credentials.securityToken,
    secure: true,
    // 显式指定endpoint并修正格式
    // 使用标准区域节点配置
    region: 'oss-cn-shanghai',
    // 添加网络优化参数
    timeout: 30000,
    retryMax: 3,
    // 修正headers配置
    headers: {
      'x-oss-forbid-overwrite': 'true',
      'Cache-Control': 'no-cache',
    },
  });
  let file = dataURLtoFile(base64, filename);

  const regex = /^data:image\/(\w+);base64,/; // 正则表达式匹配base64数据头部
  const matches = base64.match(regex);
  let fileName = filename;
  if (matches && matches.length === 2) {
    matches[1]; // 返回第一个捕获组，即文件扩展名
    fileName = filename + '.' + matches[1];
  }
  try {
    const result = await client.put(fileName, file);
    console.log(result);
    return result;
  } catch (e) {
    console.error('OSS Upload Error Details:', {
      code: e.code,
      message: e.message,
      requestId: e.requestId,
      hostId: e.hostId,
    });
    throw new Error(`文件上传失败: ${e.code} - ${e.message}`);
  }
}
/**
 * 判断临时凭证是否到期。
 **/
function isCredentialsExpired(credentials) {
  if (!credentials) {
    return true;
  }
  const expireDate = new Date(credentials.expiration);
  const now = new Date();
  // 如果有效期不足一分钟，视为过期。
  return expireDate.getTime() - now.getTime() <= 60000;
}
export default uploadAliOss;
