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

// Возвращает html со статьей
//  id  - это id запрашиваемой статьи :)
// user - это данные клиента [3, "ivanov", "Иванов", "Ян", "Карлович"]
module.exports = async (id, user) => {
   try {
      if (!/^\w{3,20}$/.test(id)) return "none";

      // Промисификатор чтения файла
      const rFile = fl => {
         return new Promise((resolve, reject) => {
            fs.readFile(fl, (e, cnt) => {
               if (e) reject("none"); else resolve(cnt.toString());
            })
         })
      };

      // Проверяем его роль
      let roles = 0;
      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 arts = await dbFind("articles", {_id: id});
      if (!arts[0]) return "none";
      let artObj = arts[0];
      if (artObj.status == 7) return "none";      
      if (!artObj.status) return `
         <!DOCTYPE html><html lang="ru"><head><meta charset="utf-8">
         <title>Просмотр статьи</title></head>
         <body>Статья с id=${id} еще не загружена</body></html>
      `;

      // Показывать ли данные автора статьи? Только редактору и автору
      // Саму статью показываем только сотрудникам редакции и автору
      if (!roles && artObj.us != user[1]) return "none";
      let perm = (roles[0] == '1' || artObj.us == user[1]) ? true : false;

      // Загружаем файл с шаблоном и текстовый файл со статьей
      // __dirname + `/../draft/${id}/article.txt`;
      let cont = await rFile(__dirname + `/../www/include/print.tpl`);
      let art;
      try {art  = await rFile( __dirname + `/../draft/${id}/article.txt`);}
      catch(e) {art = "Аннотации нет¤Текста нет¤";}
      let artArr = art.split('¤');

      // Подготавливаем данные
      let authorArr = artObj.author.split(' '),
               otch = authorArr[2] ? authorArr[2][0] + '. ' : '',
             author = `<nobr>${authorArr[1][0]}. ${otch}${authorArr[0]}</nobr>`,
             famIO  = "<nobr>"
                    + `${authorArr[0]} ${authorArr[1][0]}. ${otch}`.trim()
                    + "</nobr>",
              soavt = '';

      // Если есть соавторы - добавляем их
      if (Object.keys(artObj.coauth).length) for (let lgn in artObj.coauth) {
         if (!lgn.trim()) continue;
         let   fio = artObj.coauth[lgn][0] || "Соавтор не подтвержден",
              sved = artObj.coauth[lgn][1] || "данные не указаны",
            fioArr = fio.split(' '),
               fam = fioArr[0],
                io = `${fioArr[1][0]}. ${fioArr[2][0]}.`;
           author += `, <nobr>${io} ${fam}</nobr>`;
            famIO += `, <nobr>${fam} ${io}</nobr>`;
            soavt += `<br><i>${fio}</i> – ${sved}.`;
      }

      // Делаем замены в шаблоне
      const REPL = {
         "{{title}}"      : perm ? authorArr[0] : "Просмотр статьи",
         "{{УДК}}"        : artObj.udk,
         "{{Заголовок}}"  : artObj.head,
         "{{Автор}}"      : perm ? author : "Фамилия И. О.",
         "{{Аннотация}}"  : artArr[0],
         "{{Ключевые}}"   : artObj.keywords,
         "{{Текст}}"      : artArr[1],
         "{{Литература}}" : artArr[2],         
         "{{ФИО}}"        : perm ? artObj.author : "Фамилия Имя Отчество",
         "{{должность}}"  : perm ? artObj.sved : "данные скрыты",         
         "{{email}}"      : perm ? artObj.eml : "адрес скрыт",
         "{{соавт}}"      : perm ? soavt : '',
         "{{ФамилияИО}}"  : perm ? famIO : "Фамилия И. О.",
         "{{год}}"        : artObj.dt2.split('.')[2],
         "{{дата}}"       : artObj.dt1
      };
      for (let r in REPL) cont = cont.replace(new RegExp(r, 'g'), REPL[r]);

      // Заменяем ссылки на изображения; при использовании этого API
      // для публикации статьи следует затем везде удалить ?draft_<id>/
      cont = cont.replace(
         /\[img (\d+\.\w{3}) /g, "[img ?draft_" + id + "/$1 "
      );

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