const Busboy = require('busboy');
const fs = require('fs');
const checkTargetDir = require('./mkdir');

//缓存检测过的目录
const checkedMap = {};


/**
 * 获取上传文件的后缀名
 * @param  {string} fileName 上传的文件的文件名
 * @return {string}      文件后缀名
 */
function getSuffixName(filename) {
  let nameList = filename.split('.');
  return nameList[nameList.length - 1];
}


/**
 * 获取唯一的文件名
 * @return {string}      文件名
 */
function getOnlyName() {
  return Math.random().toString(16).substr(2);
}



/**
 * 初始化上传文件模块
 * @param  {string} target 上传文件的位置
 * @param  {string} checkedInterval 多久执行重新检测目录，默认为一天
 * @return {async function}      
 */
function init(target = './upload', checkedInterval = 24) {
  if (!checkedMap[target]) {
    checkedMap[target] = true;
    setInterval(() => checkedMap[target] = true, checkedInterval*60*60*1000)
  }

  /**
  * 上传文件，并生成唯一的文件名，根据上传时的文件名保持文件的后缀名
  * @param  {object} ctx koa2上下文
  * @return {promise}      
  */
  return async function uploadFile(ctx) {
    let formData, busboy,
      req = ctx.req;

    if (checkedMap[target]) {
      await checkTargetDir(target);
      checkedMap[target] = false;
    }

    busboy = new Busboy({headers: ctx.headers});
    formData = await new Promise((resolve, reject) => {
      let result = {};
  
      busboy.on('file', (filedname, file, filename) => {
        let l_path = `${getOnlyName()}.${getSuffixName(filename)}`;
  
        file.pipe(fs.createWriteStream(`${target}/${l_path}`));
  
        file.on('end', () => {
          result[filedname] = l_path;
        });
      });
  
      busboy.on('field', (filedname, val) => result[filedname] = val);
      busboy.on('finish', () => resolve(result));
      busboy.on('error', err => reject(err));
  
      req.pipe(busboy);
    });
     
    return formData;
   }
}

module.exports = exports = init;