/**
 *   РАБОТА С ПОДТВЕРЖДЕНИЕМ СОАВТОРСТВА
 *   Copyright © 2021, А.М.Гольдин. ISC license
 */
"use strict";

// arg  - это объект с данными соавтора
//        Если он пуст, просто отдаем данные статей, требующих подтверждения
//        Возвращает массив с элементами - объектами (данными статей)
//        Если arg не пуст, возвращает success в случае успешного подтверждения
// user - это данные клиента [3, "ivanov", "Иванов", "Ян", "Карлович"]


module.exports = async (arg, user) => {
   try {
      // Промисификатор записи в базу
      const wrBase = (id, soavtObj) => {
         return new Promise((resolve, reject) => {
            db.articles.update(
               {_id: id},
               {$set: {coauth: soavtObj}},
               {},
               (e, n) => {if (e) reject("none"); else resolve("yes");}
            )
         })
      };

      // Если получен запрос на перечень статей, требующих подтверждения
      if (!Object.keys(arg).length) {
         // Получаем все статьи, где этот юзер указан соавтором
         // и это соавторство не подтверждено
         let res = await dbFind("articles", {$where: function () {
            if (!this.coauth[user[1]]) return false;
            return (this.status < 7 && this.coauth[user[1]].length == 0);
         }});
         let resArr = [];
         for (let art of res) resArr.push(
            {id: art._id, auth: art.author, title: art.head}
         );
         return JSON.stringify(resArr);
      }

      // Если получен запрос на обновление данных о соавторах
      else {
         let res = await dbFind("articles", {_id: arg.id});
         if (!res.length) return "none";
         let soavt = res[0].coauth;

         // Если запрос пришел от редактора, проверяем, редактор ли он
         // и формируем данные для записи в базу
         if (arg.lgn) {
            // Правда ли он редактор?
            if (user[1] !== ADMIN) {
               let staff = await dbFind("staff", {login: user[1]});
               if (!staff.length) return "none";
               if (!staff[0].roles.toString(2).padStart(3, '0')[0])
                  return "none";
            }

            // Заявлен ли данный соавтор автором статьи?
            if (!soavt[arg.lgn]) return "none";

            // Формируем новый объект с соавторами            
            soavt[arg.lgn] = [arg.fio, arg.sved];
         }
         // Если запрос от самого соавтора
         else {
            // Правда ли он указан соавтором этой статьи?            
            if (!soavt[user[1]]) return "none";

            // Формируем новый объект с соавторами
            soavt[user[1]] = [`${user[2]} ${user[3]} ${arg.otch}`, arg.sved];
         }

         // Пишем в базу
         let baseRes = await wrBase(arg.id, soavt);       
         return baseRes == "yes" ? "success" : "none";
      }
   }
   catch(e) {return "none";}
};
