import path from "path";
import { gSuccess, gFail, uploadDir } from "@/util";

const fs = require("fs");
const multiparty = require("multiparty");
const FileType = require("file-type");

function saveFile(file) {
  return new Promise(async (resolve, reject) => {
    const filename = file.originalFilename;
    const uploadedPath = file.path;
    const filetype = await FileType.fromFile(uploadedPath);
    console.log(filetype);
    if (filetype && (filetype.ext == "jpg" || filetype.ext == "png")) {
      const dstPath = path.resolve(uploadDir, filename);
      fs.rename(uploadedPath, dstPath, function (err) {
        if (err) {
          console.log("rename error: " + err);
          reject();
        } else {
          resolve(0);
        }
      });
    } else {
      fs.unlinkSync(uploadedPath);
      reject(new Error(filename + "文件不是图片"));
    }
  });
}

export default function (req, h) {
  const form = new multiparty.Form({
    uploadDir: uploadDir, //路径需要对应自己的项目更改
    /*设置文件保存路径 */
    encoding: "utf-8",
    /*编码设置 */
    maxFilesSize: 20000 * 1024 * 1024,
    /*设置文件最大值 20MB */
    keepExtensions: true,
    /*保留后缀*/
  });
  return new Promise(async (resolve, reject) => {
    form.on("part", function (part) {
      console.log(part.filename);
    });
    form.on("progress", function (bytesReceived, bytesExpected) {
      if (bytesExpected === null) {
        return;
      }

      var percentComplete = (bytesReceived / bytesExpected) * 100;
      console.log(
        "the form is " + Math.floor(percentComplete) + "%" + " complete"
      );
    });

    form.parse(req.payload, async function (err, fields, files) {
      // console.log(err, fields, files);

      if (err) {
        resolve(err.message);
        return;
      }
      const errList = [];
      for (let i = 0; i < files.file.length; i++) {
        const file = files.file[i];
        try {
          await saveFile(file);
        } catch (error) {
          errList.push(error.message);
        }
      }
      if (errList.length) {
        resolve(gFail(null, errList.join("\n")));
        return;
      }
      resolve(h.view("views/upload.ejs"));
    });
  });
}