const rollup  = require( 'rollup' ).rollup;
const esbuild = require( 'rollup-plugin-esbuild' ).default;
const babel   = require( '@rollup/plugin-babel' );
const resolve = require( '@rollup/plugin-node-resolve' ).nodeResolve;
const path    = require( 'path' );
const minify  = require( './plugins/minify' ).minify;
const banner  = require( './constants/banner' );
const fs      = require( 'fs' ).promises;
const zlib    = require( 'zlib' );
const name    = 'splide';


async function buildScript( compress, type = 'default' ) {
  const file = `./dist/js/${ name }${ type !== 'default' ? `-${ type }` : '' }${ compress ? '.min' : '' }.js`;

  const bundle = await rollup( {
    input: `./src/js/build/${ type }.ts`,
    plugins: [
      resolve(),
      esbuild( { minify: false } ),
      babel.getBabelOutputPlugin( {
        configFile: path.resolve( __dirname, '../.babelrc' ),
        allowAllFormats: true,
      } ),
      compress ? minify( { minify: { sourceMap: true } } ) : false,
    ]
  } );

  await bundle.write( {
    banner,
    file,
    format   : 'umd',
    name     : type === 'default' ? 'Splide' : 'SplideRenderer',
    sourcemap: compress,
  } );

  if ( compress && type === 'default' ) {
    await fs.readFile( file ).then( content => {
      return new Promise( ( resolve, reject ) => {
        zlib.gzip( content, ( err, binary ) => {
          if ( err ) {
            return reject( err );
          }

          fs.writeFile( `${ file }.gz`, binary ).then( resolve, reject );
        } );
      } );
    } );
  }
}

Promise.all( [
  buildScript(),
  buildScript( true ),
  buildScript( true, 'renderer' ),
] ).catch( e => console.error( e ) );

exports.buildJs       = () => buildScript();
exports.buildMin      = () => buildScript( true );
exports.buildRenderer = () => buildScript( true, 'renderer' );
