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

// Возвращает success или none
// data - это массив вида ["editor", id, notes, resol], где
//        "editor" - редактор, "reviewer" - рецензент
//              id - id статьи
//           notes - собственно замечания
//           resol - необязательный аргумент, резолюция рецензента:
//                   "disc", "edit" или "print"
// user - это данные клиента [3, "ivanov", "Иванов", "Ян", "Карлович"]
module.exports = async (data, user) => {

   const flName = data[0] == "editor" ? "editor.txt" : "reviewer.txt",
            who = data[0] == "editor" ? "редактора" : "рецензента",
             id = data[1] ? data[1] : '',
          notes = data[2] ? data[2].substr(0, 10000).trim() : '';
   if (!id || !notes) return "none";

   try {      
      // Промисификатор записи файла
      const wrFile = cont => {
         return new Promise((resolve, reject) => {
            fs.writeFile(__dirname + `/../draft/${id}/${flName}`, cont, 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";
         staff[0] = {login: ADMIN};
      }
      if (!roles[0] && !roles[2]) return "none";
      
      // Есть ли такая статья и не опубликована ли она уже?
      let res = await dbFind("articles", {_id: id});
      if (!res.length)        return "none";
      if (res[0].status == 7) return "none";

      // Определяем автора статьи и его почту, заголовок статьи
      let author = res[0].author,
            sved = res[0].sved,
             eml = res[0].eml,
           title = res[0].head;

      // Пишем файл с замечаниями
      let resWrite = await wrFile(notes);
      if (resWrite != "yes") return "none";

      // Посылаем письмо автору
      let text = `Уважаемый(ая) ${author}!\n\n`
         + `Ваша статья «${title}» рассмотрена. Получены замечания ${who}:\n\n`
         + `===НАЧАЛО ЗАМЕЧАНИЙ\n${notes}\n===КОНЕЦ ЗАМЕЧАНИЙ`;
      let zagol = "Статья отклонена";
      if (!data[3] || data[3] == "edit") {
         zagol = `Замечания ${who}`;
         text += "\n\nДля доработки статьи зайдите в раздел сайта "
               + "«Мои статьи» и кликните на значке карандаша справа от "
               + "названия статьи. После внесения вами изменений статья "
               + "будет рассмотрена повторно.";
      }
      if (data[3] == "print") zagol = "Статья одобрена";
      let resEml = await sendEml(eml, zagol, text);

      // Новые статус и дата для записи в базу
      let now = (new Date()).toISOString().split('T')[0]
              . replace(/(\d+)-(\d+)-(\d+)/, "$3.$2.$1");
      let newStatus = data[0] == "editor" ? 2 : 4;

      // Если рецензент предлагает удалить или опубликовать статью,
      // пишем письмо главному редактору
      let resEmlRed = 'a';
      if (data[3] == "disc") {
         resEmlRed = await sendEml(ADMEML, "Статья к удалению",
              `Статья ${id} рекомендована к удалению рецензентом `
            + `${staff[0].login}.\nАвтор статьи: ${author}, ${sved}.\n`
            + `Заголовок статьи: ${title}.\nЗамечания рецензента:\n\n${notes}`
         );
      }
      if (data[3] == "print") {
         resEmlRed = await sendEml(ADMEML, "Статья к корректуре",
              `Статья ${id} одобрена рецензентом ${staff[0].login}.\n`
            + `Необходимо направить статью корректору.`
         );
         newStatus = 5;
      }
      if (!resEml || !resEmlRed) return "none";
      
      // Меняем статус и время последней операции в базе статей      
      await db.articles.update(
         {_id: id}, {$set: {status: newStatus, dt2: now}}, {}
      );

      return "success";
   }
   catch(e) {return "none";}
};
