const Nunjucks = require('nunjucks');
const dayjs = require('dayjs');
const utc = require('dayjs/plugin/utc')
const timezone = require('dayjs/plugin/timezone')
const localizedFormat = require('dayjs/plugin/localizedFormat')
const hljs = require('highlight.js/lib/common');
const { setup } = require('highlightjs-glimmer');
const markdownit = require('markdown-it');
const markdownitClass = require('@toycode/markdown-it-class');
const cheerio = require('cheerio');

const expectedInputFormat = 'YYYY-MM-DD';
const defaultOuputFormat = 'LL';
dayjs.extend(utc);
dayjs.extend(timezone);
dayjs.extend(localizedFormat);
function dayjsFilter(date, format = defaultOuputFormat) {
  return dayjs(date, expectedInputFormat).utc().format(format);
}

const markdownClassMapping = {
  h1: ['text-6xl', 'mt-6', 'text-pink'],
  h2: ['text-3xl', 'mt-6', 'text-text'],
  h3: ['text-2xl', 'mt-4', 'text-text'],
  h4: ['text-xl', 'mt-2', 'text-text'],
  h5: ['text-lg', 'mt-2', 'text-text'],
  h6: ['mt-2', 'text-text'],
  blockquote: ['border-l-2', 'border-lavender', 'px-4', 'pt-4', 'pb-px', 'my-8', 'bg-mantle'],
  a: ['link'],
  s: ['text-red'],
  p: ['mb-4', 'text-text', 'leading-7'],
  strong: ['font-normal', 'text-peach', 'dark:text-yellow'],
  em: ['italic', 'text-green'],
  img: ['max-w-full', 'rounded-lg', 'max-h-600px', 'contrast-more:contrast-50'], // (contrast-more-50 here undoes the content contrast boost elsewhere)
  video: ['max-w-full', 'rounded-lg', 'max-h-600px', 'contrast-more:contrast-50'], // (contrast-more-50 here undoes the content contrast boost elsewhere)
  ul: ['list-disc', 'ml-4', 'text-subtext0'],
  li: ['text-subtext0'],
};

setup(hljs);
const md = markdownit({
  linkify: true,
  html: true,
  highlight: function(str, lang) {
    if (lang && hljs.getLanguage(lang)) {
      try {
        return hljs.highlight(str, { language: lang }).value;
      } catch (__) {}
    }

    return ''; // use external default escaping
  }
});
md.use(markdownitClass, markdownClassMapping);

module.exports = function(eleventyConfig) {
  let nunjucksEnvironment = new Nunjucks.Environment(
    new Nunjucks.FileSystemLoader("_includes")
  );

  eleventyConfig.setLibrary('md', md);

  eleventyConfig.addPassthroughCopy('img');
  eleventyConfig.addPassthroughCopy('files');

  eleventyConfig.addCollection(
    "pinned",
    collection => collection.getAllSorted().filter(item => item.data.pinned),
  );

  eleventyConfig.addFilter('markdown', value => md.render(value));
  eleventyConfig.addFilter('markdownToPlaintext', value => {
    const htmlString = md.render(value);
    const parser = cheerio.load(htmlString);
    return parser.text();
  });
  eleventyConfig.addNunjucksFilter('date', dayjsFilter);

  eleventyConfig.setLibrary('njk', nunjucksEnvironment);
};
