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

import { CloudlyConnector } from './connector.cloudly/cloudlyconnector';

import { NpmciInfo } from './npmci.classes.npmciinfo';
import { NpmciCli } from './npmci.classes.npmcicli';
import { NpmciConfig } from './npmci.classes.npmciconfig';

// mods
import { NpmciDockerManager } from './manager.docker';
import { NpmciGitManager } from './manager.git';
import { NpmciNodeJsManager } from './manager.nodejs';
import { NpmciNpmManager } from './manager.npm';
import { NpmciEnv } from './npmci.classes.npmcienv';

export class Npmci {
  public analytics: plugins.smartanalytics.Analytics;
  public cloudlyConnector: CloudlyConnector;

  public npmciEnv: NpmciEnv;
  public npmciInfo: NpmciInfo;
  public npmciConfig: NpmciConfig;
  public npmciCli: NpmciCli;

  // managers
  public dockerManager: NpmciDockerManager;
  public gitManager: NpmciGitManager;
  public nodejsManager: NpmciNodeJsManager;
  public npmManager: NpmciNpmManager;

  constructor() {
    this.analytics = new plugins.smartanalytics.Analytics({
      apiEndPoint: 'https://pubapi.lossless.one/analytics',
      projectId: 'gitzone',
      appName: 'npmci'
    });
    this.cloudlyConnector = new CloudlyConnector(this);
    this.npmciEnv = new NpmciEnv(this);
    this.npmciInfo = new NpmciInfo(this);
    this.npmciCli = new NpmciCli(this);
    this.npmciConfig = new NpmciConfig(this);

    // managers
    this.dockerManager = new NpmciDockerManager(this);
    this.gitManager = new NpmciGitManager(this);
    this.nodejsManager = new NpmciNodeJsManager(this);
    this.npmManager = new NpmciNpmManager(this);
  }

  public async start() {
    await this.npmciInfo.printToConsole();
    await this.npmciConfig.init();
    this.npmciCli.startParse();
  }
}