import resolve from '@rollup/plugin-node-resolve'
import replace from '@rollup/plugin-replace'
import commonjs from '@rollup/plugin-commonjs'
// import svelte from 'rollup-plugin-svelte-hot'
import svelte from 'rollup-plugin-svelte'
import babel from 'rollup-plugin-babel'
// import { eslint } from 'rollup-plugin-eslint'
// import browsersync from 'rollup-plugin-browsersync'
// import hmr from 'rollup-plugin-hot'
import sveltePreprocess from 'svelte-preprocess'
import { terser } from 'rollup-plugin-terser'
import config from 'sapper/config/rollup.js'
import pkg from './package.json'

// Define environment and things
const mode = process.env.NODE_ENV
const dev = mode === 'development'
const legacy = !!process.env.SAPPER_LEGACY_BUILD
const hot = dev

// Svelte
const onwarn = (warning, onwarn) => (warning.code === 'CIRCULAR_DEPENDENCY' && /[/\\]@sapper[/\\]/.test(warning.message)) || onwarn(warning)

// Preprocessors
const preprocess = sveltePreprocess({
	scss: { includePaths: ['node_modules', 'src'] },
	postcss: true
})


export default {
	/*
	** Client
	*/
	client: {
		input: config.client.input(),
		output: {
			...config.client.output(),
			// ...dev && { exports: 'named' }
		},
		// experimentalCodeSplitting: true,
		plugins: [
			// Javascript
			svelte({
				dev,
				preprocess,
				hydratable: true,
				// emitCss: true,
				// css: css => css.write('public/bundle.css'),
				// ...(!dev && {
				css: css => css.write('static/bundle.css', dev)
				// })
				// hot: hot && {
				// 	// sapper-dev-client expects either webpack or rollup with no HMR, so
				// 	// we need to prevent it from doing full reloads with rollup
				// 	patchSapperDevClient: true,
				// 	// optimistic will try to recover from runtime errors during
				// 	// component init (instead of doing a full reload)
				// 	optimistic: true,
				// }
			}),
			replace({
				'process.browser': true,
				'process.env.NODE_ENV': JSON.stringify(mode)
			}),
			resolve({
				browser: true,
				extensions: ['.mjs', '.js', '.json', '.html', '.svelte', '.scss'],
				dedupe: ['svelte']
			}),
			commonjs(),
			// dev && eslint(),
			!dev && babel({
				extensions: ['.js', '.mjs', '.html', '.svelte'],
				exclude: ['node_modules/@babel/**'],
				runtimeHelpers: true
			}),
			// hot && hmr({
			// 	public: '__sapper__/dev',
			// 	inMemory: true,
			// }),

			// Compress Javascript
			!dev && terser({
				module: true
			}),
		],

		onwarn,
	},


	/*
	** Server
	*/
	server: {
		input: config.server.input(),
		output: config.server.output(),
		plugins: [
			replace({
				'process.browser': false,
				'process.env.NODE_ENV': JSON.stringify(mode)
			}),
			svelte({
				dev,
				preprocess,
				generate: 'ssr'
			}),
			resolve({
				browser: true,
				extensions: ['.mjs', '.js', '.json', '.html', '.svelte', '.scss'],
				dedupe: ['svelte']
			}),
			commonjs(),
		],
		external: Object.keys(pkg.dependencies).concat(
			require('module').builtinModules || Object.keys(process.binding('natives'))
		),

		onwarn,
	},


	/*
	** Service worker
	*/
	// serviceworker: {
	// 	input: config.serviceworker.input(),
	// 	output: config.serviceworker.output(),
	// 	plugins: [
	// 		resolve(),
	// 		replace({
	// 			'process.browser': true,
	// 			'process.env.NODE_ENV': JSON.stringify(mode)
	// 		}),
	// 		commonjs(),
	// 		!dev && terser()
	// 	],

	// 	onwarn,
	// }
}
