#!/usr/bin/env coffee

fs = require('fs')
request = require('request')
program = require('commander')
async = require('async')
_ = require('lodash')

program
  .version('0.0.1')
  .usage('-m [manga ex. bleach] -v [volume ex. 30] -e [episode ex. 268]')
  .option('-m, --manga <value>', 'Specify manga, currently available are [bleach, sk, sk-f, nisekoi]')
  .option('-v, --volume <n>', 'Specify volume')
  .option('-e, --episode <n>', 'Specify episode')
  .option('-n, --amount [n]', 'Specify amount (optional)')
  .parse(process.argv)

##############################################################################
# Image Downloading Functions
##############################################################################

downloadEp = (vol, ep) ->
  now = new Date()
  pageAmount = program.amount || switch program.manga
    when 'sk-f' then 50
    when 'nisekoi' then 60
    else 30

  for i in [0..pageAmount]
    do (i) ->
      fileName = "#{String('00' + i).slice(-2)}.jpg"

      uri = switch program.manga
        when 'bleach'  then "http://mangafox.me/manga/bleach/v#{String('00' + vol).slice(-2)}/c#{String('000' + ep).slice(-3)}/#{i}.html"
        when 'sk'      then "http://www.mangahere.com/manga/shaman_king/v#{vol}/c#{ep}/#{i}.html"
        when 'sk-f'    then "http://www.mangahere.com/manga/shaman_king_flowers/c#{String('000' + ep).slice(-3)}/#{i}.html"
        when 'nisekoi' then "http://www.mangahere.com/manga/nisekoi_komi_naoshi/c#{String('000' + ep).slice(-3)}/#{i}.html"

      request uri: uri, followRedirect: false, (err, res, body) ->
        if !err and res.statusCode == 200
          unless fs.existsSync("manga")
            fs.mkdirSync("manga")
          unless fs.existsSync("manga/#{program.manga}")
            fs.mkdirSync("manga/#{program.manga}")
          unless fs.existsSync("manga/#{program.manga}/#{vol}-#{ep}")
            fs.mkdirSync("manga/#{program.manga}/#{vol}-#{ep}")

          pattern = switch program.manga
            when 'bleach' then      /http:\/\/z.mfcdn.net\/store\/manga\/9\/.+\/compressed\/.+\.jpg"/
            when 'sk'     then     /http:\/\/z.mhcdn.net\/store\/manga\/65\/.+\/compressed\/.+\.jpg/
            when 'sk-f'   then   /http:\/\/z.mhcdn.net\/store\/manga\/6712\/.+\/compressed\/.+\.jpg/
            when 'nisekoi' then  /http:\/\/z.mhcdn.net\/store\/manga\/8945\/.+\/compressed\/.+\.jpg/

          if img = body.match pattern
            img_uri = img[0]
            img_uri = img_uri.slice(0, -1) if img_uri.match /"$/ # Remove trailing `"`

            request.head img_uri, (err2, res2, body2) ->
              if res2.headers['content-type'] is 'image/jpeg'
                console.log "Downloading #{fileName}"

                nowOffset = new Date(now.setMinutes(i))
                filePath = "manga/#{program.manga}/#{vol}-#{ep}/#{fileName}"

                request(uri: img_uri, timeout: 120 * 1000)
                  .pipe fs.createWriteStream(filePath)
                  .on 'finish', -> fs.utimesSync filePath, nowOffset, nowOffset

##############################################################################
# App Kickoff!
##############################################################################

if program.manga and program.volume and program.episode
  downloadEp(program.volume, program.episode)
else
  console.log 'Error: please specify manga, volume and episode'
