
var views = module.exports = exports = {}

views.noCDN = { map: function (doc) {
  if (!doc.versions || Object.keys(doc.versions).length === 0)
    return
  Object.keys(doc.versions).forEach(function(v) {
    if (doc.versions[v].dist.cdn)
      return
    emit([doc._id, v], 1)
  })
}, reduce: "_sum" }

views.updated = {map: function (doc) {
  var l = doc["dist-tags"].latest
    , t = doc.time && doc.time[l]
  if (t) emit(t, 1)
}}

views.listAll = {
  map : function (doc) { return emit(doc._id, doc) }
}

views.allVersions = { map: function(doc) {
  if (!doc || !doc.versions)
    return
  for (var i in doc.versions)
    emit([i, doc._id], 1)
}, reduce: "_sum" }

views.modified = { map: modifiedTimeMap }
function modifiedTimeMap (doc) {
  if (!doc.versions || doc.deprecated) return
  if (doc._id.match(/^npm-test-.+$/) &&
      doc.maintainers &&
      doc.maintainers[0].name === 'isaacs')
    return
  var latest = doc["dist-tags"].latest
  if (!doc.versions[latest]) return
  var time = doc.time && doc.time[latest] || 0
  var t = new Date(time)
  emit(t.getTime(), doc)
}

views.modifiedPackage = { map: function (doc) {
  if (!doc.versions || doc.deprecated) return
  if (doc._id.match(/^npm-test-.+$/) &&
      doc.maintainers &&
      doc.maintainers[0].name === 'isaacs')
    return
  var latest = doc["dist-tags"].latest
  if (!doc.versions[latest]) return
  var time = doc.time && doc.time[latest] || 0
  var t = new Date(time)
  emit([doc._id, t.getTime()], doc)
}}


views.noShasum = { map: function (doc) {
  if (!doc || !doc.versions)
    return

  for (var ver in doc.versions) {
    var version = doc.versions[ver]
    if (!version || !version.dist || !version.dist.shasum) {
      emit([doc.name, ver, !!version, !!version.dist, !!version.shasum], 1)
    }
  }
}, reduce: "_sum" }

views.byEngine = {
  map: function (doc) {
    if (!doc || !doc.versions || !doc["dist-tags"] || doc.deprecated) return
    if (doc._id.match(/^npm-test-.+$/) &&
        doc.maintainers &&
        doc.maintainers[0].name === 'isaacs')
      return
    var v = doc["dist-tags"].latest
    var d = doc.versions[v]
    if (d && d.engines) emit(doc._id, [d.engines, doc.maintainers])
  }
}

views.countVersions = { map: function (doc) {
  if (!doc || !doc.name || doc.deprecated) return
  if (doc._id.match(/^npm-test-.+$/) &&
      doc.maintainers &&
      doc.maintainers[0].name === 'isaacs')
    return
  var i = 0
  if (!doc.versions) return emit([i, doc._id], 1)
  for (var v in doc.versions) i++
  emit([i, doc._id], 1)
}, reduce: "_sum"}

views.byKeyword = {
  map: function (doc) {
    if (!doc || !doc.versions || !doc['dist-tags'] || doc.deprecated) return
    if (doc._id.match(/^npm-test-.+$/) &&
        doc.maintainers &&
        doc.maintainers[0].name === 'isaacs')
      return
    var v = doc.versions[doc['dist-tags'].latest]
    if (!v || !v.keywords || !Array.isArray(v.keywords)) return
    v.keywords.forEach(function (kw) {
      emit([kw.toLowerCase(), doc.name, doc.description], 1)
    })
  }, reduce: "_sum"
}


views.byField = {
  map: function (doc) {
    if (!doc || !doc.versions || !doc["dist-tags"]) return
    if (doc._id.match(/^npm-test-.+$/) &&
        doc.maintainers &&
        doc.maintainers[0].name === 'isaacs')
      return
    var v = doc["dist-tags"].latest
    //Object.keys(doc.versions).forEach(function (v) {
      var d = doc.versions[v]
      if (!d) return
      //emit(d.name + "@" + d.version, d.dist.bin || {})
      var out = {}
      for (var i in d) {
        out[i] = d[i] //true
        if (d[i] && typeof d[i] === "object" &&
            (i === "scripts" || i === "directories")) {
          for (var j in d[i]) out[i + "." + j] = d[i][j]
        }
      }
      out.maintainers = doc.maintainers
      emit(doc._id, out)
    //})
  }
}

views.needBuild = {
  map : function (doc) {

    if (!doc || !doc.versions || !doc["dist-tags"]) return
    if (doc._id.match(/^npm-test-.+$/) &&
        doc.maintainers &&
        doc.maintainers[0].name === 'isaacs')
      return
    var v = doc["dist-tags"].latest
    //Object.keys(doc.versions).forEach(function (v) {
      var d = doc.versions[v]
      if (!d) return
      if (!d.scripts) return
      var inst =  d.scripts.install
               || d.scripts.preinstall
               || d.scripts.postinstall
      if (!inst) return
      //emit(d.name + "@" + d.version, d.dist.bin || {})
      emit(d._id, d.dist.bin || {})
    //})
  }
}

views.scripts = {
  map : function (doc) {
    if (!doc || !doc.versions || !doc["dist-tags"]) return
    if (doc._id.match(/^npm-test-.+$/) &&
        doc.maintainers &&
        doc.maintainers[0].name === 'isaacs')
      return
    var v = doc["dist-tags"].latest
    v = doc.versions[v]
    if (!v || !v.scripts) return
    var out = {}
    var any = false
    for (var i in v.scripts) {
      out[i] = v.scripts[i]
      any = true
    }
    if (!any) return
    out.maintainers = doc.maintainers
    emit(doc._id, out)
  }
}

views.nodeWafInstall = {
  map : function (doc) {
    if (!doc || !doc.versions || !doc["dist-tags"]) return
    if (doc._id.match(/^npm-test-.+$/) &&
        doc.maintainers &&
        doc.maintainers[0].name === 'isaacs')
      return
    var v = doc["dist-tags"].latest
    if (!doc.versions[v]) return
    if (!doc.versions[v].scripts) return
    for (var i in doc.versions[v].scripts) {
      if (doc.versions[v].scripts[i].indexOf("node-waf") !== -1 ||
          doc.versions[v].scripts[i].indexOf("make") !== -1) {
        emit(doc._id, doc.versions[v]._id)
        return
      }
    }
  }
}

views.badBins = {
  map : function (doc) {
    if (!doc || !doc.versions || !doc["dist-tags"]) return
    if (doc._id.match(/^npm-test-.+$/) &&
        doc.maintainers &&
        doc.maintainers[0].name === 'isaacs')
      return
    var v = doc["dist-tags"].latest
    if (!doc.versions[v]) return
    v = doc.versions[v]
    var b = v.bin
      , d = v.directories && v.directories.bin
    if (!b && !d) return
    if (b && (typeof b === "string" || Object.keys(b).length === 1)) {
      // it's ok.
      return
    }
    emit(doc._id, {binHash:b, binDir:d})
  }
}


views.orphanAttachments = {
  map : function (doc) {
    if (!doc || !doc._attachments) return
    var orphans = []
      , size = 0
    for (var i in doc._attachments) {
      var n = i.substr(doc._id.length + 1).replace(/\.tgz$/, "")
               .replace(/^v/, "")
      if (!doc.versions[n] && i.match(/\.tgz$/)) {
        orphans.push(i)
        size += doc._attachments[i].length
      }
    }
    if (orphans.length) emit(doc._id, {size:size, orphans:orphans})
  }
}

views.starredByUser = { map : function (doc) {
  if (!doc || !doc.users) return
  if (doc._id.match(/^npm-test-.+$/) && doc.maintainers[0].name === 'isaacs')
    return
  Object.keys(doc.users).forEach(function (m) {
    if (!doc.users[m]) return
    emit(m, doc._id)
  })
}}

views.starredByPackage = { map : function (doc) {
  if (!doc || !doc.users) return
  if (doc._id.match(/^npm-test-.+$/) &&
      doc.maintainers &&
      doc.maintainers[0].name === 'isaacs')
    return
  Object.keys(doc.users).forEach(function (m) {
    if (!doc.users[m]) return
    emit(doc._id, m)
  })
}}

views.byUser = { map : function (doc) {
  if (!doc || !doc.maintainers) return
  if (doc._id.match(/^npm-test-.+$/) &&
      doc.maintainers &&
      doc.maintainers[0].name === 'isaacs')
    return
  doc.maintainers.forEach(function (m) {
    emit(m.name, doc._id)
  })
}}



views.browseAuthorsRecent = { map: function (doc) {
  if (!doc || !doc.maintainers || doc.deprecated) return
  if (doc._id.match(/^npm-test-.+$/) &&
      doc.maintainers &&
      doc.maintainers[0].name === 'isaacs')
    return
  var l = doc['dist-tags'] && doc['dist-tags'].latest
  l = l && doc.versions && doc.versions[l]
  if (!l) return
  var t = doc.time && doc.time[l.version]
  if (!t) return
  var desc = doc.description || l.description || ''
  var readme = doc.readme || l.readme || ''
  doc.maintainers.forEach(function (m) {
    // Have to sum it up by the author name in the app.
    // couchdb makes me sad sometimes.
    emit([t, m.name, doc._id, desc, readme], 1)
  })
}, reduce: "_sum" }

views.browseAuthors = views.npmTop = { map: function (doc) {
  if (!doc || !doc.maintainers || doc.deprecated) return
  if (doc._id.match(/^npm-test-.+$/) &&
      doc.maintainers &&
      doc.maintainers[0].name === 'isaacs')
    return
  var l = doc['dist-tags'] && doc['dist-tags'].latest
  l = l && doc.versions && doc.versions[l]
  if (!l) return
  var t = doc.time && doc.time[l.version]
  if (!t) return
  var desc = doc.description || l.description || ''
  var readme = doc.readme || l.readme || ''
  doc.maintainers.forEach(function (m) {
    emit([m.name, doc._id, desc, t, readme], 1)
  })
}, reduce: "_sum" }

views.browseUpdated = { map: function (doc) {
  if (!doc || !doc.versions || doc.deprecated) return
  if (doc._id.match(/^npm-test-.+$/) &&
      doc.maintainers &&
      doc.maintainers[0].name === 'isaacs')
    return
  var l = doc['dist-tags'] && doc['dist-tags'].latest
  if (!l) return
  var t = doc.time && doc.time[l]
  if (!t) return
  var v = doc.versions[l]
  if (!v) return
  var d = new Date(t)
  if (!d.getTime()) return
  emit([ d.toISOString(),
         doc._id,
         v.description,
         v.readme ], 1)
}, reduce: "_sum" }

views.browseAll = { map: function (doc) {
  if (!doc || !doc.versions || doc.deprecated) return
  if (doc._id.match(/^npm-test-.+$/) &&
      doc.maintainers &&
      doc.maintainers[0].name === 'isaacs')
    return
  var l = doc['dist-tags'] && doc['dist-tags'].latest
  if (!l) return
  l = doc.versions && doc.versions[l]
  if (!l) return
  var desc = doc.description || l.description || ''
  var readme = doc.readme || l.readme || ''
  emit([doc.name, desc, readme], 1)
}, reduce: '_sum' }

views.analytics = { map: function (doc) {
  if (!doc || !doc.time || doc.deprecated) return
  if (doc._id.match(/^npm-test-.+$/) &&
      doc.maintainers &&
      doc.maintainers[0].name === 'isaacs')
    return
  for (var i in doc.time) {
    var t = doc.time[i]
    var d = new Date(t)
    if (!d.getTime()) return
    var type = i === 'modified' ? 'latest'
             : i === 'created' ? 'created'
             : 'update'
    emit([ type,
           d.getUTCFullYear(),
           d.getUTCMonth() + 1,
           d.getUTCDate(),
           doc._id ], 1)
  }
}, reduce: '_sum' }

views.dependedUpon = { map: function (doc) {
  if (!doc || doc.deprecated) return
  if (doc._id.match(/^npm-test-.+$/) &&
      doc.maintainers &&
      doc.maintainers[0].name === 'isaacs')
    return
  var l = doc['dist-tags'] && doc['dist-tags'].latest
  if (!l) return
  l = doc.versions && doc.versions[l]
  if (!l) return
  var desc = doc.description || l.description || ''
  var readme = doc.readme || l.readme || ''
  var d = l.dependencies
  if (!d) return
  for (var dep in d) {
    emit([dep, doc._id, desc, readme], 1)
  }
}, reduce: '_sum' }

views.dependentVersions = { map: function (doc) {
  if (!doc || doc.deprecated) return
  if (doc._id.match(/^npm-test-.+$/) &&
      doc.maintainers &&
      doc.maintainers[0].name === 'isaacs')
    return
  var l = doc['dist-tags'] && doc['dist-tags'].latest
  if (!l) return
  l = doc.versions && doc.versions[l]
  if (!l) return
  var deps = l.dependencies
  if (!deps) return
  for (var dep in deps)
    emit([dep, deps[dep], doc._id], 1)
}, reduce: '_sum' }

views.browseStarUser = { map: function (doc) {
  if (!doc) return
  if (doc._id.match(/^npm-test-.+$/) &&
      doc.maintainers &&
      doc.maintainers[0].name === 'isaacs')
    return
  var l = doc['dist-tags'] && doc['dist-tags'].latest
  if (!l) return
  l = doc.versions && doc.versions[l]
  if (!l) return
  var desc = doc.description || l.description || ''
  var readme = doc.readme || l.readme || ''
  var d = doc.users
  if (!d) return
  for (var user in d) {
    emit([user, doc._id, desc, readme], 1)
  }
}, reduce: '_sum' }

views.browseStarPackage = { map: function (doc) {
  if (!doc || doc.deprecated) return
  if (doc._id.match(/^npm-test-.+$/) &&
      doc.maintainers &&
      doc.maintainers[0].name === 'isaacs')
    return
  var l = doc['dist-tags'] && doc['dist-tags'].latest
  if (!l) return
  l = doc.versions && doc.versions[l]
  if (!l) return
  var desc = doc.description || l.description || ''
  var readme = doc.readme || l.readme || ''
  var d = doc.users
  if (!d) return
  for (var user in d) {
    emit([doc._id, desc, user, readme], 1)
  }
}, reduce: '_sum' }


views.fieldsInUse = { map : function (doc) {
  if (!doc.versions || !doc["dist-tags"] || !doc["dist-tags"].latest || doc.deprecated) {
    return
  }
  if (doc._id.match(/^npm-test-.+$/) &&
      doc.maintainers &&
      doc.maintainers[0].name === 'isaacs')
    return
  var d = doc.versions[doc["dist-tags"].latest]
  if (!d) return
  for (var f in d) {
    emit(f, 1)
    if (d[f] && typeof d[f] === "object" &&
        (f === "scripts" || f === "directories")) {
      for (var i in d[f]) emit(f+"."+i, 1)
    }
  }
} , reduce : "_sum" }

views.howBigIsYourPackage = {
  map : function (doc) {
    if (!doc) return
    if (doc._id.match(/^npm-test-.+$/) &&
        doc.maintainers &&
        doc.maintainers[0].name === 'isaacs')
      return
    var s = 0
      , c = 0
    for (var i in doc._attachments) {
      s += doc._attachments[i].length
      c ++
    }
    if (s === 0) return
    emit(doc._id, {_id: doc._id, size: s, count: c, avg: s/c})
  }
}
