
var shows = exports

shows.package = function (doc, req) {
  require("monkeypatch").patch(Object, Date, Array, String)

  var semver = require("semver")
    , code = 200
    , headers = {"Content-Type":"application/json"}
    , body = null

  delete doc.ctime
  delete doc.mtime
  if (doc.versions) Object.keys(doc.versions).forEach(function (v) {
    delete doc.versions[v].ctime
    delete doc.versions[v].mtime
  })

  // legacy kludge
  if (doc.versions) for (var v in doc.versions) {
    var clean = semver.clean(v, true)
    doc.versions[v].directories = doc.versions[v].directories || {}
    if (clean !== v) {
      var p = doc.versions[v]
      delete doc.versions[v]
      p.version = v = clean
      p._id = p.name + '@' + p.version
      doc.versions[clean] = p
    }
    if (doc.versions[v].dist.tarball) {
      // if there is an attachment for this tarball, then use that.
      // make it point at THIS registry that is being requested,
      // with the full /db/_design/app/_rewrite if that is being used,
      // or just the /name if not.

      var t = doc.versions[v].dist.tarball
      t = t.replace(/^https?:\/\/[^\/:]+(:[0-9]+)?/, '')
      var f = t.match(/[^\/]+$/)[0]
      var requestedPath = req.requested_path
      if (doc._attachments && doc._attachments[f]) {
        // workaround for old couch versions that didn't
        // have requested_path
        if (requestedPath && -1 === requestedPath.indexOf('show'))
          requestedPath = requestedPath.slice(0)
        else {
          var path = req.path
          if (path) {
            var i = path.indexOf('_show')
            if (i !== -1) {
              requestedPath = path.slice(0)
              requestedPath.splice(i, i + 2, '_rewrite')
            }
          } else return {
            code : 500,
            body : JSON.stringify({error: 'bad couch'}),
            headers : headers
          }
        }

        // doc.versions[v].dist._origTarball = doc.versions[v].dist.tarball
        // doc.versions[v].dist._headers = req.headers
        // doc.versions[v].dist._query = req.query
        // doc.versions[v].dist._reqPath = req.requested_path
        // doc.versions[v].dist._path = req.path
        // doc.versions[v].dist._t = t.slice(0)

        // actual location of tarball should always be:
        // .../_rewrite/pkg/-/pkg-version.tgz
        // or: /pkg/-/pkg-version.tgz
        // depending on what requested path is.
        var tf = [doc.name, '-', t.split('/').pop()]
        var i = requestedPath.indexOf('_rewrite')
        if (i !== -1) {
          tf = requestedPath.slice(0, i + 1).concat(tf)
        }
        t = '/' + tf.join('/')
        var h = "http://" + req.headers.Host

        doc.versions[v].dist.tarball = h + t
      } else {
        doc.versions[v].dist.noattachment = true
      }
    }
  }
  if (doc["dist-tags"]) for (var tag in doc["dist-tags"]) {
    var clean = semver.clean(doc["dist-tags"][tag], true)
    if (!clean) delete doc["dist-tags"][tag]
    else doc["dist-tags"][tag] = clean
  }
  // end kludge

  if (req.query.version) {
    // could be either one!
    var ver = req.query.version
    var clean = semver.clean(ver, true)

    if (clean && clean !== ver && (clean in doc.versions))
      ver = clean

    // if not a valid version, then treat as a tag.
    if ((!(ver in doc.versions) && (ver in doc["dist-tags"]))
        || !semver.valid(ver)) {
      ver = doc["dist-tags"][ver]
    }
    body = doc.versions[ver]
    if (!body) {
      code = 404
      body = {"error" : "version not found: "+req.query.version}
    }
  } else {
    body = doc
    for (var i in body) if (i.charAt(0) === "_" && i !== "_id" && i !== "_rev" && i !== "_attachments") {
      delete body[i]
    }
    for (var i in body.time) {
      if (!body.versions[i]) delete body.time[i]
      else body.time[i] = new Date(Date.parse(body.time[i])).toISOString()
    }
  }

  body = req.query.jsonp
       ? req.query.jsonp + "(" + JSON.stringify(body) + ")"
       : toJSON(body)

  return {
    code : code,
    body : body,
    headers : headers
  }
}

