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,
      processScripts: ['application/ld+json']
    }))
    .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'));
});

/*
 * Removes the content from the `public` directory.
 */
gulp.task('clean', () => {
  return require('del')('public');
});
