import * as plugins from './mod.plugins'
import { bash } from '../npmci.bash'
import * as NpmciEnv from '../npmci.env'

import * as npmciMods from '../npmci.mods'

// import interfaces
import { Dockerfile } from '../mod_docker/index'


/**
 * type of supported services
 */
export type TPubService = 'npm' | 'docker'

/**
 * the main exported publish function.
 * @param pubServiceArg references targeted service to publish to 
 */
export let publish = async (pubServiceArg: TPubService = 'npm') => {
  switch (pubServiceArg) {
    case 'npm':
      return await publishNpm()
    case 'docker':
      return await publishDocker()
  }
}

/**
 * tries to publish current cwd to NPM registry
 */
let publishNpm = async () => {
  let modPrepare = await npmciMods.modPrepare.load()
  await modPrepare.prepare('npm')
  await bash('npm publish')
  plugins.beautylog.ok('Done!')
}

/**
 * tries to publish current cwd to Docker registry
 */
let publishDocker = async () => {
  let modDocker = await npmciMods.modDocker.load()
  return await modDocker.readDockerfiles()
    .then(modDocker.pullDockerfileImages)
    .then(modDocker.pushDockerfiles)
    .then(dockerfileArray => {
      return dockerfileArray
    })
}