/**
 *   ЗАГРУЗКА ФАЙЛОВ ПОЛЬЗОВАТЕЛЯ НА СЕРВЕР
 *   Copyright © 2021, А.М.Гольдин. ISC license
 */
"use strict";

// Загрузка файла на сервер в папку draft/<id>
// Возвращает массив с элементами - именами загруженных файлов 1.jpg, 2.png,...
// id   - это id статьи
// data - это Uint8Array с содержимым файла
//        (если пустое, то просто возвращаем список файлов изображений)
// user - это данные клиента [3, "ivanov", "Иванов", "Ян", "Карлович"]
// Вызывается непосредственно из server.js, минуя api/index.js
module.exports = async (user, id, data) => {
   try {
      if (data.length > 1048576) return "none";

      // Промисификатор определения mime-типа
      const getMime = data => {
         return new Promise((resolve, reject) => {
            mType.detect(data, (e, res) => {
               if (e) reject("none"); else resolve(res);
            })
         })
      };
      // Промисификатор чтения каталога с данным id
      // Возвращает массив имен файлов (кроме файла txt)
      const rdDir = id => {
         return new Promise((resolve, reject) => {
            fs.readdir(__dirname + `/../draft/${id}`, (e, files) => {
               if (e) reject("none");
               else resolve(files.filter(x => x.split('.')[1] != "txt"));
            })
         })
      };
      // Промисификатор записи файла
      const wrFile = (flName, data) => {
         return new Promise((resolve, reject) => {
            fs.writeFile(__dirname + `/../draft/${id}/${flName}`, data, e => {
               if (e) reject("none"); else resolve("yes");
            })
         })
      };

      // Проверяем его роль
      let roles = "000";
      let staff = await dbFind("staff", {login: user[1]});
      if (staff[0]) roles = staff[0].roles.toString(2).padStart(3, '0');
      if (user[1] == ADMIN) roles = "111"; 

      // Есть ли такая статья? Не опубликована ли уже статья?
      // Полномочия имеют только редактор, корректор и автор
      let res = await dbFind("articles", {_id: id});
      if (!res.length) return "none";      
      if (res[0].status == 7) return "none";      
      if (!roles[0] && !roles[1] && artObj.us != user[1]) return "none";

      // Получаем массив с именами уже имеющихся файлов с изображениями
      let namesArr = await rdDir(id);
      namesArr = namesArr.filter(fln => /^\d+\.(jpg|png|svg)$/.test(fln));

      // Если пришел файл, пишем его
      let decoder = new TextDecoder();
      if (decoder.decode(data.slice(0, 10))) {

         // Определяем тип загруженного файла
         const TYPES = {
            "image/jpeg":"jpg", "image/png":"png", "image/svg+xml":"svg"
         };
         let mmTyp;
         try {mmTyp = await getMime(data);} catch(e) {mmTyp = 'a'};
         if (!TYPES[mmTyp]) return "none";
         let ext = TYPES[mmTyp];

         // Определяем имя нового файла
         let num = 0;
         if (namesArr.length) namesArr.map(f => {
            let nm = f.split('.')[0];
            if(Number(nm) > num) num = Number(nm);
         });
         num++;
         let flName = `${num}.${ext}`;

         // Пишем файл по месту
         let flRes = await wrFile(flName, data);
         if (flRes != "yes") return "none";
         namesArr.push(flName);
      }

      return JSON.stringify(namesArr);       
   }
   catch(e) {return "none";}
};
