tree = require('../states/appState')
reqwest = require('reqwest')
moment = require('moment')
JSZip = require('jszip')
Q = require('q')
saveAs = require('filesaver.js').saveAs

reportsState = tree.select('reports')

downloadFile = (url) ->
  defer = Q.defer()
  xhr = new XMLHttpRequest()
  xhr.open('GET', url, true)
  xhr.responseType = 'arraybuffer'
  xhr.onreadystatechange = ->
    if xhr.readyState == 4
      if xhr.status < 400
        defer.resolve(xhr.response)
      else
        defer.reject(new Error("Failed to load file from server"))
  xhr.send()

  return defer.promise

actions =
  initializeGrid: ->
    #pull all reports
    reqwest
      url: "/dashboard/get-reports/"
    .then (reportList) ->
      reportsState.select("reportList").set(reportList)
      displayedIds = []
      #add a day to end to be inclusive
      end_date = moment(reportsState.select('end_date').get()).add(1, 'days')
      start_date = reportsState.select('start_date').get()
      for report in reportList
        reportStart = moment(report.start, "X")
        if reportStart.isBetween(start_date, end_date)
          displayedIds.push(report.id)
      reportsState.select('displayedIds').set(displayedIds)
  changeRange: (type, date) ->
    if type == 'start'
      end_date = reportsState.select('end_date').get()
      if moment(date).isBefore(end_date)
        reportsState.select('start_date').set(date)
    else
      start_date = reportsState.select('start_date').get()
      if moment(date).isAfter(start_date)
        reportsState.select('end_date').set(date)
    tree.commit()
    displayedIds = []
    reportList = reportsState.select('reportList').get()
    #add a day to end to be inclusive
    end_date = moment(reportsState.select('end_date').get()).add(1, 'days')
    start_date = reportsState.select('start_date').get()
    for report in reportList
      reportStart = moment(report.start, "X")
      if reportStart.isBetween(start_date, end_date)
        displayedIds.push(report.id)
      else
        #if not displayed, deselect
        reportsState
          .select('reportList', {id: report.id}, 'selected')
          .set(false)
    reportsState.select('displayedIds').set(displayedIds)
  setSelected: (payload) ->
    selected_cursor = reportsState.select(
      'reportList', {id: payload}, 'selected'
    )
    num_selected_cursor = reportsState.select('num_selected')
    num_selected = num_selected_cursor.get()
    previousState = selected_cursor.get()
    selected_cursor.set(!previousState)
    if !previousState == true
      num_selected_cursor.set(++num_selected)
    else
      num_selected_cursor.set(--num_selected)
  export: ->
    zip = new JSZip()
    selected = reportsState.select('selected').get()
    filepaths = []
    for report in selected
      filepaths.push({
        filename: "#{report.type}-report-#{moment(report.start, 'X').format('M-D-YYYY')}.pdf"
        url: "/reports/download/#{report.uuid}/"
      })
    filepaths.reduce((p, o) ->
      return p.then( ->
        return downloadFile(o.url).then((arrayBuffer) ->
          zip.file(o.filename, arrayBuffer)
        )
      )
    , Q()).then( ->
      blob = zip.generate({type:"blob"})
      download = 'report.zip'
      href = window.URL.createObjectURL(blob)
      filesaver = saveAs(blob, download)
    )
  expandReport: (payload) ->
    reportsState.select('expanded').set(payload)
    reportsState.select('current_page').set(1)
    tree.commit()
    if reportsState.get('current_report').comments == 'NA'
      reportsState.select('max_pages').set(5)
    else
      reportsState.select('max_pages').set(6)
  closeExpanded: ->
    reportsState.select('expanded').set(false)
  pageChange: (payload) ->
    reportsState.select('current_page').set(payload)
      
module.exports = actions
