import * as plugins from './smartparcel.plugins';

export class Parcel {
  private defaultOptions: plugins.parcel.ParcelOptions = {
    outDir: plugins.path.join(process.cwd(), './dist_watch'), // The out directory to put the build files in, defaults to dist
    outFile: 'index.html', // The name of the outputFile
    publicUrl: '/', // The url to serve on, defaults to '/'
    watch: true, // Whether to watch the files and rebuild them on change, defaults to process.env.NODE_ENV !== 'production'
    cache: true, // Enabled or disables caching, defaults to true
    cacheDir: '.nogit/.parcelcache', // The directory cache gets put in, defaults to .cache
    contentHash: false, // Disable content hash from being included on the filename
    global: 'moduleName', // Expose modules as UMD under this name, disabled by default
    minify: false, // Minify files, enabled if process.env.NODE_ENV === 'production'
    scopeHoist: false, // Turn on experimental scope hoisting/tree shaking flag, for smaller production bundles
    target: 'browser', // Browser/node/electron, defaults to browser
    bundleNodeModules: true, // By default, package.json dependencies are not included when using 'node' or 'electron' with 'target' option above. Set to true to adds them to the bundle, false by default
    https: null,
    logLevel: 3, // 5 = save everything to a file, 4 = like 3, but with timestamps and additionally log http requests to dev server, 3 = log info, warnings & errors, 2 = log warnings & errors, 1 = log errors, 0 = log nothing
    hmr: true, // Enable or disable HMR while watching
    hmrPort: 3003, // The port the HMR socket runs on, defaults to a random free port (0 in node.js resolves to a random free port)
    sourceMaps: true, // Enable or disable sourcemaps, defaults to enabled (minified builds currently always create sourcemaps)
    hmrHostname: '', // A hostname for hot module reload, default to ''
    detailedReport: false, // Prints a detailed report of the bundles, assets, filesizes and times, defaults to false, reports are only printed if watch is disabled
  };
  public options: plugins.parcel.ParcelOptions;
  public entryFiles: string | string[] = plugins.path.join(process.cwd(), './html/index.html');

  /**
   * builds and serves
   */
  public async start() {
    const bundler = new plugins.parcel(this.entryFiles, this.options);

    // Run the bundler, this returns the main bundle
    // Use the events if you're using watch mode as this promise will only trigger once and not for every rebuild
    const bundle = await bundler.serve(3002);
  }

  /**
   * just builds
   */
  public async build() {
    const bundler = new plugins.parcel(this.entryFiles, {
      ...this.options,
      watch: false
    });

    // Run the bundler, this returns the main bundle
    // Use the events if you're using watch mode as this promise will only trigger once and not for every rebuild
    const bundle = await bundler.bundle().catch(e => {
      console.error(e);
      throw e;
    });
    
  }

  constructor(fromArg: string | string[], outputDirArg: string, outputFileArg: string) {
    this.entryFiles = fromArg;
    this.options = {
      ...this.defaultOptions,
      outDir: outputDirArg,
      outFile: outputFileArg,
    };
  }
}
