// @ts-check
const path = require('path');
const { startDevServer } = require('@cypress/webpack-dev-server');
const tryLoadWebpackConfig = require('./utils/tryLoadWebpackConfig');

/** @type {(config: Cypress.PluginConfigOptions, path: string) => string} */
function normalizeWebpackPath(config, webpackConfigPath) {
  return path.isAbsolute(webpackConfigPath)
    ? webpackConfigPath
    : path.resolve(config.projectRoot, webpackConfigPath);
}

/**
 * Injects dev-server based on the webpack config file.
 *
 * **Important:** `webpackFilename` path is relative to the project root (cypress.json location)
 * @type {(on: Cypress.PluginEvents, config: Cypress.PluginConfigOptions, options: { webpackFilename: string  }) => Cypress.PluginConfigOptions}
 */
function injectWebpackDevServer(on, config, { webpackFilename }) {
  const webpackConfig = tryLoadWebpackConfig(
    normalizeWebpackPath(config, webpackFilename)
  );

  if (!webpackConfig) {
    throw new Error(
      `Can not load webpack config from path ${webpackFilename}.`
    );
  }

  on('dev-server:start', async (options) => {
    return startDevServer({ options, webpackConfig });
  });

  config.env.reactDevtools = true;

  return config;
}

module.exports = injectWebpackDevServer;