/**
 * Copyright (C) 2018-2019  The Software Heritage developers
 * See the AUTHORS file at the top-level directory of this distribution
 * License: GNU Affero General Public License version 3, or any later version
 * See top-level LICENSE file for more information
 */

import DOMPurify from 'dompurify';

import {handleFetchError} from 'utils/functions';

DOMPurify.addHook('uponSanitizeAttribute', function(node, data) {
  if (node.nodeName === 'IMG' && data.attrName === 'src') {
    // remove leading slash from image src to fix rendering
    if (data.attrValue.startsWith('/')) {
      data.attrValue = data.attrValue.slice(1);
    }
  }
});

export function filterXSS(html) {
  return DOMPurify.sanitize(html);
}

export async function renderMarkdown(domElt, markdownDocUrl) {

  let showdown = await import(/* webpackChunkName: "showdown" */ 'utils/showdown');

  $(document).ready(() => {
    let converter = new showdown.Converter({tables: true});
    fetch(markdownDocUrl)
      .then(handleFetchError)
      .then(response => response.text())
      .then(data => {
        $(domElt).addClass('swh-showdown');
        $(domElt).html(filterXSS(converter.makeHtml(data)));
      })
      .catch(() => {
        $(domElt).text('Readme bytes are not available');
      });
  });

}

export async function renderOrgData(domElt, orgDocData) {

  let org = await import(/* webpackChunkName: "org" */ 'utils/org');

  let parser = new org.Parser();
  let orgDocument = parser.parse(orgDocData, {toc: false});
  let orgHTMLDocument = orgDocument.convert(org.ConverterHTML, {});
  $(domElt).addClass('swh-org');
  $(domElt).html(filterXSS(orgHTMLDocument.toString()));
  // remove toc and section numbers to get consistent
  // with other readme renderings
  $('.swh-org ul').first().remove();
  $('.section-number').remove();

}

export function renderOrg(domElt, orgDocUrl) {

  $(document).ready(() => {
    fetch(orgDocUrl)
      .then(handleFetchError)
      .then(response => response.text())
      .then(data => {
        renderOrgData(domElt, data);
      })
      .catch(() => {
        $(domElt).text('Readme bytes are not available');
      });
  });

}

export function renderTxt(domElt, txtDocUrl) {

  $(document).ready(() => {
    fetch(txtDocUrl)
      .then(handleFetchError)
      .then(response => response.text())
      .then(data => {
        let orgMode = '-*- mode: org -*-';
        if (data.indexOf(orgMode) !== -1) {
          renderOrgData(domElt, data.replace(orgMode, ''));
        } else {
          $(domElt).addClass('swh-readme-txt');
          $(domElt)
            .html('')
            .append($('<pre></pre>').text(data));
        }
      })
      .catch(() => {
        $(domElt).text('Readme bytes are not available');
      });
  });

}
