import * as plugins from './plugins.js';
import * as paths from './paths.js';
import { GitzoneConfig } from './classes.gitzoneconfig.js';

const gitzoneSmartcli = new plugins.smartcli.Smartcli();

export let run = async () => {
  const done = plugins.smartpromise.defer();

  // get packageInfo
  const projectInfo = new plugins.projectinfo.ProjectInfo(paths.packageDir);

  // check for updates
  const smartupdateInstance = new plugins.smartupdate.SmartUpdate();
  await smartupdateInstance.check(
    'gitzone',
    projectInfo.npm.version,
    'http://gitzone.gitlab.io/gitzone/changelog.html',
  );
  console.log('---------------------------------------------');
  gitzoneSmartcli.addVersion(projectInfo.npm.version);

  // ======> Standard task <======

  /**
   * standard task
   */
  gitzoneSmartcli.standardCommand().subscribe(async (argvArg) => {
    const modStandard = await import('./mod_standard/index.js');
    await modStandard.run();
  });

  // ======> Specific tasks <======

  /**
   * commit something
   */
  gitzoneSmartcli.addCommand('commit').subscribe(async (argvArg) => {
    const modCommit = await import('./mod_commit/index.js');
    await modCommit.run(argvArg);
  });

  /**
   * deprecate a package on npm
   */
  gitzoneSmartcli.addCommand('deprecate').subscribe(async (argvArg) => {
    const modDeprecate = await import('./mod_deprecate/index.js');
    await modDeprecate.run();
  });

  /**
   * docker
   */
  gitzoneSmartcli.addCommand('docker').subscribe(async (argvArg) => {
    const modDocker = await import('./mod_docker/index.js');
    await modDocker.run(argvArg);
  });

  /**
   * Update all files that comply with the gitzone standard
   */
  gitzoneSmartcli.addCommand('format').subscribe(async (argvArg) => {
    const config = GitzoneConfig.fromCwd();
    const modFormat = await import('./mod_format/index.js');
    await modFormat.run();
  });

  /**
   * run meta commands
   */
  gitzoneSmartcli.addCommand('meta').subscribe(async (argvArg) => {
    const config = GitzoneConfig.fromCwd();
    const modMeta = await import('./mod_meta/index.js');
    modMeta.run(argvArg);
  });

  /**
   * open assets
   */
  gitzoneSmartcli.addCommand('open').subscribe(async (argvArg) => {
    const modOpen = await import('./mod_open/index.js');
    modOpen.run(argvArg);
  });

  /**
   * add a readme to a project
   */
  gitzoneSmartcli.addCommand('template').subscribe(async (argvArg) => {
    const modTemplate = await import('./mod_template/index.js');
    modTemplate.run(argvArg);
  });

  /**
   * start working on a project
   */
  gitzoneSmartcli.addCommand('start').subscribe(async (argvArg) => {
    const modTemplate = await import('./mod_start/index.js');
    modTemplate.run(argvArg);
  });

  gitzoneSmartcli.addCommand('helpers').subscribe(async (argvArg) => {
    const modHelpers = await import('./mod_helpers/index.js');
    modHelpers.run(argvArg);
  });

  // start parsing of the cli
  gitzoneSmartcli.startParse();
  return await done.promise;
};