/**
 * oss操作在这个文件维护
 */
const OSS = require('ali-oss')
const path = require('path')
const fs = require('fs')
const chalk = require('chalk')

const client = new OSS({
  // yourregion填写Bucket所在地域。以华东1（杭州）为例，Region填写为oss-cn-hangzhou。
  region: '',
  // 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
  accessKeyId: '',
  accessKeySecret: '',
  // 填写Bucket名称。
  bucket: '',
})


// 上传单个文件
async function uploadFiles(ossPath, localPath) {
  const IS_DEBUG = process.env.debug
  try {
    // 调试
    if (IS_DEBUG) {
      console.log(chalk.yellow(`debug: 上传文件:${localPath}`))
    }

    // 填写OSS文件完整路径和本地文件的完整路径。OSS文件完整路径中不能包含Bucket名称。
    // 如果本地文件的完整路径中未指定本地路径，则默认从示例程序所属项目对应本地路径中上传文件。
    const result = await client.put(ossPath, path.normalize(localPath))

    // 调试
    if (result.res.status === 200) {
      IS_DEBUG && console.log(chalk.yellow(`debug: ${localPath} 文件上传成功`))
      return true
    } else {
      IS_DEBUG && console.log(chalk.yellow(`debug: 文件上传失败:`))
      console.log(result)
      return false
    }
  } catch (e) {
    console.log(e)
    return false
  }
}

/**
 * 多文件上传
 * @param {*} directory 上传到oss的文件夹名称
 * @param {*} directory 本地上传的文件夹名称
 */
async function multipleFilesUpload(ossDirectory, directory) {
  let stat // 文档读取状态
  let uploadStatus = false // 是否上传成功
  const IS_DEBUG = process.env.debug
  try {
    stat = fs.statSync(directory)
  } catch (e) {
    console.log(
      chalk.red(
        `命令执行失败，请确认: 1.是否在文档模板根目录执行命令 2.目录下是否存在文件名为storybook-static的目录`
      )
    )
    return
  }

  // 判断是否是一个文件夹
  if (stat.isDirectory()) {
    const filesList = fs.readdirSync(directory)
    for (let i = 0; i < filesList.length; i++) {
      const file = filesList[i]
      const parentDirectory = directory // 父级目录
      const currentFileStat = fs.statSync(`${parentDirectory}/${file}`)
      const filePath = `${parentDirectory}/${file}`
      const ossPath = `${ossDirectory}/${file}`

      // 如果是目录，则继续遍历。如果是文件，直接上传oss
      if (currentFileStat.isDirectory()) {
        // 调试
        if (IS_DEBUG) {
          console.log(chalk.yellow(`debug: 递归目录:${filePath}`))
        }
        await multipleFilesUpload(ossPath, filePath)
      } else {
        const uploadResult = await uploadFiles(
          ossPath,
          path.normalize(path.resolve(process.cwd(), filePath))
        )
        if(!uploadResult) {
          uploadStatus = false
          return uploadStatus
        }
      }
    }
    uploadStatus = true
    return uploadStatus
  } else {
    console.log(
      chalk.red(
        `命令执行失败，请确认: 1.是否在文档模板根目录执行命令 2.目录下是否存在文件名为storybook-static的目录`
      )
    )
    return uploadStatus
  }
}

module.exports = {
  uploadFiles,
  multipleFilesUpload,
}
