import { Compiler } from 'webpack';
import { replaceExt } from '../common';
import { CSS_LANG } from '../common/css';
import { genPackageEntry } from './gen-package-entry';
import { genPacakgeStyle } from './gen-package-style';
import { genSiteMobileShared } from './gen-site-mobile-shared';
import { genSiteDesktopShared } from './gen-site-desktop-shared';
import { genStyleDepsMap } from './gen-style-deps-map';
import { PACKAGE_ENTRY_FILE, PACKAGE_STYLE_FILE } from '../common/constant';

const PLUGIN_NAME = 'VantCliSitePlugin';

export class VantCliSitePlugin {
  apply(compiler: Compiler) {
    if (process.env.NODE_ENV === 'production') {
      compiler.hooks.beforeCompile.tapPromise(PLUGIN_NAME, this.genSiteEntry);
    } else {
      compiler.hooks.watchRun.tapPromise(PLUGIN_NAME, this.genSiteEntry);
    }
  }

  genSiteEntry() {
    return new Promise((resolve, reject) => {
      genStyleDepsMap()
        .then(() => {
          genPackageEntry({
            outputPath: PACKAGE_ENTRY_FILE
          });
          genPacakgeStyle({
            outputPath: replaceExt(PACKAGE_STYLE_FILE, `.${CSS_LANG}`)
          });
          genSiteMobileShared();
          genSiteDesktopShared();
          resolve();
        })
        .catch(err => {
          console.log(err);
          reject(err);
        });
    });
  }
}
