import config from '@/config'
import Crypto from '@/utils/oss-upload/common/crypto/crypto.js.js'
import '@/utils/oss-upload/common/crypto/hmac.js'
import '@/utils/oss-upload/common/crypto/sha1.js'
import { Base64 } from '@/utils/oss-upload/common/crypto/base64.js'

/**
 * 生成随机Key
 */
function storeKey() {
  let s = [];
  let hexDigits = "0123456789abcdef";
  for (let i = 0; i < 36; i++) {
    s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
  }
  s[14] = "4";
  s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1);
  s[8] = s[13] = s[18] = s[23] = "-";
  return s.join("");
}

/**
 * 生成OSS签名配置
 */
function generateOSSConfig() {
  // 设置1小时后过期
  let date = new Date()
  date = date.setHours(date.getHours() + 1)
  let extime = "" + new Date(date).toISOString()
  
  let policyText = {
    "expiration": extime,
    "conditions": [
      ["content-length-range", 0, 1024 * 1024 * 100] // 设置上传文件的大小限制100MB
    ]
  };
  
  const policyBase64 = Base64.encode(JSON.stringify(policyText))
  
  // 生成签名
  let bytes = Crypto.HMAC(Crypto.SHA1, policyBase64, config.aliOSS_secretKey, {
    asBytes: true
  });
  let signature = Crypto.util.bytesToBase64(bytes);
  
  return {
    accessid: config.aliOSS_accessKey,
    // host: `https://${config.aliOSS_bucketName}.${config.endpoint}`,
    host: config.staticDomain,
    signature: signature,
    policyBase64: policyBase64,
  }
}

/**
 * OSS上传功能（使用签名认证）
 * @param {Object} file - 文件对象（uni.chooseImage返回的文件）
 * @returns {Promise<Object>} 返回上传结果
 */
const uploadImage = async (file) => {
  try {
    // 生成OSS配置和签名
    const ossConfig = generateOSSConfig()
    
    // 生成唯一文件名
    const timestamp = Date.now()
    const randomStr = Math.random().toString(36).substring(2, 8)
    const fileExtension = getFileExtension(file.name || file.path || '.jpg')
    const fileName = `avatars/${timestamp}_${randomStr}${fileExtension}`

    const result = await uni.uploadFile({
      url: ossConfig.host,
      filePath: file.path || file.tempFilePath,
      name: 'file',
      formData: {
        key: fileName,
        policy: ossConfig.policyBase64,
        OSSAccessKeyId: ossConfig.accessid,
        success_action_status: '200',
        signature: ossConfig.signature,
      }
    })

    console.log('OSS上传结果:', result)
    
    // 检查上传是否成功
    if (result.errMsg && result.errMsg.includes("uploadFile:ok")) {
      const fileUrl = `${config.staticDomain}${fileName}`
      return {
        success: true,
        url: fileUrl,
        fileName: fileName
      }
    } else {
      throw new Error(`OSS上传失败，状态码: ${result.statusCode}, 错误信息: ${result.errMsg}`)
    }
  } catch (error) {
    console.error('OSS上传失败:', error)
    return {
      success: false,
      error: error.message || '上传失败'
    }
  }
}

/**
 * 获取文件扩展名
 */
const getFileExtension = (fileName) => {
  if (!fileName) return '.jpg'
  const lastDot = fileName.lastIndexOf('.')
  return lastDot !== -1 ? fileName.substring(lastDot) : '.jpg'
}

/**
 * 选择并上传图片到OSS（一步到位）
 */
const chooseAndUpload = async () => {
  try {
    // 选择图片
    const chooseResult = await uni.chooseImage({
      count: 1,
      sizeType: ['compressed'],
      sourceType: ['album', 'camera']
    })

    if (chooseResult.tempFilePaths && chooseResult.tempFilePaths.length > 0) {
      const file = {
        path: chooseResult.tempFilePaths[0],
        tempFilePath: chooseResult.tempFilePaths[0]
      }

      // 显示加载提示
      uni.showLoading({ title: '上传中...' })

      // 上传文件到OSS
      const uploadResult = await uploadImage(file)
      
      uni.hideLoading()

      if (uploadResult.success) {
        uni.showToast({ title: '上传成功！', icon: 'success' })
        return uploadResult
      } else {
        uni.showToast({ title: uploadResult.error, icon: 'error' })
        return null
      }
    }
  } catch (error) {
    uni.hideLoading()
    uni.showToast({ title: 'OSS上传失败', icon: 'error' })
    console.error('OSS上传失败:', error)
    return null
  }
}

export {
  uploadImage,
  chooseAndUpload,
  getFileExtension
}