// rollup.config.js
import fs from 'fs'
import path from 'path'
import vue from 'rollup-plugin-vue'
import alias from '@rollup/plugin-alias'
import commonjs from '@rollup/plugin-commonjs'
import resolve from '@rollup/plugin-node-resolve'
import replace from '@rollup/plugin-replace'
import babel from '@rollup/plugin-babel'
import PostCSS from 'rollup-plugin-postcss'
import { terser } from 'rollup-plugin-terser'
import typescript from '@rollup/plugin-typescript'
import minimist from 'minimist'
import image from '@rollup/plugin-image'

// Get browserslist config and remove ie from es build targets
const esbrowserslist = fs
  .readFileSync('./.browserslistrc')
  .toString()
  .split('\n')
  .filter((entry) => entry && entry.substring(0, 2) !== 'ie')

// Extract babel preset-env config, to combine with esbrowserslist
const babelPresetEnvConfig = require('../babel.config').presets.filter(
  (entry) => entry[0] === '@babel/preset-env',
)[0][1]

const argv = minimist(process.argv.slice(2))

const projectRoot = path.resolve(__dirname, '..')

const baseConfig = {
  input: 'src/entry.ts',
  plugins: {
    preVue: [
      alias({
        entries: [
          {
            find: '@',
            replacement: `${path.resolve(projectRoot, 'src')}`,
          },
        ],
      }),
    ],
    replace: {
      'process.env.NODE_ENV': JSON.stringify('production'),
    },
    vue: { preprocessStyles: true },
    postVue: [
      resolve({
        extensions: ['.js', '.jsx', '.ts', '.tsx', '.vue'],
      }),
      PostCSS(),
      // Process only `<style module>` blocks.
      // PostCSS({
      //   modules: {
      //     generateScopedName: '[local]___[hash:base64:5]',
      //   },
      //   include: /&module=.*\.stylus$/,
      // }),
      // Process all `<style>` blocks except `<style module>`.
      // PostCSS({
      //   include: /(?<!&module=.*)\.stylus$/,
      //   plugins: [
      //     postcssImport({
      //       resolve(id, basedir) {
      //         // // resolve alias @css, @import '@css/style.css'
      //         // // because @css/ has 5 chars
      //         // if (id.startsWith("@css")) {
      //         //   return path.resolve("./src/assets/styles/css", id.slice(5));
      //         // }

      //         // // resolve node_modules, @import '~normalize.css/normalize.css'
      //         // // similar to how css-loader's handling of node_modules
      //         // if (id.startsWith("~")) {
      //         //   return path.resolve("./node_modules", id.slice(1));
      //         // }

      //         // resolve relative path, @import './components/style.css'
      //         return path.resolve(basedir, id)
      //       },
      //     }),
      //   ],
      // }),
      commonjs(),
    ],
    babel: {
      exclude: 'node_modules/**',
      extensions: ['.js', '.jsx', '.ts', '.tsx', '.vue'],
      babelHelpers: 'bundled',
    },
  },
}

// ESM/UMD/IIFE shared settings: externals
// Refer to https://rollupjs.org/guide/en/#warning-treating-module-as-external-dependency
const external = [
  // list external dependencies, exactly the way it is written in the import statement.
  // eg. 'jquery'
  'vue',
]

// UMD/IIFE shared settings: output.globals
// Refer to https://rollupjs.org/guide/en#output-globals for details
const globals = {
  // Provide global variable names to replace your external imports
  // eg. jquery: '$'
  vue: 'Vue',
}

// Customize configs for individual targets
const buildFormats = []
if (!argv.format || argv.format === 'es') {
  const esConfig = {
    ...baseConfig,
    input: 'src/entry.esm.ts',
    external,
    output: {
      file: 'dist/component-lib.esm.js',
      format: 'esm',
      exports: 'named',
    },
    plugins: [
      image(),
      replace(baseConfig.plugins.replace),
      ...baseConfig.plugins.preVue,
      vue(baseConfig.plugins.vue),
      ...baseConfig.plugins.postVue,
      // Only use typescript for declarations - babel will
      // do actual js transformations
      // typescript({
      //   typescript: ttypescript,
      //   useTsconfigDeclarationDir: true,
      //   emitDeclarationOnly: true,
      // }),
      typescript(),
      babel({
        ...baseConfig.plugins.babel,
        presets: [
          [
            '@babel/preset-env',
            {
              ...babelPresetEnvConfig,
              targets: esbrowserslist,
            },
          ],
        ],
      }),
    ],
  }
  buildFormats.push(esConfig)
}

if (!argv.format || argv.format === 'cjs') {
  const umdConfig = {
    ...baseConfig,
    external,
    output: {
      compact: true,
      file: 'dist/component-lib.ssr.js',
      format: 'cjs',
      name: 'ComponentLib',
      exports: 'auto',
      globals,
    },
    plugins: [
      image(),
      replace(baseConfig.plugins.replace),
      ...baseConfig.plugins.preVue,
      vue(baseConfig.plugins.vue),
      ...baseConfig.plugins.postVue,
      babel(baseConfig.plugins.babel),
    ],
  }
  buildFormats.push(umdConfig)
}

if (!argv.format || argv.format === 'iife') {
  const unpkgConfig = {
    ...baseConfig,
    external,
    output: {
      compact: true,
      file: 'dist/component-lib.min.js',
      format: 'iife',
      name: 'ComponentLib',
      exports: 'auto',
      globals,
    },
    plugins: [
      image(),
      replace(baseConfig.plugins.replace),
      ...baseConfig.plugins.preVue,
      vue(baseConfig.plugins.vue),
      ...baseConfig.plugins.postVue,
      babel(baseConfig.plugins.babel),
      terser({
        output: {
          ecma: 5,
        },
      }),
    ],
  }
  buildFormats.push(unpkgConfig)
}

// Export config
export default buildFormats
