/* eslint-disable @typescript-eslint/no-var-requires */
'use strict'

/**
 * This file overrides the default services webpack config.
 * This services config enables the use of TypeScript.
 *
 * @override node_modules/cozy-scripts/config/webpack.config.services.js
 */

const webpack = require('webpack')
const path = require('path')
const fs = require('fs-extra')
const paths = require('cozy-scripts/utils/paths')
const {
  eslintFix,
  makeFilename,
  target,
} = require('cozy-scripts/config/webpack.vars')

const servicesFolder = paths.appServicesFolder()
const servicesPaths = fs.existsSync(servicesFolder)
  ? fs.readdirSync(servicesFolder)
  : []

const servicesEntries = {}
servicesPaths.forEach(file => {
  if (!file.match(/^[^.]*.ts$/)) return
  const filename = file.match(/^([^.]*).ts$/)[1]
  servicesEntries[filename] = path.resolve(path.join(servicesFolder, file))
})

const config = {
  __mergeStrategy: {
    smart: false,
    strategy: {
      plugins: 'replace',
      output: 'replace',
      entry: 'replace',
      optimization: 'replace',
      module: 'replace',
      externals: 'replace',
    },
  },
  entry: servicesEntries,
  output: {
    path: paths.appServicesBuild(),
    filename: `${makeFilename(false)}.js`,
  },
  target: 'node',
  optimization: {}, // reset optimization property
  devtool: false,
  externals: [], // reset externals property
  module: {
    rules: [
      {
        enforce: 'pre',
        test: /\.ts$/,
        loader: require.resolve('cozy-scripts/node_modules/eslint-loader'),
        exclude: /node_modules/,
        options: {
          extends: ['cozy-app'],
          fix: eslintFix,
          emitWarning: true,
        },
      },
      {
        test: /\.hbs$/,
        loader: 'handlebars-loader',
      },
      {
        test: path.resolve(__dirname, 'node_modules/uglify-js/tools/node.js'),
        loader: 'null-loader',
      },
      {
        test: /\.ts$/,
        exclude: /(node_modules|cozy-(bar|client-js))/,
        loader: require.resolve('cozy-scripts/node_modules/babel-loader'),
        options: {
          cacheDirectory: 'cozy-scripts/node_modules/.cache/babel-loader/node',
          babelrc: false,
          presets: [['cozy-app', { node: true, react: false }]],
        },
      },
    ],
  },
  plugins: [
    new webpack.DefinePlugin({
      __TARGET__: JSON.stringify('services'),
      __IS_ALPHA__: false,
    }),
  ],
}

/* We don't build services if no services and if on mobile build */
const addServicesConfig =
  target === 'browser' && Object.keys(servicesEntries).length

// only for browser target (services are usable only on cozy-stack)
module.exports = addServicesConfig ? { multiple: { services: config } } : {}