module.exports = function (grunt) {
  const dedent = require("dedent-js");
  // Project configuration.
  grunt.initConfig({
    pkg: grunt.file.readJSON("package.json"),
    terser: {
      options: {
        // Task-specific options go here.
      },
      build: {
        // Target-specific file lists and/or options go here.
        src: "src/main/resources/static/js/bundle.js",
        dest: "src/main/resources/static/js/bundle.min.js",
      },
      chat_worker: {
        src: "src/main/resources/static/js/chatWorker.js",
        dest: "src/main/resources/static/js/chatWorker.min.js",
      },
      admin_bundle: {
        src: "src/main/resources/static/js/adminBundle.js",
        dest: "src/main/resources/static/js/adminBundle.min.js",
      },
    },
    banner: dedent(`
       /*
        * -----------------------------------------
        * @date <%= grunt.template.today("yyyy-mm-dd") %>
        * @project Chatto
        * @author nova
        * @license GPL
        * -----------------------------------------
        */ 
        `),
    usebanner: {
      dist: {
        options: {
          position: "top",
          banner: "<%= banner %>",
        },
        files: {
          src: [
            "src/main/resources/static/js/bundle.min.js",
            "src/main/resources/static/js/adminBundle.min.js",
            "src/main/resources/static/js/chatWorker.min.js",
          ],
        },
      },
    },
    browserify: {
      chat_worker_dev: {
        src: "src/main/frontend/workers/encryption-worker/main.ts",
        dest: "src/main/resources/static/js/chatWorker.js",
        options: {
          browserifyOptions: {
            debug: true,
          },
        },
      },
      dev: {
        src: "src/main/frontend/chat/main.ts",
        dest: "src/main/resources/static/js/bundle.js",
        options: {
          browserifyOptions: {
            debug: true,
          },
        },
      },
      prod: {
        src: "src/main/frontend/chat/main.ts",
        dest: "src/main/resources/static/js/bundle.js",
        banner: '/*! Chat.js <%= grunt.template.today("yyyy-mm-dd") %> */ ',
        options: {
          browserifyOptions: {
            debug: false,
          },
        },
      },
      chat_worker_prod: {
        src: "src/main/frontend/workers/encryption-worker/main.ts",
        dest: "src/main/resources/static/js/chatWorker.js",
      },
      admin_bundle_dev: {
        src: "src/main/frontend/admin/main.ts",
        dest: "src/main/resources/static/js/adminBundle.js",
        options: {
          browserifyOptions: {
            debug: true,
          },
        },
      },
      admin_bundle_prod: {
        src: "src/main/frontend/admin/main.ts",
        dest: "src/main/resources/static/js/adminBundle.js",
        banner: '/*! Chat.js <%= grunt.template.today("yyyy-mm-dd") %> */ ',
        options: {
          browserifyOptions: {
            debug: false,
          },
        },
      },
      options: {
        plugin: [
          [
            "tsify",
            {
              target: "ES6",
              noImplicitAny: true,
              esModuleInterop: true,
              allowSyntheticDefaultImports: true,
            },
          ], // register plugin by name
        ],

        browserifyOptions: {},
      },
    },
  });

  // Load the plugin that provides the "uglify" task.
  grunt.loadNpmTasks("grunt-terser");

  // // Default task(s).
  // grunt.registerTask('default', ['uglify']);

  grunt.loadNpmTasks("grunt-browserify");
  grunt.loadNpmTasks("grunt-banner");

  grunt.registerTask("default", [
    "browserify:dev",
    "browserify:chat_worker_dev",
    "browserify:admin_bundle_dev",
  ]);
  grunt.registerTask("prod", [
    "browserify:prod",
    "browserify:chat_worker_prod",
    "browserify:admin_bundle_prod",
    "terser",
    "usebanner",
  ]);
};
