const cheerio = require('gulp-cheerio');
const env = process.env.CAMEL_ENV || 'development';
const gulp = require('gulp');
const htmlmin = require('gulp-htmlmin');

/**
 * We minify all HTML files using htmlmin, this is to make them smaller in size
 * as we generate quite big HTML files in the documentation. We do not do this
 * unless the environment variable `CAMEL_ENV` is set to 'production' to help
 * with the development turnaround as this takes quite a while to do.
 */
gulp.task('minify', (done) => {
  if (env !== 'production') {
    done();
    return;
  }

  return gulp.src('public/**/*.html')
    .pipe(htmlmin({
      collapseBooleanAttributes: true,
      collapseWhitespace: true,
      collapseInlineTagWhitespace: true,
      conservativeCollapse: true,
      useShortDoctype: true
    }))
    .pipe(gulp.dest('public'));
});

/*
 * Appends `sitemap-website.xml` to the `sitemap.xml`.
 *
 * We have sitemaps generated by Antora for each documentation component, these
 * are generated in `documentation/sitemap-*.xml` along with the
 * `documentation/sitemap.xml` that is a sitemap index pointing to each
 * component sitemap.
 *
 * Hugo also generates a sitemap in `public/sitemap-website.xml` containing all
 * pages generated from `content/` and other sources. We need to add the
 * `sitemap-website.xml` to the `sitemap.xml` so that we have a sitemap index
 * containing pointers to all individual sitemaps.
 *
 * Sitemaps are used by search engines (Google, Algolia, ...) to help them crawl
 * and index the website.
 */
gulp.task('sitemap', (done) => {
  return gulp.src('public/sitemap.xml')
    .pipe(cheerio(($, f) =>
      $('sitemapindex').append(`<sitemap>
<loc>https://camel.apache.org/sitemap-website.xml</loc>
</sitemap>`)
    ))
    .pipe(gulp.dest('public'));
});
