/* eslint-env node */

import * as path from "path";
import { Configuration as WebpackConfiguration } from "webpack";
import { Configuration as WebpackDevServerConfiguration } from "webpack-dev-server";
import { ConsoleRemotePlugin } from "@openshift-console/dynamic-plugin-sdk-webpack";

const CopyWebpackPlugin = require("copy-webpack-plugin");

const isProd = process.env.NODE_ENV === "production";

interface Configuration extends WebpackConfiguration {
  devServer?: WebpackDevServerConfiguration;
}

const config: Configuration = {
  mode: isProd ? "production" : "development",
  // No regular entry points needed. All plugin related scripts are generated via ConsoleRemotePlugin.
  entry: {},
  context: path.resolve(__dirname, "src"),
  output: {
    path: path.resolve(__dirname, "dist"),
    filename: isProd ? "[name]-bundle-[hash].min.js" : "[name]-bundle.js",
    chunkFilename: isProd
      ? "[name]-chunk-[chunkhash].min.js"
      : "[name]-chunk.js",
  },
  resolve: {
    extensions: [".ts", ".tsx", ".js", ".jsx"],
  },
  module: {
    rules: [
      {
        test: /\.(jsx?|tsx?)$/,
        exclude: /\/node_modules\//,
        use: [
          {
            loader: "ts-loader",
            options: {
              configFile: path.resolve(__dirname, "tsconfig.json"),
            },
          },
        ],
      },
      {
        test: /\.(css)$/,
        use: ["style-loader", "css-loader"],
      },
      {
        test: /\.(png|jpg|jpeg|gif|svg|woff2?|ttf|eot|otf)(\?.*$|$)/,
        type: "asset/resource",
        generator: {
          filename: isProd ? "assets/[contenthash][ext]" : "assets/[name][ext]",
        },
      },
      {
        test: /\.(m?js)$/,
        resolve: {
          fullySpecified: false,
        },
      },
    ],
  },
  devServer: {
    static: "./dist",
    port: 9001,
    // Allow Bridge running in a container to connect to the plugin dev server.
    allowedHosts: "all",
    headers: {
      "Access-Control-Allow-Origin": "*",
      "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, PATCH, OPTIONS",
      "Access-Control-Allow-Headers":
        "X-Requested-With, Content-Type, Authorization",
    },
    devMiddleware: {
      writeToDisk: true,
    },
  },
  plugins: [
    new ConsoleRemotePlugin({
      name: "devns-console-plugin",
      version: "0.0.1",
      displayName: "DevNS Console Plugin",
      description:
        "Manage namespace resource limits with pause/unpause functionality",
      exposedModules: {
        namespacePauseAction: "./components/NamespacePauseAction",
      },
      extensions: [
        {
          type: "console.action/provider",
          properties: {
            contextId: "namespace-dropdown",
            provider: {
              $codeRef: "namespacePauseAction.useNamespacePauseAction",
            },
          },
        },
      ],
    }),
    new CopyWebpackPlugin({
      patterns: [{ from: path.resolve(__dirname, "locales"), to: "locales" }],
    }),
  ],
  devtool: isProd ? false : "source-map",
  optimization: {
    chunkIds: isProd ? "deterministic" : "named",
    minimize: isProd,
  },
};

export default config;
