const Router = require('@koa/router');
const fs = require('fs');
const router = new Router({ prefix: '/api/cloud' });
const util = require('../utils/util');
const sdk = require('@baiducloud/sdk');
const Minio = require('minio');
const OSS = require('ali-oss');
const imgcloud = require('../service/imgcloud.service');
const config = require('../config');

/**
 * 图片云服务API接口
 */

// 上传cdn文件
router.post('/upload/files', async (ctx) => {
  try {
    const file = ctx.request.files.file;
    const { userId, userName } = util.decodeToken(ctx);

    let key = `cloud/${userId}/${file.newFilename}`;
    const buffer = fs.readFileSync(file.filepath);
    let client = null;
    if (config.OSS_TYPE === 'minio') {
      // 创建 MinIO 客户端
      client = new Minio.Client({
        endPoint: config.OSS_ENDPOINT,
        port: config.OSS_PORT, // MinIO 默认端口
        useSSL: config.OSS_USESSL, // 如果使用 HTTPS,请设置为 true
        accessKey: config.OSS_ACCESSKEY,
        secretKey: config.OSS_ACCESSKEYSECRET,
      });
    } else if (config.OSS_TYPE === 'baidu') {
      const ossConfig = {
        endpoint: config.OSS_ENDPOINT, //传入Bucket所在区域域名
        credentials: {
          ak: config.OSS_ACCESSKEY, //您的AccessKey
          sk: config.OSS_ACCESSKEYSECRET, //您的SecretAccessKey
        },
      };
      client = new sdk.BosClient(ossConfig);
    } else {
      client = new OSS({
        // yourregion填写Bucket所在地域。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。
        region: config.OSS_REGION,
        // 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        accessKeyId: config.OSS_ACCESSKEY,
        accessKeySecret: config.OSS_ACCESSKEYSECRET,
        authorizationV4: true,
        // 填写Bucket名称。
        bucket: config.OSS_BUCKET,
      });
    }
    if (config.OSS_TYPE === 'aliyun') {
      await client.put(key, buffer);
    } else {
      await client.putObject(config.OSS_BUCKET, key, buffer, {
        'Content-Type': 'image/png', // 添加http header
        'Cache-Control': 'public, max-age=31536000', // 指定缓存指令
        'x-bce-acl': 'public-read',
      });
    }
    // 删除临时文件
    fs.unlink(file.filepath, (err) => {
      if (err) {
        return;
      }
    });
    let url = `${config.OSS_CDNDOMAIN}/${key}`;
    if (config.OSS_TYPE === 'minio') {
      url = `${config.OSS_USESSL ? 'https://' : 'http://'}${config.OSS_ENDPOINT}:${config.OSS_PORT}/${config.OSS_BUCKET}/${key}`;
    } else if (config.OSS_TYPE === 'baidu') {
      if (config.OSS_CDNDOMAIN) {
        url = `${config.OSS_CDNDOMAIN}/${key}`;
      } else {
        url = `${config.OSS_ENDPOINT}/${key}`;
      }
    } else {
      if (config.OSS_CDNDOMAIN) {
        url = `${config.OSS_CDNDOMAIN}/${key}`;
      } else {
        url = `https://${config.OSS_BUCKET}.${config.OSS_REGION}.aliyuncs.com/${key}`;
      }
    }
    await imgcloud.create(userId, userName, file.originalFilename, file.newFilename, file.mimetype, file.size, url);
    util.success(ctx, {
      name: file.originalFilename,
      size: file.size,
      type: file.mimetype,
      url,
    });
  } catch (error) {
    fs.unlink(file.filepath, (err) => {
      if (err) {
        return;
      }
    });
    util.fail(ctx, JSON.stringify(error));
  }
});

// cdn列表
router.get('/list', async (ctx) => {
  const { userId } = util.decodeToken(ctx);
  const { pageNum = 1, pageSize = 24 } = ctx.request.query;
  const list = await imgcloud.list(userId, pageNum, pageSize);
  const { total } = await imgcloud.listCount(userId);
  util.success(ctx, {
    list,
    total,
    pageSize: +pageSize,
    pageNum: +pageNum,
  });
});

// 文件删除
router.post('/delete', async (ctx) => {
  const { userId } = util.decodeToken(ctx);
  const { id } = ctx.request.body;
  if (!id) {
    return ctx.throw(400, 'ID不能为空');
  }
  await imgcloud.delete(id, userId);
  util.success(ctx);
});

module.exports = router;