
module.exports = unpublish

var log = require("npmlog")
  , npm = require("./npm.js")
  , registry = npm.registry
  , readJson = require("read-package-json")
  , path = require("path")

unpublish.usage = "npm unpublish <project>[@<version>]"

unpublish.completion = function (opts, cb) {
  if (opts.conf.argv.remain.length >= 3) return cb()
  var un = encodeURIComponent(npm.config.get("username"))
  if (!un) return cb()
  registry.get("/-/by-user/"+un, function (er, pkgs) {
    // do a bit of filtering at this point, so that we don't need
    // to fetch versions for more than one thing, but also don't
    // accidentally a whole project.
    pkgs = pkgs[un]
    if (!pkgs || !pkgs.length) return cb()
    var partial = opts.partialWord.split("@")
      , pp = partial.shift()
      , pv = partial.join("@")
    pkgs = pkgs.filter(function (p) {
      return p.indexOf(pp) === 0
    })
    if (pkgs.length > 1) return cb(null, pkgs)
    registry.get(pkgs[0], function (er, d) {
      if (er) return cb(er)
      var vers = Object.keys(d.versions)
      if (!vers.length) return cb(null, pkgs)
      return cb(null, vers.map(function (v) {
        return pkgs[0]+"@"+v
      }))
    })
  })
}

function unpublish (args, cb) {

  if (args.length > 1) return cb(unpublish.usage)

  var thing = args.length ? args.shift().split("@") : []
    , project = thing.shift()
    , version = thing.join("@")

  if (!version && !npm.config.get("force")) {
    return cb("Refusing to delete entire project.\n"
             +"Run with --force to do this.\n"
             +unpublish.usage)
  }

  if (!project || path.resolve(project) === npm.prefix) {
    // if there's a package.json in the current folder, then
    // read the package name and version out of that.
    var cwdJson = path.join(process.cwd(), "package.json")
    return readJson(cwdJson, function (er, data) {
      if (er && er.code !== "ENOENT" && er.code !== "ENOTDIR") return cb(er)
      if (er) return cb("Usage:\n"+unpublish.usage)
      gotProject(data.name, data.version, cb)
    })
  }
  return gotProject(project, version, cb)
}

function gotProject (project, version, cb_) {
  function cb (er) {
    if (er) return cb_(er)
    console.log("- " + project + (version ? "@" + version : ""))
    cb_()
  }

  // remove from the cache first
  npm.commands.cache(["clean", project, version], function (er) {
    if (er) {
      log.error("unpublish", "Failed to clean cache")
      return cb(er)
    }

    registry.unpublish(project, version, cb)
  })
}
