// License: LGPL-3.0-or-later
const request = require('../common/client') 
const R = require('ramda') 
const Chart = require('chart.js')
const Pikaday = require('pikaday')
const moment = require('moment')
const chartOptions = require('../components/chart-options')

var frontendFormat = 'M/D/YYYY'
var backendFormat  = 'YYYY-MM-DD'

// set the default query to get the last year of payments 
// and group them by month
var defaultParams = {
    endDate: moment().format(backendFormat)
  , startDate: moment().subtract(12, 'months').format(backendFormat)
  , timeSpan: 'month'
}

var pickadayDefaults = {format: frontendFormat, setDefaultDate: true}

appl.def('updateChartParams', function(formObj) {
  updateChart({
      endDate: moment(formObj.endDate).format(backendFormat)
    , startDate: moment(formObj.startDate).format(backendFormat)
    , timeSpan: formObj.timeSpan 
  })
})

// start date Pickaday
new Pikaday(R.merge({
    field: document.getElementById('js-paymentsChart-startDate')
  , maxDate: moment().subtract(1, 'week').toDate()
  , defaultDate: moment().subtract(1, 'years').toDate()
}, pickadayDefaults))

// end date Pickaday
new Pikaday(R.merge({
    field: document.getElementById('js-paymentsChart-endDate')
  , maxDate: moment().toDate() 
  , defaultDate: moment().toDate() 
}, pickadayDefaults))

var ctx = document.getElementById('js-paymentsChart').getContext('2d')

var chart = new Chart(ctx, {
  type: 'bar'
, options: chartOptions.dollars
, data: {labels: [], datasets: []}
})

var url = `/nonprofits/${app.nonprofit_id}/payment_history`

function updateChart(params) {
  appl.def('loading_chart', true)
  request.get(url)
    .query(params)
    .end(function(err, resp) {
      chart.data.labels   =  formatLabels(R.pluck('time_span', resp.body), params.timeSpan)
      chart.data.datasets =  formatDatasets(resp.body)
      chart.update()
      appl.def('loading_chart', false)
    })
}

function formatLabels(dates, type) {
  switch (type) {
    case "year":
      return R.map(st => moment(st).format('YYYY'), dates)
    case "month":
      return R.map(st => moment(st).format('MMM YYYY'), dates)
    case "week":
      return R.map(st => 
        `${moment(st).format('M/D/YY')} - ${moment(st).add(7, 'days').format('M/D/YY')}`
        , dates)
    default:
      return R.map(st => moment(st).format(frontendFormat), dates)
  }
}

const formatDatasets = (data) => [ 
    dataset('One time'
          , 'onetime_cents'
          , '66, 179, 223'
          , data)
  , dataset('Recurring'
          , 'recurring_cents'
          , '240, 205, 108' 
          , data)
  , dataset('Tickets'
          , 'tickets_cents'
          , '238, 132, 128' 
          , data)
  , dataset('Total'
          , 'total_cents'
          , '195, 195, 195' 
          , data)
  ]

function dataset(label, key, rgb, data) {
  return {
      label: label 
    , data: R.pluck(key, data) 
    , borderWidth: 1
    , borderColor: `rgb(${rgb})`   
    , backgroundColor: `rgba(${rgb},0.3)`
  }
}

updateChart(defaultParams)