#!/usr/bin/env node

require('batteries').extendNative()

var fs = require('fs')
  , http = require('http')
  , join = require('path').join
  , notify = require('growl').notify
  , Downloads = join(process.env.HOME, 'Downloads')
  , created = JSON.parse(process.env.WATCH_CREATED)
  , torrents = created.grep(/\.torrent$/i)
  , skipped = []
  , _log = []
  , log = function(s) { s = '>>> ' + s; _log.push(s); console.log(s) }
  , err = function(s) { s = '!!! ' + s; _log.push(s); console.error(s) }
  , writeLog = function() { fs.writeFileSync('/Users/sjs/log/yarrr.log', _log.join('\n')) }

process.on('uncaughtException', function(e) {
  err('error: ' + e)
  err('bailing')
  process.exit(1)
})

torrents.forEach(function(torrent, i) {
  log(torrent)
  var path = join(Downloads, torrent)
  try {
    fs.statSync(path)
  }
  catch (e) {
    skipped.push(torrent)
    err(path + ' does not exist, skipping')
    return
  }
  var boundary = '48940923YARRRPIRATE3890457293'
    , torrentData = fs.readFileSync(path, 'binary')
    , torrentSize = torrentData.length
    , data = [ '--' + boundary
             , 'Content-Disposition: form-data; name="torrent_file"; filename="' + torrent + '"'
             , 'Content-Type: application/x-bittorrent'
             , ''
             , torrentData
             , '--' + boundary + '--\r\n'
             ].join('\r\n')
    , opts = {
        method: 'POST',
        host: 'h.samhuri.net',
        port: 8080,
        path: '/gui/?action=add-file',
        headers: { 'Authorization': 'Basic YWRtaW46YWRtaW4='
                 , 'Content-Type': 'multipart/form-data; boundary=' + boundary
                 , 'Content-Length': data.length
                 }
      }
    , req = http.request(opts, function(res) {
        var responseData = ''
        res.on('data', function(chunk) { responseData += chunk })
        res.on('end', function() {
          if (res.statusCode === 200 && !('error' in JSON.parse(responseData))) {
            log('rm ' + path)
            fs.unlink(path)
          }
          else {
            err('error ' + res.statusCode)
            err(responseData)
          }
          if (i === torrents.length - 1) {
            var n = torrents.length - skipped.length
              , s = n === 1 ? '' : 's'
            if (n > 0) {
              notify(n + ' torrent' + s + ' → µTorrent')
            }
            //writeLog()
          }
        })
      })
  log('torrent size: ' + torrentSize)
  log('total size: ' + data.length)
  req.end(data, 'binary')
})
