const pluginRev = require("eleventy-plugin-rev");
const pluginSass = require("eleventy-sass");
const pluginTinyHtml = require("@sardine/eleventy-plugin-tinyhtml");
const pluginNavigation = require("@11ty/eleventy-navigation");

module.exports = function (eleventyConfig) {
    eleventyConfig.addPlugin(pluginRev);
    eleventyConfig.addPlugin(pluginTinyHtml);
    eleventyConfig.addPlugin(pluginSass, {
        sass: {
            loadPaths: ["node_modules"],
            style: "compressed",
            sourceMap: false,
        },
        compileOptions: {
            permalink: function (contents, inputPath) {
                return (data) => {
                    return data.page.filePathStem.replace(/^\/scss\//, "/css/") + ".css";
                };
            }
        },
        rev: true
    });
    eleventyConfig.addPlugin(pluginNavigation);

    eleventyConfig.setUseGitIgnore(false);
    eleventyConfig.addPassthroughCopy({
        "src/img": "img",
        "src/font": "font",
        "src/favicon.*": "",
    });
    eleventyConfig.addShortcode("translatedUrl", function (currentLocale, newLocale) {
        return this.page.url.replace(new RegExp(`\/${currentLocale}\/`), `/${newLocale}/`);
    });

    eleventyConfig.addFilter('year', function (value) {
        return value * 12;
    });

    eleventyConfig.addFilter("sum", function (value) {
        return value.map(d => d.amount).reduce((a, b) => a + b, 0);
    });

    eleventyConfig.addFilter("amount", function (value) {
        // TODO update language dynamically
        return value.toLocaleString('de', {minimumFractionDigits: 2});
    });

    eleventyConfig.addFilter("banktransfers", function (donations) {
        return donations
            .flatMap(y => y.donations)
            .filter(d => d.via === 'banktransfer')
            .filter(d => d.first)
            .length;
    });

    eleventyConfig.addFilter("cash", function (donations) {
        return donations
            .flatMap(y => y.donations)
            .filter(d => d.via === 'cash')
            .filter(d => d.first)
            .length;
    });

    eleventyConfig.addCollection("series", function (collectionApi) {
        return collectionApi.getAll()
            .filter(p => p.data?.series)
            .sort((p0, p1) => p0.data.order - p1.data.order)
            .reduce((series, post) => {
                series[post.data.series] = series[post.data.series] ?? [];
                series[post.data.series].push(post);
                return series;
            }, {});
    });

    return {
        // Pre-process *.md files with: (default: `liquid`)
        markdownTemplateEngine: "njk",
        // Pre-process *.html files with: (default: `liquid`)
        htmlTemplateEngine: "njk",
        // Opt-out of pre-processing global data JSON files: (default: `liquid`)
        dataTemplateEngine: false,

        dir: {
            input: "src",
            includes: "_includes",
            layouts: "_includes/layouts",
            data: "_data",
            output: "dist"
        }
    };
};
