'use strict';

/* eslint-disable
  no-shadow,
  global-require,
  multiline-ternary,
  array-bracket-spacing,
  space-before-function-paren
*/
const open = require('opn');

const colors = {
  info(useColor, msg) {
    if (useColor) {
      // Make text blue and bold, so it *pops*
      return `\u001b[1m\u001b[34m${msg}\u001b[39m\u001b[22m`;
    }

    return msg;
  },
  error(useColor, msg) {
    if (useColor) {
      // Make text red and bold, so it *pops*
      return `\u001b[1m\u001b[31m${msg}\u001b[39m\u001b[22m`;
    }

    return msg;
  },
};

// eslint-disable-next-line
const defaultTo = (value, def) => {
  return value == null ? def : value;
};

function version() {
  return (
    `webpack-dev-server ${require('../package.json').version}\n` +
    `webpack ${require('webpack/package.json').version}`
  );
}

function status(uri, options, log, useColor) {
  const contentBase = Array.isArray(options.contentBase)
    ? options.contentBase.join(', ')
    : options.contentBase;

  if (options.socket) {
    log.info(`Listening to socket at ${colors.info(useColor, options.socket)}`);
  } else {
    log.info(`Project is running at ${colors.info(useColor, uri)}`);
  }

  log.info(
    `webpack output is served from ${colors.info(useColor, options.publicPath)}`
  );

  if (contentBase) {
    log.info(
      `Content not from webpack is served from ${colors.info(
        useColor,
        contentBase
      )}`
    );
  }

  if (options.historyApiFallback) {
    log.info(
      `404s will fallback to ${colors.info(
        useColor,
        options.historyApiFallback.index || '/index.html'
      )}`
    );
  }

  if (options.bonjour) {
    log.info(
      'Broadcasting "http" with subtype of "webpack" via ZeroConf DNS (Bonjour)'
    );
  }

  if (options.open) {
    let openOptions = {};
    let openMessage = 'Unable to open browser';

    if (typeof options.open === 'string') {
      openOptions = { app: options.open };
      openMessage += `: ${options.open}`;
    }

    open(uri + (options.openPage || ''), openOptions).catch(() => {
      log.warn(
        `${openMessage}. If you are running in a headless environment, please do not use the --open flag`
      );
    });
  }
}

function bonjour(options) {
  const bonjour = require('bonjour')();

  bonjour.publish({
    name: 'Webpack Dev Server',
    port: options.port,
    type: 'http',
    subtypes: ['webpack'],
  });

  process.on('exit', () => {
    bonjour.unpublishAll(() => {
      bonjour.destroy();
    });
  });
}

module.exports = {
  status,
  colors,
  version,
  bonjour,
  defaultTo,
};