/**
 * Copyright (c) Meta Platforms, Inc. and affiliates.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/* Forked from https://microsoft.github.io/monaco-editor/ */
const gulp = require("gulp");
const es = require("event-stream");
const path = require("path");
const fs = require("fs");
const os = require('os');
const rimraf = require("rimraf");
const cp = require("child_process");
const CleanCSS = require("clean-css");
const uncss = require("uncss");
const VERSION = fs.readFileSync("../version.txt", "utf-8").trim();
allow_deploy_to_github = process.env.KTFMT_WEBSITE_ALLOW_DEPLOY_TO_GITHUB == '1';
outdir = process.env.KTFMT_WEBSITE_OUTPUT_DIR || path.join(__dirname, '../release-ktfmt-website');
console.log('Using output dir: ' + outdir)
// --- website
const cleanWebsiteTask = function (cb) {
  rimraf(outdir, { maxBusyTries: 1 }, cb);
};
const buildWebsiteTask = function () {
  function replaceWithRelativeResource(dataPath, contents, regex, callback) {
    return contents.replace(regex, function (_, m0) {
      var filePath = path.join(path.dirname(dataPath), m0);
      return callback(m0, fs.readFileSync(filePath));
    });
  }
  var waiting = 0;
  var done = false;
  return es
    .merge(
      gulp
        .src(["**/*"], {
          dot: true,
          ignore: [
            "package.json",
            "package-lock.json",
            "node_modules/**/*",
            "gulpfile.js",
            '.DS_Store',
          ],
        })
        .pipe(
          es.through(
            function (data) {
              if (!data.contents || !/\.(html)$/.test(data.path)) {
                return this.emit("data", data);
              }
              var contents = data.contents.toString();
              contents = contents.replace(/{{version}}/g, VERSION);
              contents = contents.replace(
                /{{year}}/g,
                new Date().getFullYear()
              );
              var allCSS = "";
              var tmpcontents = replaceWithRelativeResource(
                data.path,
                contents,
                /" + output + "";
                        }
                        return "";
                      }
                    );
                  }
                  // Inline javascript
                  contents = replaceWithRelativeResource(
                    data.path,
                    contents,
                    /"
                      );
                    }
                  );
                  data.contents = Buffer.from(
                    contents.split(/\r\n|\r|\n/).join("\n")
                  );
                  this.emit("data", data);
                  if (done && waiting === 0) {
                    this.emit("end");
                  }
                }.bind(this)
              );
            },
            function () {
              done = true;
              if (waiting === 0) {
                this.emit("end");
              }
            }
          )
        )
        .pipe(gulp.dest(outdir))
    )
    .pipe(
      es.through(
        function (data) {
          this.emit("data", data);
        },
        function () {
          // temporarily create package.json so that npm install doesn't bark
          fs.writeFileSync(path.join(outdir, 'package.json'), '{}');
          fs.writeFileSync(path.join(outdir, '.nojekyll'), '');
          cp.execSync('npm install monaco-editor@0.23', {
            cwd: outdir
          });
          rimraf.sync(path.join(outdir, 'node_modules/monaco-editor/dev'));
          rimraf.sync(path.join(outdir, 'node_modules/monaco-editor/esm'));
          fs.unlinkSync(path.join(outdir, 'package.json'));
          this.emit("end");
        }
      )
    );
}
buildWebsiteSeries = gulp.series(cleanWebsiteTask, buildWebsiteTask);
gulp.task("build-website", buildWebsiteSeries);