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

import { logger } from './npmci.logging.js';
import { Npmci } from './npmci.classes.npmci.js';

/**
 * the main config interface for npmci
 */
export interface INpmciOptions {
  projectInfo: plugins.projectinfo.ProjectInfo;

  // npm
  npmGlobalTools: string[];
  npmAccessLevel?: 'private' | 'public';
  npmRegistryUrl: string;

  // docker
  dockerRegistries: string[];
  dockerRegistryRepoMap: { [key: string]: string };
  dockerBuildargEnvMap: { [key: string]: string };

  // gitlab
  gitlabRunnerTags: string[];

  // urls
  urlCloudly: string;

  // cloudron
  cloudronAppName?: string;
}

/**
 * a config class for Npmci
 */
export class NpmciConfig {
  public npmciRef: Npmci;

  public npmciNpmextra: plugins.npmextra.Npmextra;
  public kvStorage: plugins.npmextra.KeyValueStore;
  public npmciQenv: plugins.qenv.Qenv;

  private configObject: INpmciOptions;

  constructor(npmciRefArg: Npmci) {
    this.npmciRef = npmciRefArg;
  }

  public async init() {
    this.npmciNpmextra = new plugins.npmextra.Npmextra(paths.cwd);
    this.kvStorage = new plugins.npmextra.KeyValueStore({
      typeArg: 'userHomeDir',
      identityArg: `.npmci_${this.npmciRef.npmciEnv.repo.user}_${this.npmciRef.npmciEnv.repo.repo}`,
    });
    this.npmciQenv = new plugins.qenv.Qenv(
      paths.NpmciProjectDir,
      paths.NpmciProjectNogitDir,
      false
    );

    this.configObject = {
      projectInfo: new plugins.projectinfo.ProjectInfo(paths.cwd),
      npmGlobalTools: [],
      dockerRegistries: [],
      dockerRegistryRepoMap: {},
      npmAccessLevel: 'private',
      npmRegistryUrl: 'registry.npmjs.org',
      gitlabRunnerTags: [],
      dockerBuildargEnvMap: {},
      urlCloudly: await this.npmciQenv.getEnvVarOnDemand('NPMCI_URL_CLOUDLY'),
    };
    this.configObject = this.npmciNpmextra.dataFor<INpmciOptions>('npmci', this.configObject);
  }

  public getConfig(): INpmciOptions {
    return this.configObject;
  }
}